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

Настройка полного доменного имени сервера

  1. Выполните следующую команду для установки полного доменного имени хоста (Fully Qualified Domain Name, FQDN):

    $ sudo hostnamectl set-hostname bds-pam.ru-central1.internal
  2. Откройте для редактирования файл /etc/hosts:

    $ sudo vi /etc/hosts

    И добавьте в файл запись вида <IP> <FQDN> <hostname>:

    10.92.38.114 bds-pam.ru-central1.internal bds-pam

    Сохраните изменения в файле.

  3. Проверьте корректную установку FQDN при помощи следующей команды:

    $ sudo hostname -f

    Результат:

    bds-pam.ru-central1.internal
  4. Также убедитесь, что команда 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

  1. Обновите программные пакеты, установленные в системе:

    $ sudo apt update
  2. Установите пакеты, необходимые для OpenLDAP:

    $ sudo apt install slapd ldap-utils

    В процессе установки будет запрошен пароль для администратора OpenLDAP (admin). Придумайте и введите пароль, а затем подтвердите его в отдельном окне.

    Ввод пароля администратора в процессе установки пакетов OpenLDAP
    Ввод пароля администратора в процессе установки пакетов OpenLDAP

    В следующем окне (с запросом на перезапуск сервисов) можно подтвердить значения, предложенные системой по умолчанию.

Настройка сервера OpenLDAP

  1. Выполните следующую команду для перехода к конфигурированию сервера OpenLDAP:

    $ sudo dpkg-reconfigure slapd

    В процессе настройки на экране будут появляться диалоговые окна с параметрами. Заполнения требуют следующие параметры:

    • DNS domain name — доменное имя, которое будет использовано для формирования базового (base) отличительного имени (Distinguished Name, DN) в каталоге LDAP.

    • Organization name — имя организации, по умолчанию равное доменному имени. При необходимости может быть изменено.

    • Administrator password — пароль администратора (admin). Необходимо ввести пароль, установленный на шаге 2 раздела Установка пакетов OpenLDAP, а затем подтвердить его в следующем окне.

    Ввод DNS domain name
    Ввод DNS domain name
    Ввод Organization 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.
  2. Откройте для редактирования файл /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

    Сохраните изменения в файле.

  3. Перезапустите сервис slapd для применения ранее введенных изменений:

    $ sudo systemctl restart slapd
  4. Проверьте статус сервиса 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
  5. Проверьте конфигурацию 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

Добавление базовых групп пользователей

  1. Создайте файл в 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

    Сохраните изменения в файле.

  2. При помощи команды 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"
  3. Выполните следующую команду для проверки того, что группы успешно созданы:

    $ 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

Создание пользователя

  1. Выполните команду slappasswd, чтобы сгенерировать зашифрованный пароль для нового пользователя:

    $ sudo slappasswd

    После запуска команды введите пароль и подтвердите его. Запомните пароль: он потребуется на этапе проверки аутентификации (см. шаг 2 раздела Проверка аутентификации).

    Зашифрованный пароль будет выведен на экран:

    {SSHA}XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  2. Создайте файл в 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

    Сохраните изменения в файле.

  3. При помощи команды 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"
  4. Проверьте, что пользователь успешно создан:

    $ 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 опции binddn и bindpw потребуют обязательного заполнения (см. шаг 3 в разделе Настройка мастер-хоста ADB).

Если требуется исключить возможность анонимной привязки (anonymous bind) к LDAP-серверу для осуществления поиска, выполните следующие команды:

  1. Создайте файл в 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

    Сохраните изменения в файле.

  2. Воспользуйтесь командой 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 выполните следующие команды:

  1. Обновите программные пакеты, установленные в системе:

    $ sudo apt update
  2. Установите пакет 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 URI
    Ввод LDAP server search base
    Ввод LDAP server search base

    Во всех остальных окнах следует подтвердить значения, предложенные системой по умолчанию.

  3. Откройте для редактирования конфигурационный файл 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.

  4. В случае внесения изменений в конфигурационный файл /etc/nslcd.conf сохраните их и перезапустите сервис nslcd:

    $ sudo systemctl restart nslcd
  5. Создайте файл /etc/pam.d/postgresql для сохранения конфигурации PAM-модуля postgresql:

    $ sudo vi /etc/pam.d/postgresql

    Внесите в файл следующие строки:

    auth        required      pam_ldap.so
    account     sufficient    pam_ldap.so

    Сохраните изменения в файле.

Проверка аутентификации

Для проверки PAM-аутентификации на мастер-хосте ADB выполните следующие команды:

  1. (Опционально) Установите утилиту pamtester для предварительной проверки корректности всех выполненных настроек:

    $ sudo apt install pamtester
  2. (Опционально) Запустите утилиту pamtester, передав в ее параметрах имя PAM-модуля postgresql и имя LDAP-пользователя alice:

    $ pamtester postgresql alice authenticate

    После запуска утилиты необходимо ввести пароль пользователя alice (см. шаг 1 раздела Создание пользователя). Результат успешной аутентификации выглядит следующим образом:

    pamtester: successfully authenticated
  3. Подключитесь к мастер-хосту под пользователем gpadmin:

    $ sudo su - gpadmin
  4. Подключитесь к базе данных adb с помощью psql:

    $ psql adb
  5. Создайте роль с именем alice:

    CREATE ROLE alice LOGIN;

    И выйдите из psql.

  6. Откройте конфигурационную страницу сервиса 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
    Настройка PAM-аутентификации для ADB в ADCM
  7. Используя 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=>
Нашли ошибку? Выделите текст и нажмите Ctrl+Enter чтобы сообщить о ней