Использование 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=>