Linux машина в домене Windows AD с помощью sssd и krb5

Была необходимость ввести в домен Windows машину с Ubuntu. Для этих целей обычно используют Samba и Winbind. Но возможен альтернативный вариант с sssd, краткое руководство по нему ниже.

Для примера будем использовать:

Домен = contoso.com
Контроллер домена = dc.contoso.com

Запускаем терминал Ubuntu:

1. Переключаемся под рута

sudo -i

2. Устанавливаем необходимые пакеты

apt install sssd heimdal-clients msktutil

3. Редактируем /etc/krb5.conf, в качестве отступов используется табуляция

[libdefaults]
	default_realm = CONTOSO.COM

[realms]
	CONTOSO.COM = {
		kdc = DC 
		admin_server = dc.contoso.com
		default_domain = contoso.com
	}

[login]
	krb4_convert = true
	krb4_get_tickets = false
	
[domain_realm]
        .contoso.com = CONTOSO.COM
        contoso.com = CONTOSO.COM

4. Редактируем файл /etc/hosts, указываем FQDN для данного хоста:

127.0.0.1       localhost
127.0.1.1       <hostname>.contoso.com  <hostname>

5. Пробуем получить Kerberos ticket от имени администратора домена:

root@ubuntu:~# kinit YourDomainAdmin
YourDomainAdmin@CONTOSO.COM's Password:

Проверяем:

root@ubuntu:~# klist
Credentials cache: FILE:/tmp/krb5cc_0
        Principal: YourDomainAdmin@CONTOSO.COM

  Issued                Expires               Principal
Dec  1 15:08:27 2018  Dec  2 01:08:22 2018  krbtgt/CONTOSO.COM@CONTOSO.COM

Если тикет получен успешно, то теперь можно сгенерировать Kerberos principals для данного хоста, регистр важен:

msktutil -c -b 'CN=YourComputersOU' -s HOST/HOSTNAME.contoso.com -k /etc/sssd/HOSTNAME.keytab --computer-name HOSTNAME --upn HOSTNAME$ --server dc.contoso.com —user-creds-only

msktutil -c -b 'CN=YourComputersOU' -s HOST/HOSTNAME -k /etc/sssd/HOSTNAME.keytab --computer-name HOSTNAME --upn HOSTNAME$ --server dc.contoso.com --user-creds-only

Сейчас наш хост должен отобразиться в списке компьютеров в каталоге. Если все так — удаляем полученный Kerberos ticket:

kdestroy

6. Создаем файл /etc/sssd/sssd.conf со следующим содержимым:

[sssd]

services = nss, pam
config_file_version = 2
domains = contoso.com


[nss]

entry_negative_timeout = 0
debug_level = 3


[pam]

debug_level = 3


[domain/contoso.com]

debug_level = 3

ad_domain = contoso.com
ad_server = dc.contoso.com
enumerate = false

id_provider = ad
auth_provider = ad
chpass_provider = ad
access_provider = simple
simple_allow_groups = users #каким группам разрешено логиниться, через запятую. Есть ограничение — названия групп должны быть с маленькой буквы.
ldap_schema = ad
ldap_id_mapping = true
fallback_homedir = /home/%u
default_shell = /bin/bash
ldap_sasl_mech = gssapi
ldap_sasl_authid = <HOSTNAME>$
ldap_krb5_init_creds = true
krb5_keytab = /etc/sssd/<HOSTNAME>.keytab

Описание параметров конфигфайла sssd можно посмотреть тут

Устанавливаем права доступа для файла sssd.conf:

chmod 600 /etc/sssd/sssd.conf

Перезапускаем SSSD service

service sssd restart

7. Редактируем настройки PAM

Плохое решение:

редактируем файл /etc/pam.d/common-session, после строки

session required        pam_unix.so

добавляем строку

session required pam_mkhomedir.so skel=/etc/skel umask=0022

Хорошее решение:

переопределить параметры через системные настройки PAM, вызываем

pam-auth-update

и отмечаем пункты sss auth и makehomdir. Это автоматически добавит
строчку выше в common-session и она не будет перезатерта при обновлении системы.

Теперь мы можем логиниться на машине доменными пользователями, которым разрешен вход.

