Использование PAM для LDAP-аутентификации в ADB
Подключаемые модули аутентификации (Pluggable Authentication Modules, PAM) — это набор разделяемых библиотек, обеспечивающий возможность использования различных методов аутентификации в приложениях за счет предоставления им единого высокоуровневого API. Проверка подлинности пользователя запрашивается у PAM-системы (путем обращения к ее API), а не напрямую у системы безопасности, что обеспечивает гибкость и позволяет использовать различные методы аутентификации без внесения изменений в код самих приложений.
В статье рассмотрен пример использования PAM для настройки LDAP-аутентификации в кластере ADB.
Установка и настройка сервера OpenLDAP
Ниже показан пример установки и настройки сервера OpenLDAP на хосте с именем bds-pam.ru-central1.internal, IP-адресом 10.92.38.114 и операционной системой Ubuntu 22.04. Все шаги выполняются под пользователем с правами root. В вашем окружении порядок настройки LDAP-сервера может отличаться.
Если у вас уже развернут LDAP-сервер, перейдите к шагу Настройка мастер-хоста ADB.
Настройка полного доменного имени сервера
-
Выполните следующую команду для установки полного доменного имени хоста (Fully Qualified Domain Name, FQDN):
$ sudo hostnamectl set-hostname bds-pam.ru-central1.internal -
Откройте для редактирования файл /etc/hosts:
$ sudo vi /etc/hostsИ добавьте в файл запись вида
<IP> <FQDN> <hostname>:10.92.38.114 bds-pam.ru-central1.internal bds-pam
Сохраните изменения в файле.
-
Проверьте корректную установку FQDN при помощи следующей команды:
$ sudo hostname -fРезультат:
bds-pam.ru-central1.internal
-
Также убедитесь, что команда
pingвозвращает FQDN и IP хоста вместо имениlocalhost:$ ping bds-pamРезультат:
PING bds-pam.ru-central1.internal (10.92.38.114) 56(84) bytes of data. 64 bytes from bds-pam.ru-central1.internal (10.92.38.114): icmp_seq=1 ttl=64 time=0.015 ms 64 bytes from bds-pam.ru-central1.internal (10.92.38.114): icmp_seq=2 ttl=64 time=0.038 ms 64 bytes from bds-pam.ru-central1.internal (10.92.38.114): icmp_seq=3 ttl=64 time=0.039 ms ^C --- bds-pam.ru-central1.internal ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2051ms rtt min/avg/max/mdev = 0.015/0.030/0.039/0.011 ms
Установка пакетов OpenLDAP
-
Обновите программные пакеты, установленные в системе:
$ sudo apt update -
Установите пакеты, необходимые для OpenLDAP:
$ sudo apt install slapd ldap-utilsВ процессе установки будет запрошен пароль для администратора OpenLDAP (
admin). Придумайте и введите пароль, а затем подтвердите его в отдельном окне.
Ввод пароля администратора в процессе установки пакетов OpenLDAPВ следующем окне (с запросом на перезапуск сервисов) можно подтвердить значения, предложенные системой по умолчанию.
Настройка сервера OpenLDAP
-
Выполните следующую команду для перехода к конфигурированию сервера OpenLDAP:
$ sudo dpkg-reconfigure slapdВ процессе настройки на экране будут появляться диалоговые окна с параметрами. Заполнения требуют следующие параметры:
-
DNS domain name — доменное имя, которое будет использовано для формирования базового (base) отличительного имени (Distinguished Name, DN) в каталоге LDAP.
-
Organization name — имя организации, по умолчанию равное доменному имени. При необходимости может быть изменено.
-
Administrator password — пароль администратора (
admin). Необходимо ввести пароль, установленный на шаге 2 раздела Установка пакетов OpenLDAP, а затем подтвердить его в следующем окне.
Ввод DNS domain name
Ввод Organization nameВо всех остальных окнах следует подтвердить значения, предложенные системой по умолчанию.
Результат успешного выполнения команды показан ниже:
Backing up /etc/ldap/slapd.d in /var/backups/slapd-2.5.19+dfsg-0ubuntu0.22.04.1... done. Moving old database directory to /var/backups: - directory unknown... done. Creating initial configuration... done. Creating LDAP directory... done.
-
-
Откройте для редактирования файл /etc/ldap/ldap.conf:
$ sudo vi /etc/ldap/ldap.confВ открытом файле раскомментируйте поля
BASE,URIи заполните их значениями base DN и URI вашего LDAP-сервера соответственно:BASE dc=ru-central1,dc=internal URI ldap://bds-pam.ru-central1.internalСохраните изменения в файле.
-
Перезапустите сервис
slapdдля применения ранее введенных изменений:$ sudo systemctl restart slapd -
Проверьте статус сервиса
slapd:$ sudo systemctl status slapdВывод команды:
slapd.service - LSB: OpenLDAP standalone server (Lightweight Directory Access Protocol) Loaded: loaded (/etc/init.d/slapd; generated) Drop-In: /usr/lib/systemd/system/slapd.service.d └─slapd-remain-after-exit.conf Active: active (running) since Mon 2025-07-28 15:28:15 UTC; 7s ago Docs: man:systemd-sysv-generator(8) Process: 5958 ExecStart=/etc/init.d/slapd start (code=exited, status=0/SUCCESS) Tasks: 3 (limit: 19050) Memory: 3.3M CPU: 23ms CGroup: /system.slice/slapd.service └─5965 /usr/sbin/slapd -h "ldap:/// ldapi:///" -g openldap -u openldap -F /etc/ldap/slapd.d -
Проверьте конфигурацию OpenLDAP-сервера с помощью команды:
$ sudo ldapsearch -Q -LLL -Y EXTERNAL -H ldapi:///В выводе команды должно содержаться корректное базовое отличительное имя (base DN):
dn: dc=ru-central1,dc=internal objectClass: top objectClass: dcObject objectClass: organization o: ru-central1.internal dc: ru-central1
Добавление базовых групп пользователей
-
Создайте файл в LDIF-формате следующей командой:
$ sudo vi base-groups.ldifИ внесите в файл данные о двух базовых группах с именами
People(для хранения пользователей) иGroups(для хранения других групп):dn: ou=People,dc=ru-central1,dc=internal objectClass: organizationalUnit ou: People dn: ou=Groups,dc=ru-central1,dc=internal objectClass: organizationalUnit ou: GroupsСохраните изменения в файле.
-
При помощи команды
ldapaddдобавьте группы из созданного ранее файла в каталог LDAP:$ sudo ldapadd -x -D cn=admin,dc=ru-central1,dc=internal -W -f base-groups.ldifВведите пароль администратора для подтверждения операции.
Результат успешного выполнения команды:
adding new entry "ou=People,dc=ru-central1,dc=internal" adding new entry "ou=Groups,dc=ru-central1,dc=internal"
-
Выполните следующую команду для проверки того, что группы успешно созданы:
$ sudo ldapsearch -Q -LLL -Y EXTERNAL -H ldapi:///Результат содержит информацию о созданных группах:
dn: dc=ru-central1,dc=internal objectClass: top objectClass: dcObject objectClass: organization o: ru-central1.internal dc: ru-central1 dn: ou=People,dc=ru-central1,dc=internal objectClass: organizationalUnit ou: People dn: ou=Groups,dc=ru-central1,dc=internal objectClass: organizationalUnit ou: Groups
Создание пользователя
-
Выполните команду
slappasswd, чтобы сгенерировать зашифрованный пароль для нового пользователя:$ sudo slappasswdПосле запуска команды введите пароль и подтвердите его. Запомните пароль: он потребуется на этапе проверки аутентификации (см. шаг 2 раздела Проверка аутентификации).
Зашифрованный пароль будет выведен на экран:
{SSHA}XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX -
Создайте файл в LDIF-формате следующей командой:
$ sudo vi user.ldifИ внесите в файл данные о новом пользователе
alice. Обратите внимание на следующее:-
В поле
userPasswordуказывается пароль в зашифрованном виде, сгенерированный на предыдущем шаге. -
Пользователь создается в рамках базовой группы
People. При необходимости можно выбрать иную предварительно созданную группу.
dn: uid=alice,ou=People,dc=ru-central1,dc=internal objectClass: inetOrgPerson objectClass: posixAccount objectClass: shadowAccount uid: alice sn: Test givenName: Alice cn: Alice Test displayName: Alice Test uidNumber: 10000 gidNumber: 5000 userPassword: {SSHA}XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX gecos: Alice Test loginShell: /bin/bash homeDirectory: /home/aliceСохраните изменения в файле.
-
-
При помощи команды
ldapaddдобавьте нового пользователя из созданного ранее файла в каталог LDAP:$ sudo ldapadd -x -D cn=admin,dc=ru-central1,dc=internal -W -f user.ldifВведите пароль администратора для подтверждения операции.
Результат успешного выполнения команды:
adding new entry "uid=alice,ou=People,dc=ru-central1,dc=internal"
-
Проверьте, что пользователь успешно создан:
$ sudo ldapsearch -x -LLL -b dc=ru-central1,dc=internal '(uid=alice)' cn uidNumber gidNumberРезультат:
dn: uid=alice,ou=People,dc=ru-central1,dc=internal cn: Alice Test uidNumber: 10000 gidNumber: 5000
Отключение возможности анонимной привязки
|
ВАЖНО
В случае отключения возможности анонимной привязки (как описано ниже) — при дальнейшей настройке конфигурационного файла PAM /etc/nslcd.conf опции |
Если требуется исключить возможность анонимной привязки (anonymous bind) к LDAP-серверу для осуществления поиска, выполните следующие команды:
-
Создайте файл в LDIF-формате следующей командой:
$ sudo vi ldap_disable_bind_anon.ldifИ добавьте в файл приведенные ниже строки:
dn: cn=config changetype: modify add: olcDisallows olcDisallows: bind_anon dn: cn=config changetype: modify add: olcRequires olcRequires: authc dn: olcDatabase={-1}frontend,cn=config changetype: modify add: olcRequires olcRequires: authcСохраните изменения в файле.
-
Воспользуйтесь командой
ldapaddдля применения настроек:$ sudo ldapadd -Y EXTERNAL -H ldapi:/// -f ldap_disable_bind_anon.ldifРезультат:
SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 modifying entry "cn=config" modifying entry "cn=config" modifying entry "olcDatabase={-1}frontend,cn=config"
Настройка мастер-хоста ADB
На мастер-хосте ADB выполните следующие команды:
-
Обновите программные пакеты, установленные в системе:
$ sudo apt update -
Установите пакет libpam-ldapd:
$ sudo apt install libpam-ldapdВ процессе настройки на экране будут появляться диалоговые окна с параметрами. Заполнения требуют следующие параметры:
-
LDAP server URI — URI LDAP-сервера. Пример:
ldap://bds-pam.ru-central1.internal/. -
LDAP server search base — базовое отличительное имя (DN), используемое для поиска. Пример:
dc=ru-central1,dc=internal.
Ввод LDAP server URI
Ввод LDAP server search baseВо всех остальных окнах следует подтвердить значения, предложенные системой по умолчанию.
-
-
Откройте для редактирования конфигурационный файл PAM /etc/nslcd.conf:
$ sudo vi /etc/nslcd.confСодержимое файла приведено ниже. Полный перечень доступных опций приведен в GitHub.
# nslcd configuration file. See nslcd.conf(5) # for details. # The user and group nslcd should run as. uid nslcd gid nslcd # The location at which the LDAP server(s) should be reachable. uri ldap://bds-pam.ru-central1.internal/ # The search base that will be used for all queries. base dc=ru-central1,dc=internal # The LDAP protocol version to use. #ldap_version 3 # The DN to bind with for normal lookups. binddn cn=admin,dc=ru-central1,dc=internal bindpw qwerty # The DN used for password modifications by root. #rootpwmoddn cn=admin,dc=example,dc=comОбратите внимание, что опции
uriиbaseзаполняются автоматически на основе данных, введенных при установкеlibpam-ldapd. Однако параметрыbinddnиbindpwтребуется при необходимости заполнить самостоятельно: DN-именем и паролем администратора LDAP (admin) соответственно.ПРИМЕЧАНИЕЕсли в вашем окружении допускается анонимная привязка к LDAP-серверу для поиска (и выше описанный шаг Отключение возможности анонимной привязки не выполнялся), опции
binddnиbindpwзаполнять не требуется. В противном случае (если анонимный доступ запрещен) заполнение опций обязательно: иначе на этапе проверки аутентификации будет формироваться ошибкаAuthentication service cannot retrieve authentication info. -
В случае внесения изменений в конфигурационный файл /etc/nslcd.conf сохраните их и перезапустите сервис
nslcd:$ sudo systemctl restart nslcd -
Создайте файл /etc/pam.d/postgresql для сохранения конфигурации PAM-модуля
postgresql:$ sudo vi /etc/pam.d/postgresqlВнесите в файл следующие строки:
auth required pam_ldap.so account sufficient pam_ldap.so
Сохраните изменения в файле.
Проверка аутентификации
Для проверки PAM-аутентификации на мастер-хосте ADB выполните следующие команды:
-
(Опционально) Установите утилиту
pamtesterдля предварительной проверки корректности всех выполненных настроек:$ sudo apt install pamtester -
(Опционально) Запустите утилиту
pamtester, передав в ее параметрах имя PAM-модуляpostgresqlи имя LDAP-пользователяalice:$ pamtester postgresql alice authenticateПосле запуска утилиты необходимо ввести пароль пользователя
alice(см. шаг 1 раздела Создание пользователя). Результат успешной аутентификации выглядит следующим образом:pamtester: successfully authenticated
-
Подключитесь к мастер-хосту под пользователем
gpadmin:$ sudo su - gpadmin -
Подключитесь к базе данных
adbс помощьюpsql:$ psql adb -
Создайте роль с именем
alice:CREATE ROLE alice LOGIN;И выйдите из
psql. -
Откройте конфигурационную страницу сервиса ADB в ADCM и добавьте в поле Custom pg_hba section запись о PAM-аутентификации следующего вида:
host all alice 10.92.38.0/24 pam pamservice=postgresql
Приведенная выше запись разрешает подключения роли
aliceс использованием PAM-модуляpostgresqlко всем базам данных кластера ADB с хостов с IP-адресами из диапазона10.92.38.0—10.92.38.255. Для production-среды настройки допустимых IP-адресов и баз данных необходимо изменить в соответствии с вашими требованиями.Для применения изменений нажмите Save и запустите действие сервиса ADB Reconfigure & Restart.
Настройка PAM-аутентификации для ADB в ADCM -
Используя
psql, подключитесь к базе данныхadbпод пользователемalice:$ psql -d adb -U alice -h 10.92.38.37После запуска утилиты необходимо ввести пароль пользователя
alice(см. шаг 1 раздела Создание пользователя). В результате успешной аутентификации откроется приглашение для ввода командpsql:psql (9.4.26) Type "help" for help. adb=>