Пока в инфраструктуре два-три сервера, пользователей спокойно заводят руками на каждой машине. Потом серверов становится десять, приходит новый администратор, уходит старый, и выясняется, что у уволившегося сотрудника аккаунт жив на srv-linux01, а на другом хосте у него другой UID, из-за чего права на NFS-каталог ведут себя странно. Лечится это одним способом: учётные записи живут в одном месте, а серверы лишь спрашивают, кто есть кто.

В этой статье разберём два популярных пути для Linux. Первый — OpenLDAP: лёгкий каталог, который ты собираешь сам из деталей. Второй — FreeIPA: готовый комбайн из LDAP, Kerberos, DNS и центра сертификатов. В примерах используем домен itpages.lab.local, сеть 192.168.10.0/24, сервер каталога srv-ldap01 (192.168.10.20) и клиент srv-linux01 (192.168.10.11).

Шаг 1. Выбираем между OpenLDAP и FreeIPA

Короткое правило такое. Если нужен просто справочник пользователей и групп для десятка сервисов (Nginx, Gitea, почта, SSH), берёшь OpenLDAP: ставится быстро, ест мало памяти, гибко настраивается. Если нужен единый вход с Kerberos, sudo-правила по группам, управление SSH-ключами и сертификатами из одного места, берёшь FreeIPA: там всё это уже склеено и снабжено веб-интерфейсом.

Цена выбора тоже разная. OpenLDAP требует понимания схем, ACL и формата LDIF. FreeIPA требует чистого сервера под себя, работающего DNS и от 2 ГБ памяти, и очень не любит, когда её пытаются подвинуть на пути к кастомизации. Для лаборатории мы покажем оба варианта, но на одном хосте их держать не нужно.

Шаг 2. Устанавливаем OpenLDAP на srv-ldap01

Пакеты на Debian и Ubuntu ставятся одной командой. Во время установки спросят пароль администратора каталога.

sudo apt update
sudo apt install -y slapd ldap-utils
sudo dpkg-reconfigure slapd

В мастере переконфигурации укажи DNS-имя itpages.lab.local, название организации ITPages и пароль администратора. Базовый DN получится dc=itpages,dc=lab,dc=local. Проверим, что каталог отвечает:

ldapsearch -x -H ldap://localhost -b dc=itpages,dc=lab,dc=local -s base

Если пришёл ответ с атрибутом dc, служба жива. Теперь создадим структуру: два контейнера для людей и групп. Сохрани в файл base.ldif:

dn: ou=people,dc=itpages,dc=lab,dc=local
objectClass: organizationalUnit
ou: people

dn: ou=groups,dc=itpages,dc=lab,dc=local
objectClass: organizationalUnit
ou: groups
ldapadd -x -D cn=admin,dc=itpages,dc=lab,dc=local -W -f base.ldif

Ключ -W заставит ввести пароль интерактивно, так он не останется в истории командной строки. Это хорошая привычка для любых утилит ldap*.

Шаг 3. Добавляем пользователя и группу

Для входа в Linux пользователю нужен класс posixAccount с UID, GID и домашним каталогом. Сначала хеш пароля:

slappasswd -h {SSHA}

Результат вставь в user.ldif:

dn: uid=anna,ou=people,dc=itpages,dc=lab,dc=local
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
cn: Anna Petrova
sn: Petrova
uid: anna
uidNumber: 10001
gidNumber: 10001
homeDirectory: /home/anna
loginShell: /bin/bash
userPassword: {SSHA}xxxxxxxxxxxxxxxxxxxxxxxx

dn: cn=admins,ou=groups,dc=itpages,dc=lab,dc=local
objectClass: posixGroup
cn: admins
gidNumber: 10001
memberUid: anna
ldapadd -x -D cn=admin,dc=itpages,dc=lab,dc=local -W -f user.ldif

Договорись заранее о диапазонах: например, UID от 10000 и выше отдаём каталогу, а локальные пользователи остаются ниже 1000. Тогда пересечений не будет никогда.

Шаг 4. Включаем TLS

Передавать пароли по ldap:// открытым текстом нельзя. Выпусти сертификат на имя srv-ldap01.itpages.lab.local (внутренним центром сертификации или самоподписанный для лаборатории), положи файлы в /etc/ldap/tls и скажи slapd, где они лежат. Файл tls.ldif:

dn: cn=config
changetype: modify
add: olcTLSCACertificateFile
olcTLSCACertificateFile: /etc/ldap/tls/ca.crt
-
add: olcTLSCertificateFile
olcTLSCertificateFile: /etc/ldap/tls/srv-ldap01.crt
-
add: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/ldap/tls/srv-ldap01.key
sudo chown -R openldap:openldap /etc/ldap/tls
sudo chmod 600 /etc/ldap/tls/srv-ldap01.key
sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f tls.ldif
sudo sed -i 's#^SLAPD_SERVICES=.*#SLAPD_SERVICES="ldap:/// ldaps:/// ldapi:///"#' /etc/default/slapd
sudo systemctl restart slapd