P.S.: Можно дать права на использование sudo доменным группам. Используя visudo, редактируем файл /etc/sudoers, или лучше, как рекомендует maxzhurkin и iluvar, создаем новый файл в /etc/sudoers.d/ и редактируем его

visudo -f /etc/sudoers.d/ваш_файл

добавляем требуемую группу — например, Domain Admins (если в названии группы есть пробелы — их необходимо экранировать):

%Domain\ Admins ALL=(ALL) ALL


P.S.S.: Спасибо gotch за информацию о realmd. Очень удобно — если не нужны специфические настройки, то ввод машины в домен занимает, по сути, три команды:
1. Устанавливаем нужные пакеты:
sudo apt install realmd samba-common-bin samba-libs sssd-tools krb5-user adcli

2. Проверяем, что наш домен виден в сети:
realm discover contoso.com

3. Вводим машину в домен:
sudo realm --verbose join contoso.com -U YourDomainAdmin

4. Редактируем настройки PAM
sudo pam-auth-update

Дополнительный плюс данного варианта — сквозная авторизация на файловых ресурсах домена.
Share post

Comments 29

    0
    Скажите, а с какой практической целью вы добавляете Linux машины в AD?
    Групповых политик нет — т.е. управлять данной машиной на ровне с Windows не получится.
    Аутентификация на самой машине — ну Ok. Можете ли вы прозрачно аутентифицироваться на других машинах (на самом деле не знаю и хочу узнать)? Имеете ли доступ к DFS?
      0
      На других… Если вы имеете в виду Linux машины которые в домене, то да. Можно ходить прозрачно, но надо покрутить параметр GSSAPI.
        +1
        У нас на работе применяют для того, чтобы не вводить пароль для расшаренных папок. Ссылки вида smb://filesrap при наличии у пользователя необходимых прав открываются сразу.
          0
          Да, основная цель — аутентификация пользователей на машине. При логине пользователя, в отличии от Windows, для него не генерируется Kerberos tiket, и я не знаю, есть ли дополнительный механизм для этого, поэтому у пользователя прозрачного доступа к общим файловым ресурсам домена не будет. Возможно, такой доступ можно реализовать с помощью дополнительной настройки, но так как задачи такой не было, я данным вопросом не занимался.
          PS Проще прощения, не обновил страницу — не видел, что выше уже ответили.
            0
            Я использовал доменную аутентификацию через pam_sssd для авторизации пользователей на локальном RADIUS-сервере. Машина в домене ходила под своей учеткой в домен, чтобы проверять атрибуты пользователей.
            –1
            Как все интуитивно-понятно и это при том, что в SUSE — ввод машины в домен существует «исскаропки» уже лет 10-15.
            (у вас в начале текста contoso.com потом contoso.domain)
              0
              (у вас в начале текста contoso.com потом contoso.domain)

              Спасибо, исправил.
              0
              Для того что бы sudo работало корректно нужно добавить
              [sssd]
              services = nss, pam, sudo

              у меня на CentOS так
                0
                Про CentOS не могу комментировать — не знаю, но в Ubuntu c 16.04 и выше корректно работает без указания sudo.
                0
                Название не совсем корректное. Для rhel based дистрибутивов все делается куда проще, через authconfig.
                  0
                  Не имел опыта работы с rhel based дистрибутивами, не могу ничего сказать. Исходя из того, что sssd — это продукт red hat, то вполне логично, что у них есть дополнительный инструмент для настройки.
                    +1
                    … вместо которого RedHat говорит использовать realmd
                    +1
                    Редактируем файл /etc/sudoers


                    Лучше добавить — «используя visudo»
                      +1
                      Согласен, добавил.
                        0
                        А еще лучше создать новый файл в /etc/sudoers.d/ и ничего не править кроме этого файла
                          0
                          Файлы в /etc/sudoers.d/ правятся по тем же правилам, что и /etc/sudoers:

                          visudo -f /etc/sudoers.d/ваш_файл


                          Просто так править файлы в /etc/sudoers.d/ не стоит
                            0
                            А я и не говорил о правке существующих файлов — только о создании новых
                        0
                        Спасибо за интересное описание.
                        Меня сейчас интересует авторизация с использованием AD учетных данных в CentOS 6.10. Так как там пока отсутствует realmd.
                        Возможна ли замена heimdal-client на пакет krb5-workstation?
                          0
                          Точно не могу сказать, не работал с CentOS. Судя по описанию krb5-workstation, основной функционал в нем реализован (kinit, klist, kdestroy, kpasswd), так что возможно будет работать — нужно пробовать.
                          0
                          Приветствую. Помогите пожалуйста с проблемой по этой статье, делаю так:
                          msktutil -c -b 'CN=Computers,DC=DOM,DC=local' -s HOST/testhost.DOM.local -k /etc/sssd/test.keytab --computer-name TESTHOST --upn TESTHOST$ --server domserv.dom.local --user-creds-only
                          Выдает ошибку:
                          Error: ldap_add_ext_s failed (No such object)
                          additional info: 0000208D: NameErr: DSID-03100238, problem 2001 (NO_OBJECT), data 0, best match of:
                          'DC=DOM,DC=local'
                          Но если машину через самбу ввести в домен, то команда проходит нормально. Что я делаю не так?
                          Системы: Centos 7.5, Ubuntu 1810 (AD — Win2012R2)
                            0
                            Судя по логу, если я не ошибаюсь, вы пытаетесь добавить машину в несуществующий OU — попробуйте указать только CN=Computers, это стандартный OU для компьютеров в Windows AD.
                              0
                              Спасибо! Да, так и есть, нужно было указать только CN=Computers, а не целиком путь, но и совсем без указания BASE работает.
                                0
                                Да, это значение данного параметра по умолчанию. Если вам надо сразу поместить ваш хост в определенный OU, можно указать его. Например, указание '-b OU = Unix', для компьютера с именем SERVER, в домене example.com создаст учетную запись компьютера по следующему пути LDAP: CN = SERVER, OU = Unix, DC = EXAMPLE, DC = COM.
                                Эту опцию также можно определить, задав для переменной среды MSKTUTIL_LDAP_BASE требуемое вам значение.
                            0
                            есть способ проще (использует, например, VMware для vSphere) — PowerBroker Identity Services (PBIS)
                            очень удобная утилита. GSSAPI — SMB все прикручивается практически нативно…
                              0
                              На счет PBIS ничего сказать не могу, не пробовал, но вот на счет GSSAPI — SMB:
                              Так тут GSSAPI как раз используется. Есть одно немаловажное различие: SMB не говорит в чем у него проблема при попытке ввода в домен — просто с ошибкой вываливается, а msktutil при --verbose говорит. Например:
                              modify_ext: ldap_modify_ext_s failed (Insufficient access)
                              ldap modification of CN=…
                              failed while trying to change msDs-supportedEncryptionTypes to 28.
                              Error was: Insufficient access

                              А без этого старые линухи, например RHEL 6.5 или 6.9 не могут нормально подключиться к домену, а SMB говорит просто:
                              $ net ads join -U admin.account
                              Failed to join domain: failed to lookup DC info for domain '....' over rpc: NT_STATUS_CONNECTION_RESET
                              Или какие-нибудь другие ошибки RPC, но не конкретно что не нравится (пробовал дебаги включать — бес толку).
                              0
                              Подскажите, можно ли отправлять в AD DNS один основной IP, в случае если на сервере несколько IP?
                              Например, если на интерфейсе 2 IP — основной и кластерный. Вот чтобы отправлял основоной в DNS.
                                0
                                Не очень понятно, если у вас два IP на одном интерфейсе, то значит вы настроили интерфейс в ручную, нет? Тогда и в DNS хост добавляется в ручную — авторегистрация хоста в dns это функция dhcp клиента.
                                  0
                                  Кластерный IP-адрес назначается с помощью keepalived, соответственно он произвольно может переназначаться одному или другому хосту.
                                  Более подробно о динамическом обновлении DNS-записей можно почитать по ссылке: docs.pagure.org/SSSD.sssd/design_pages/active_directory_dns_updates.html
                                  Так что вопрос остаётся открытым.
                                    0
                                    Думаю вам подходит параметр:
                                    dyndns_iface (string) — instead of updating the DNS with the address used to connect to LDAP, which is the default, use all addresses configured on a particular interface.
                                    Но проблема в том, что у вас на одном интерфейсе 2 IP?
                                    Попробуйте поднять macvlan — должны получить два интерфейса с разными маками и станет возможным повесить каждый IP на свой интерфейс.

                              Only users with full accounts can post comments. Log in, please.