Ввод компьютера Ubuntu/Debian в домен Active Directory
Для упрощения добавления Ubuntu или Debian в домен Active Directory вместо связки samba+winbind можно использовать пакет realmd (Realm Discovery), который позволяет автоматически настроить службу SSSD (System Security Services Daemon) в Linux. Эта статья применима для Ubuntu 20.04/22.04 и Debian 10/11.
Прежде всего обновите пакеты на вашем хосте Linux:
Выведите текущее имя хоста:
Если нужно, измените имя хоста:
$ sudo hostnamectl set-hostname ubnt22.vmblog.ru
Проверьте, что в Linux корректно настроен клиент DNS и он указывает на ваши контроллеры домена AD:
nameserver 192.168.42.10 nameserver 192.168.142.10 search vmblog.ru
Т.к. пакет SSSD используется Kerberos для аутентификации, убедиться, что у вас корректно настроен NTP клиент и настроена синхронизация времени с контроллерами домена AD. Можно настроить так:
$ sudo systemctl status systemd-timesyncd
$ sudo nano /etc/systemd/timesyncd.conf
$ sudo systemctl restart systemd-timesyncd
Установите необходимые пакеты:
$ apt -y install realmd sssd sssd-tools libnss-sss libpam-sss adcli samba-common-bin oddjob oddjob-mkhomedir packagekit
Проверьте, что ваш хост может обнаружить домен AD:
$ realm discover vmblog.ru —verbose
vmblog.ru type: kerberos realm-name: VMBLOG.RU domain-name: vmblog.ru configured: no server-software: active-directory client-software: sssd required-package: sssd-tools required-package: sssd required-package: libnss-sss required-package: libpam-sss required-package: adcli required-package: samba-common-bin
Вы можете задать атрибуты вашего хоста Linux, которые нужно сохранить в учетной записи компьютера в Active Directory (атрибуты operatingSystem и operatingSystemVersion):
[active-directory] os-name = Ubuntu GNU/Linux os-version = 22.04 (Jammy Jellyfish)
Для добавления Linux хоста в домен Active Directory вам понадобится учетная запись AD с правами администратора домена (или пользователь, которому делегированы права на добавление компьютеров в домен).
В самом простом случае для добавления хоста Ubuntu/Debian в домен достаточно выполнить команду:
$ sudo realm join -U apetrov vmblog.ru
Введите пароль доменного пользователя.
По умолчанию для вашего хоста Linux будет создана учетная запись компьютера AD в корневом OU (Organizational Unit) с именем Computers. Вы можете сразу поместить вам хост в нужную OU. Для этого используйте другую команду добавления в домен:
$ sudo realm join —verbose —user=apetrov —computer-ou=»OU=Linux Servers,OU=HQ,DC=vmblog,DC=ru» vmblog.ru
Проверьте, что ваш хост теперь находится в домене AD:
type: kerberos realm-name: VMBLOG.RU domain-name: vmblog.ru configured: kerberos-member server-software: active-directory client-software: sssd required-package: sssd-tools required-package: sssd required-package: libnss-sss required-package: libpam-sss required-package: adcli required-package: samba-common-bin login-formats: %U@vmblog.ru login-policy: allow-realm-logins
Чтобы автоматически создавать домашний каталог пользователям, выполните:
sudo bash -c «cat > /usr/share/pam-configs/mkhomedir» Name: activate mkhomedir
Default: yes
Priority: 900
Session-Type: Additional
Session:
required pam_mkhomedir.so umask=0022 skel=/etc/skel
EOF
Выберите пункт activate mkhomedir.
Проверьте конфигурацию sssd в файле:
Чтобы применить изменения из файла sssd.conf, нужно перезапустить службу:
Теперь вы может выполнить аутентификацию в Linux с помощью учетной записи Active Directory (указывается в формате UPN: user@vmblog.ru).
Проверьте, что вы можете получить информацию о пользователе AD:
Можно переключиться на пользователя:
Creating directory '/home/apetrov@vmblog.ru'. apetrov@vmblog.ru@ubnt22:~$
Чтобы разрешить доменным пользователям вход на хост Linux (консоль+SSH), выполните:
$ realm permit apetrov1@vmblog.ru ivanov2@vmblog.ru
Или разрешить доступ для пользователей доменных групп безопасности:
$ ream permit -g LinuxAdmins@vmblog.ru
Чтобы разрешить, запретить доступ всем пользователям домена:
$ sudo realm permit —all
$ sudo realm deny —all
Вы можете разрешить определенным пользователям и группам повышать привилегии с помощью sudo. Создайте файл:
$ sudo nano /etc/sudoers.d/linux-admins
Добавьте в него пользователей и/или группы, которым разрешено sudo:
%LinuxAdminx@vmblog.ru ALL=(ALL) ALL aivanov@vmblog.ru ALL=(ALL) ALL
$ chmod 0440 /etc/sudoers.d/linux-admins
Теперь попробуйте аутентифицироваться на вашем Linux хосте с доменной учетной записью.
Самый простой способ ввести Linux в домен
Термин Microsoft Active Directory Domain Services включает в себя множество технологий, поэтому сразу уточню, в этой статье речь пойдет про использование контроллера домена только для аутентификации пользователей. То есть в финале, нужна возможность любому сотруднику предприятия сесть за любую рабочую станцию Linux, используя свой доменный логин и пароль.
Начиная с Windows 2000 Server для аутентификации пользователей домена используется протокол Kerberos, разработанный еще в 80-х годах прошлого столетия, алгоритм работы которого, ИМХО, являет собой пример отличного инженерного хака, в хорошем (изначальном:) смысле этого слова. В конце статьи есть ссылка на описание его работы, а сейчас надо сказать, что имеется несколько реализаций этого протокола и решение из этой статьи не привязано только к Microsoft Active Directory
Итак, на предприятии уже развернут контроллер домена, вероятнее всего — Microsoft Active Directory и перед нами — рабочая станция Linux (примеры будут для Debian, но работать будет и в других дистрибутивах и, даже, в моей любимой FreeBSD:). Как ввести ее в домен?
student@debian:~$ sudo apt install krb5-user -y
В Debian даже не понадобится редактировать, но убедитесь, и, при необходимости укажите эти строки в файле конфигурации Kerberos клиента (достаточно только их)
student@debian:~$ sudo nano /etc/krb5.conf
[libdefaults] default_realm = CORP.RU
Вместо CORP.RU должно быть имя домена (Kerberos сферы) Вашего предприятия
И все, можно “входить” в домен:
student@debian:~$ kinit ivanovii Password for ivanovii@CORP.RU: student@debian:~$ klist Ticket cache: FILE:/tmp/krb5cc_1000 Default principal: ivanovii@CORP.RU Valid starting Expires Service principal 02/22/2023 00:09:13 02/22/2023 10:09:13 krbtgt/CORP.RU@CORP.RU renew until 02/23/2023 00:09:09
ivanovii — зарегистрированный в домене логин пользователя, замените его на тот, который есть у Вас, можно, даже, использовать Administrator. В результате работы команды kinit была осуществлена аутентификация пользователя и получен Ticket-Granting Ticket (TGT) “билет на выдачу билетов”, позволяющий, в дальнейшем, получить билеты на доступ к зарегистрированным в домене сервисам, реализуя таким образом технологию единого входа — single sign-on (SSO).
Постойте, но, например, в оснастке “Active Directory Users and Computers” никакой рабочей станции Linux не появилось, как же так? Да, действительно, контроллер домена по прежнему ничего не знает о нашей рабочей станции, фактически, наоборот, это наша рабочая станция, благодаря параметру default_realm = CORP.RU и соответствующим SRV записям в DNS
student@debian:~$ nslookup -q=SRV _kerberos._udp.corp.ru . kdc.corp.ru internet address = A.B.C.D
знает местоположение контроллера домена, и этого достаточно для работы с его Kerberos подсистемой. Для чего может понадобиться регистрация Linux системы в Active Directory и как это сделать — тема отдельной статьи, а сейчас вернемся к нашей задаче — вход доменной учетной записью в Linux систему
За процесс аутентификации пользователей при входе в Linux отвечает библиотека PAM (Pluggable Authentication Modules) использование которой я упоминал в этой статье. В нашем случае добавим в систему модуль, использующий Kerberos аутентификацию:
student@debian:~$ sudo apt install libpam-krb5 -y
В Debian новый модуль добавится в конфигурацию PAM автоматически, сперва логин/пароль будут проверяться в Kerberos, и, в случае неудачи, в локальной базе пользователей:
student@debian:~$ less /etc/pam.d/common-auth
. auth [success=2 default=ignore] pam_krb5.so minimum_uid=1000 auth [success=1 default=ignore] pam_unix.so nullok try_first_pas .
однако, попытка войти в систему доменным пользователем закончится неудачно:
student@debian:~$ sudo login debian login: ivanovii Password: Authentication failure
а в журнале видна причина:
student@debian:~$ sudo tail /var/log/auth.log . Feb 22 01:18:43 debian login[1587]: pam_krb5(login:auth): user ivanovii authenticated as ivanovii@CORP.RU Feb 22 01:18:43 debian login[1587]: pam_unix(login:account): could not identify user (from getpwnam(ivanovii)) .
аутентификация прошла успешно, но дальше, система ничего не знает о нашем пользователе (ни UID, ни GID ни прочих атрибутов)
$ id ivanovii id: ‘ivanovii’: no such user
Вот теперь мы подошли к этапу, ради которого писалась статья:)
Если начать искать традиционное решение этой задачи, то, скорее всего, Вы узнаете о библиотеке Name Service Switch (NSS) и модулях LDAP, WinBIND или SSSD для нее. Но что если … просто создать учетную запись после успешной аутентификации?
Оказывается, библиотеку PAM можно расширять своими собственными скриптами, используя модуль pam_script. Давайте добавим его в систему:
student@debian:~$ sudo apt install libpam-script -y
Здесь авторы пакета для Debian не угадали наш замысел, расположив модули в таком порядке:
student@debian:~$ less /etc/pam.d/common-auth . auth [success=3 default=ignore] pam_krb5.so minimum_uid=1000 auth sufficient pam_script.so auth [success=1 default=ignore] pam_unix.so nullok try_first_pass .
Если честно, то такая конфигурация не только не подходит для нашей задачи, но и очень не хороша с точки зрения безопасности, легко довести ее до ситуации, когда будет достаточно знать логин локального пользователя, например root, для подключения к системе, пароль подойдет любой (вот за это любил FreeBSD, она за нас никогда ничего не делает:) Поэтому, поправьте конфигурацию расположив модули так:
student@debian:~$ sudo nano /etc/pam.d/common-auth
auth [success=2 default=ignore] pam_krb5.so minimum_uid=1000 auth [success=2 default=ignore] pam_unix.so nullok_secure try_first_pass auth requisite pam_deny.so auth sufficient pam_script.so auth required pam_permit.so
В этом случае, после успешной аутентификации учтённой записи в Kerberos, выполнение “перепрыгнет” два следующих шага и запустит модуль pam_script. Остается только написать скрипт, который проверит наличие учетной записи, и, в случае ее отсутствия в системе — создаст:
student@debian:~$ sudo nano /usr/share/libpam-script/pam_script_auth
#!/bin/bash id "$PAM_USER" &>/dev/null || useradd -m -s /bin/bash "$PAM_USER"
student@debian:~$ sudo chmod +x /usr/share/libpam-script/pam_script_auth
student@debian:~$ sudo login debian login: ivanovii Password: . ivanovii@debian:~$ id uid=1001(ivanovii) gid=1001(ivanovii) groups=1001(ivanovii) ivanovii@debian:~$ klist Ticket cache: FILE:/tmp/krb5cc_1001_0zzvqR Default principal: ivanovii@CORP.RU Valid starting Expires Service principal 02/22/2023 04:14:30 02/22/2023 14:14:30 krbtgt/CORP.RU@CORP.RU renew until 02/23/2023 04:14:30
Ну вот и все, мы в системе, и TGT у нас в кармане:)
Очевидным недостатком данного решения является то, что после удаления учётной записи пользователя из домена, она останется на всех рабочих станциях, за которыми он работал. Но, поскольку воспользоваться этими учтёнными записями будет невозможно (в локальной базе пользователей они заблокированы), можно пока оставить все как есть.
Спасибо, что дочитали до конца, надеюсь, было интересно, посмотрите ссылки, буду рад комментариям, до новых встреч!