Проверка с клиента: ldapsearch -x -H ldaps://srv-ldap01.itpages.lab.local -b dc=itpages,dc=lab,dc=local uid=anna. Если ругается на сертификат, значит, клиент не доверяет вашему CA.

Шаг 5. Подключаем клиент srv-linux01 через SSSD

На клиенте не нужно городить старые nss-ldap. Современный путь — SSSD: он кэширует ответы, и вход работает, даже если каталог на минуту пропал.

sudo apt install -y sssd sssd-ldap libnss-sss libpam-sss ldap-utils
sudo nano /etc/sssd/sssd.conf
[sssd]
services = nss, pam, ssh
domains = itpages

[domain/itpages]
id_provider = ldap
auth_provider = ldap
ldap_uri = ldaps://srv-ldap01.itpages.lab.local
ldap_search_base = dc=itpages,dc=lab,dc=local
ldap_tls_cacert = /etc/ssl/certs/itpages-ca.crt
cache_credentials = true
enumerate = false
sudo chmod 600 /etc/sssd/sssd.conf
sudo pam-auth-update --enable mkhomedir
sudo systemctl restart sssd
id anna
getent passwd anna

Если id anna показывает UID 10001, схема работает: машина видит пользователя из каталога как своего. Чтобы домашний каталог создавался при первом входе, нужен как раз модуль mkhomedir из команды выше.

Шаг 6. FreeIPA как альтернатива

Если хочется всё и сразу, разворачивай FreeIPA на чистой машине. На сервере с Rocky Linux или AlmaLinux это выглядит так:

sudo hostnamectl set-hostname srv-ldap01.itpages.lab.local
sudo dnf install -y ipa-server ipa-server-dns
sudo ipa-server-install --setup-dns --forwarder=192.168.10.1 \
  --realm=ITPAGES.LAB.LOCAL --domain=itpages.lab.local \
  --reverse-zone=10.168.192.in-addr.arpa.

Установщик задаст вопросы про пароли и поднимет LDAP, Kerberos, DNS и CA. После этого пользователи заводятся командой:

kinit admin
ipa user-add anna --first=Anna --last=Petrova --password
ipa group-add admins
ipa group-add-member admins --users=anna

А клиенты вводятся в домен одной командой, которая заодно настраивает SSSD, Kerberos и SSH:

sudo dnf install -y ipa-client
sudo ipa-client-install --domain=itpages.lab.local --realm=ITPAGES.LAB.LOCAL \
  --mkhomedir --principal=admin

Приятный бонус FreeIPA — HBAC и sudo-правила. Можно один раз написать, что группа admins имеет право входить на srv-linux01 и выполнять sudo, и не трогать sudoers на каждой машине:

ipa hbacrule-add allow_admins_linux01
ipa hbacrule-add-user allow_admins_linux01 --groups=admins
ipa hbacrule-add-host allow_admins_linux01 --hosts=srv-linux01.itpages.lab.local
ipa hbacrule-add-service allow_admins_linux01 --hbacsvcs=sshd

Шаг 7. Резервные копии и мониторинг

Каталог — единая точка отказа для входа, поэтому копии обязательны. Для OpenLDAP достаточно регулярно выгружать данные и конфигурацию:

sudo slapcat -n 0 -l /backup/ldap-config-$(date +%F).ldif
sudo slapcat -n 1 -l /backup/ldap-data-$(date +%F).ldif

Для FreeIPA есть штатное средство ipa-backup, которое сохраняет и каталог, и сертификаты. Отдельно проверь, что на клиентах работает кэш SSSD: отключи сеть до srv-ldap01 и попробуй зайти пользователем, который уже входил раньше. Если вход проходит, значит, падение каталога не парализует серверы.

Шаг 8. Группы, sudo и ключи SSH из каталога

Когда вход работает, каталог можно превратить в единый источник прав. Для OpenLDAP добавь на клиенте в sssd.conf параметр access_provider = ldap и фильтр, который пускает на сервер только членов нужной группы:

access_provider = ldap
ldap_access_filter = (memberOf=cn=admins,ou=groups,dc=itpages,dc=lab,dc=local)
ldap_user_extra_attrs = sshPublicKey
ldap_user_ssh_public_key = sshPublicKey

Чтобы memberOf работал, на сервере включают оверлей memberof, а для хранения ключей подключают схему openssh-lpk. Если лень возиться, ограничься простой проверкой через simple_allow_groups = admins с провайдером access_provider = simple. После этого в sshd_config пропиши AuthorizedKeysCommand /usr/bin/sss_ssh_authorizedkeys и AuthorizedKeysCommandUser nobody, и ключи пользователей будут подтягиваться из каталога автоматически. Для sudo по группе достаточно строки %admins ALL=(ALL) ALL в отдельном файле /etc/sudoers.d/admins, а проверять такой файл нужно командой sudo visudo -cf /etc/sudoers.d/admins.

