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. Очень удобно — если не нужны специфические настройки, то ввод машины в домен занимает, по сути, три (как заметил osipov_dv четыре) команды:

1. Устанавливаем нужные пакеты:
sudo apt install realmd samba-common-bin samba-libs sssd-tools krb5-user adcli

2. Редактируем файл /etc/hosts, указываем FQDN для данного хоста:
127.0.0.1       localhost
127.0.1.1       <hostname>.contoso.com  <hostname>

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

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

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

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

Для того чтоб при входе не указывать дополнительно к логину домен, можно добавить суффикс по умолчанию. В файле /etc/sssd/sssd.conf, в блоке [sssd] добавляем строку:
default_domain_suffix = contoso.com
Ads
AdBlock has stolen the banner, but banners are not teeth — they will be back

More

Comments 31

    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 на свой интерфейс.
                                0
                                У меня с realmd не получилось сделать SSO по SSH, авторизация работает но по паролю. Без ввода пароля работает только через net…
                                Если посмотреть внимательней на krb5.keytab, то видно что не все нужные SPN создаются:
                                root@ubuntu-ad2:~# klist -k -e
                                Keytab name: FILE:/etc/krb5.keytab
                                KVNO Principal
                                — — 4 UBUNTU-AD2$@MSSUP.LOCAL (des-cbc-crc)
                                4 UBUNTU-AD2$@MSSUP.LOCAL (des-cbc-md5)
                                4 UBUNTU-AD2$@MSSUP.LOCAL (arcfour-hmac)
                                4 UBUNTU-AD2$@MSSUP.LOCAL (aes128-cts-hmac-sha1-96)
                                4 UBUNTU-AD2$@MSSUP.LOCAL (aes256-cts-hmac-sha1-96)
                                4 host/UBUNTU-AD2@MSSUP.LOCAL (des-cbc-crc)
                                4 host/UBUNTU-AD2@MSSUP.LOCAL (des-cbc-md5)
                                4 host/UBUNTU-AD2@MSSUP.LOCAL (arcfour-hmac)
                                4 host/UBUNTU-AD2@MSSUP.LOCAL (aes128-cts-hmac-sha1-96)
                                4 host/UBUNTU-AD2@MSSUP.LOCAL (aes256-cts-hmac-sha1-96)
                                4 host/ubuntu-ad2@MSSUP.LOCAL (des-cbc-crc)
                                4 host/ubuntu-ad2@MSSUP.LOCAL (des-cbc-md5)
                                4 host/ubuntu-ad2@MSSUP.LOCAL (arcfour-hmac)
                                4 host/ubuntu-ad2@MSSUP.LOCAL (aes128-cts-hmac-sha1-96)
                                4 host/ubuntu-ad2@MSSUP.LOCAL (aes256-cts-hmac-sha1-96)
                                4 RestrictedKrbHost/UBUNTU-AD2@MSSUP.LOCAL (des-cbc-crc)
                                4 RestrictedKrbHost/UBUNTU-AD2@MSSUP.LOCAL (des-cbc-md5)
                                4 RestrictedKrbHost/UBUNTU-AD2@MSSUP.LOCAL (arcfour-hmac)
                                4 RestrictedKrbHost/UBUNTU-AD2@MSSUP.LOCAL (aes128-cts-hmac-sha1-96)
                                4 RestrictedKrbHost/UBUNTU-AD2@MSSUP.LOCAL (aes256-cts-hmac-sha1-96)
                                4 RestrictedKrbHost/ubuntu-ad2@MSSUP.LOCAL (des-cbc-crc)
                                4 RestrictedKrbHost/ubuntu-ad2@MSSUP.LOCAL (des-cbc-md5)
                                4 RestrictedKrbHost/ubuntu-ad2@MSSUP.LOCAL (arcfour-hmac)
                                4 RestrictedKrbHost/ubuntu-ad2@MSSUP.LOCAL (aes128-cts-hmac-sha1-96)
                                4 RestrictedKrbHost/ubuntu-ad2@MSSUP.LOCAL (aes256-cts-hmac-sha1-96)

                                А вот так работает:
                                root@ubuntu-ad2:~# klist -k
                                Keytab name: FILE:/etc/krb5.keytab
                                KVNO Principal
                                — — 3 host/ubuntu-ad2.mssup.local@MSSUP.LOCAL
                                3 host/UBUNTU-AD2@MSSUP.LOCAL
                                3 host/ubuntu-ad2.mssup.local@MSSUP.LOCAL
                                3 host/UBUNTU-AD2@MSSUP.LOCAL
                                3 host/ubuntu-ad2.mssup.local@MSSUP.LOCAL
                                3 host/UBUNTU-AD2@MSSUP.LOCAL
                                3 host/ubuntu-ad2.mssup.local@MSSUP.LOCAL
                                3 host/UBUNTU-AD2@MSSUP.LOCAL
                                3 host/ubuntu-ad2.mssup.local@MSSUP.LOCAL
                                3 host/UBUNTU-AD2@MSSUP.LOCAL
                                3 UBUNTU-AD2$@MSSUP.LOCAL
                                3 UBUNTU-AD2$@MSSUP.LOCAL
                                3 UBUNTU-AD2$@MSSUP.LOCAL
                                3 UBUNTU-AD2$@MSSUP.LOCAL
                                3 UBUNTU-AD2$@MSSUP.LOCAL

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