Во FreeIPA то же самое делается без правки конфигов: ключи загружаются командой ipa user-mod anna --sshpubkey="$(cat ~/.ssh/id_ed25519.pub)", а sudo-правила описываются через ipa sudorule-add. Именно здесь комбайн окупает свою громоздкость: права живут рядом с пользователями, и увольнение сотрудника сводится к одной команде ipa user-disable anna.

Шаг 9. Диагностика проблем со входом

Если пользователь не может войти, иди по цепочке сверху вниз. Сначала убедись, что каталог отвечает и пользователь существует: ldapsearch -x -H ldaps://srv-ldap01.itpages.lab.local -D uid=anna,ou=people,dc=itpages,dc=lab,dc=local -W -b dc=itpages,dc=lab,dc=local uid=anna. Потом проверь, что клиент его видит: getent passwd anna. Если команда пуста, включи отладку SSSD: sudo sssctl domain-status itpages и sudo sss_cache -E для сброса кэша. Подробный журнал получишь, добавив debug_level = 6 в раздел домена и посмотрев файлы в /var/log/sssd. В большинстве случаев причина оказывается скучной: неверный базовый DN, недоверенный сертификат или закрытый порт 636 между сегментами сети.

Отдельный совет по эксплуатации: не дроби права на десятки мелких групп. Начни с трёх-четырёх ролей (admins, developers, support, readonly), привяжи их к серверам и только потом усложняй. Такая схема легко читается, и через год ты сам поймёшь, почему у Анны есть доступ к srv-proxy01.

Шаг 9. Репликация и план масштабирования

Один сервер каталога годится для лаборатории, но в продакшене нужна вторая копия. В OpenLDAP это делается через syncrepl: второй узел подписывается на изменения первого и держит актуальный экземпляр. На потребителе в конфигурацию базы добавляют описание провайдера, а на провайдере включают оверлей syncprov. Клиентам в sssd.conf достаточно перечислить оба адреса через запятую в параметре ldap_uri, и SSSD сам переключится при отказе первого.

ldap_uri = ldaps://srv-ldap01.itpages.lab.local, ldaps://srv-ldap02.itpages.lab.local
ldap_backup_uri = ldaps://srv-ldap02.itpages.lab.local
ldap_network_timeout = 3
ldap_opt_timeout = 5

Во FreeIPA добавление реплики занимает пару команд: на новом хосте выполняешь ipa-client-install, затем ipa-replica-install --setup-dns --forwarder=192.168.10.1. Реплики равноправны, и менять данные можно на любой из них. Перед тем как считать схему готовой, обязательно потренируйся в восстановлении: подними копию из slapcat в отдельной виртуалке и проверь, что вход пользователя работает. Копия, которую ни разу не восстанавливали, остаётся предположением, а не резервной копией. Заодно задокументируй, где лежат пароли администратора каталога, и убери их из истории оболочки и из заметок, чтобы доступ к каталогу не оказался доступом ко всем серверам сразу.

Не забудь и про политику паролей. В OpenLDAP её обеспечивает оверлей ppolicy: он задаёт минимальную длину, срок действия и блокировку после нескольких неверных попыток. Во FreeIPA те же настройки доступны через ipa pwpolicy-mod --minlength=12 --maxfail=5 --lockouttime=600. Включай их сразу, пока пользователей мало: вводить правила для сотни людей, уже привыкших к паролю qwerty, куда сложнее и обиднее для всех сторон.

Частые ошибки и как их избежать

  • Работа без TLS. Bind по ldap:// отправляет пароль открытым текстом, и любой в сегменте 192.168.10.0/24 его прочитает. Включай ldaps или StartTLS сразу, а на клиентах ставь ldap_id_use_start_tls = true и проверяй сертификат, а не отключай проверку ради быстрого запуска.
  • Рассинхрон времени и DNS. Kerberos в FreeIPA не терпит расхождения часов больше пяти минут, а сам FreeIPA требует корректных прямых и обратных записей. Настрой chrony на всех хостах и проверь hostname -f и dig -x 192.168.10.20 до установки, а не после.
  • Нет плана на случай падения каталога. Если srv-ldap01 один и без кэша, никто не зайдёт на сервер, даже ты. Держи локального аварийного администратора с ключом SSH, включай cache_credentials и со временем добавляй реплику (syncrepl в OpenLDAP или ipa-replica-install во FreeIPA).

Что дальше

Администрирование Linux — это набор связанных навыков, вот соседние темы серии: