Аутентификация LDAP в ADB

В ADB, как и в Greengage DB, поддерживается аутентификация пользователей с использованием протокола Lightweight Directory Access Protocol (LDAP). При использовании LDAP-аутентификации проверка учетных записей пользователей и их паролей выполняется на выбранном LDAP-сервере. Порядок настройки LDAP-аутентификации в ADB с помощью ADCM описан ниже.

ПРИМЕЧАНИЕ
Возможность настройки параметров для LDAP-подключения через ADCM доступна в ADB 6 начиная с версии 6.25.1.49. В этой же версии реализована автоматическая синхронизация пользователей и групп ADB с LDAP — с помощью утилиты pg-ldap-sync, поставляемой в бандле ADB. В более ранних версиях ADB настройка LDAP-аутентификации была возможна, однако действия, описанные ниже в разделе Синхронизация ADB и LDAP (обновление файла pg_hba.conf и создание всех необходимых ролей в ADB), требовалось выполнять вручную.

Настройка LDAP-аутентификации

Для настройки LDAP-аутентификации в кластере ADB выполните следующие шаги:

  1. Убедитесь, что LDAP-сервер настроен и доступен. ADB поддерживает две реализации протокола LDAP: Microsoft Active Directory (MS AD) и 389 Directory Server в составе FreeIPA.

  2. Откройте конфигурационные параметры сервиса ADB в ADCM.

  3. Переведите переключатель UI LDAP authentication в активное состояние.

  4. Заполните следующие поля.

    Поле Описание По умолчанию Пример в MS AD

    Type

    Тип LDAP-сервера. Возможные значения:

    • MSAD — Microsoft Active Directory

    • FreeIPA — 389 Directory server в составе FreeIPA

    MSAD

    MSAD

    URI

    URI для подключения к LDAP-серверу в формате <хост>:<порт>

     — 

    10.92.12.49:389

    LDAP encryption

    Метод шифрования для LDAP-соединений:

    • ldaps — использовать LDAP по SSL/TLS (LDAPS)

    • starttls — использовать операцию StartTLS (Start Transport Layer Security)

    • none — не использовать шифрование LDAP-соединений

    none

     — 

    Users baseDN

    Ограничение на область поиска объектов в каталоге LDAP, применяемое в запросах на поиск пользователей

     — 

    ou=People,dc=ad,dc=ranger-test

    Groups baseDN

    Ограничение на область поиска объектов в каталоге LDAP, применяемое в запросах на поиск групп пользователей

     — 

    ou=Groups,dc=ad,dc=ranger-test

    Users filter

    LDAP-фильтр, используемый для поиска пользователей. Заполняется в соответствии с RFC 2254

    (&(|(objectClass=person)(objectClass=inetOrgPerson))(cn=*))

    (&(objectClass=person)(objectClass=organizationalPerson)(givenName=*)(sn=*)(sAMAccountName=*))

    Groups filter

    LDAP-фильтр, используемый для поиска групп пользователей. Заполняется в соответствии с RFC 2254

    (&(|(objectClass=group)(objectClass=groupofnames)(objectClass=groupOfUniqueNames))(cn=*))

    (cn=*)

    SA Login

    Имя пользователя, используемое в сервисных запросах к LDAP-серверу

     — 

    cn=admin,dc=ad,dc=ranger-test

    Password

    Пароль пользователя, используемый в сервисных запросах к LDAP-серверу

     — 

    Пароль пользователя admin

    Lowercase login

    Необходимо ли преобразование имен пользователей в нижний регистр

    false

    false

    Lowercase group

    Необходимо ли преобразование имен групп в нижний регистр

    false

    false

    Sync interval

    cron-выражение, описывающее периодичность синхронизации пользователей и групп в ADB на основе данных LDAP-сервера. Для синхронизации используется утилита pg-ldap-sync, поставляемая в бандле ADB

    0 * * * *

    0 * * * *

    ПРИМЕЧАНИЕ

    Различные реализации LDAP используют разные имена для типов и идентификаторов объектов. Формат параметров для конкретной реализации LDAP рекомендуется уточнять у администратора LDAP-сервера.

  5. Нажмите Save. Примените действие Reconfigure & Restart к сервису ADB.

    Настройка LDAP-аутентификации для ADB в ADCM
    Настройка LDAP-аутентификации для ADB в ADCM

Синхронизация ADB и LDAP

Если LDAP-аутентификация настроена успешно, в ADB автоматически выполняются следующие действия:

  • Обновление файла pg_hba.conf. В файл pg_hba.conf, расположенный в data-директории мастер-хоста (в приведенном примере /data1/master/gpseg-1/), добавляется новая запись об LDAP-аутентификации следующего вида:

    # BEGIN LDAP
    host all +ldap_users 0.0.0.0/0 ldap ldapserver=<URI> ldapbasedn="<Users baseDN>" ldapbinddn="<SA Login>" ldapbindpasswd="<Password>" ldapsearchattribute="<attribute>"
    # END LDAP

    где:

    • ldap_users — имя роли в ADB, в которую будут добавлены все полученные со стороны LDAP пользователи.

    • <URI>, <Users baseDN>, <SA Login>, <Password> — значения одноименных параметров сервиса ADB.

    • <attribute> — атрибут LDAP, значение которого будет использовано в качестве имени каждой роли в ADB при синхронизации пользователей. Принимает одно из следующих значений:

      • sAMAccountName — для MS AD.

      • uid — для FreeIPA.

  • Синхронизация пользователей и групп ADB с LDAP. В базу данных ADB добавляется информация о группах и пользователях, заведенных на LDAP-сервере (и удовлетворяющих критериям отбора, указанным на этапе конфигурации). Синхронизация выполняется путем вызова утилиты pg-ldap-sync. Чтобы убедиться в успешной синхронизации, можно выполнить запрос к системной таблице pg_roles:

    SELECT rolname FROM pg_roles;

    Как показывает вывод команды, в ADB автоматически созданы следующие роли в результате синхронизации с LDAP:

    • ldap_users — роль, в которую добавляются все LDAP-пользователи (путем автоматического вызова команды CREATE ROLE …​ LOGIN IN ROLE ldap_users …​).

    • ldap_groups — роль, в которую добавляются все LDAP-группы (путем автоматического вызова команды CREATE ROLE …​ NOLOGIN IN ROLE ldap_groups …​).

    • ffedorov, ppetrov, ssemenov, zeptest — конкретные пользователи, полученные со стороны LDAP и добавленные в роль ldap_users.

    • ADCM, ADH, Adccadmins, Analysts, Managers — конкретные группы пользователей, полученные со стороны LDAP и добавленные в роль ldap_groups. Членство пользователей в этих группах устанавливается путем автоматического вызова команды GRANT.

       rolname
    -------------
     gpadmin
     gpmon
     ldap_users
     ldap_groups
     ADCM
     ADH
     Adccadmins
     Analysts
     Managers
     ffedorov
     ppetrov
     ssemenov
     zeptest
    (13 rows)
Особенности синхронизации
  • В дальнейшем синхронизация пользователей будет проводиться автоматически в соответствии с расписанием, указанным в параметре Sync interval. Необходимости в ручном добавлении ролей путем вызова команд CREATE ROLE и GRANT нет.

  • Для синхронизации данных с LDAP-сервером вне настроенного расписания следует применить действие Reconfigure & Restart к сервису ADB.

  • После настройки LDAP-аутентификации подключение к БД становится возможным только для пользователей, зарегистрированных на LDAP-сервере. В случае удаления пользователя на стороне LDAP его дальнейшая аутентификация в ADB становится невозможна.

  • Случай, когда пользователь зарегистрирован в ADB, но при этом отсутствует на стороне LDAP-сервера, валиден — синхронизация данных с LDAP никак не влияет на этого пользователя. Однако, если пользователь с одним и тем же именем заведен и в ADB, и в LDAP, то поведение синхронизации зависит от принадлежности пользователя ADB группе LDAP:

    • Если пользователь принадлежит группе ldap_users, то при следующем запуске синхронизации данные этого пользователя в ADB будут перезаписаны данными, полученными от LDAP.

    • Если пользователь не принадлежит группе ldap_users, конфликт имен приведет к ошибке синхронизации role "<role_name>" already exists. В этом случае, чтобы устранить конфликт имен, удалите или переименуйте одного из пользователей.

  • Утилита pg-ldap-sync автоматизирует только следующие DCL-команды: CREATE ROLE <ROLE>, DROP ROLE <ROLE>, GRANT <ROLE> TO <ROLE> и REVOKE <ROLE> FROM <ROLE>. Назначение прав доступа при помощи команд вида GRANT SELECT, GRANT EXECUTE, GRANT CONNECT и GRANT PRIVILEGES ON <OBJECT> TO <ROLE> при необходимости следует выполнить самостоятельно в ADB.

Использование LDAP с SSL

Существует два способа установить защищенное соединение между ADB и серверами LDAP:

  • LDAPS (LDAP через SSL/TLS) — при таком способе перед передачей LDAP-трафика устанавливается защищенный TLS-туннель. Как правило, используется выделенный порт (636), к которому клиенты подключаются напрямую.

  • При использовании StartTLS соединение начинается как обычное незашифрованное LDAP-соединение, после чего клиент отправляет специальную операцию StartTLS с запросом на включение TLS-шифрования. Как правило, используется стандартный порт LDAP — 389.

Чтобы использовать ADB с LDAP через SSL, требуется настроить сервер LDAP и выбрать один из этих двух методов в конфигурационном параметре LDAP encryption сервиса ADB.

В примерах ниже в качестве имени хоста LDAP-сервера используется val-pam.ru-central1.internal. При выполнении команд замените его на адрес вашего LDAP-сервера.

Настройка сервера LDAP для работы с SSL

Следующие шаги показывают пример настройки SSL-шифрования для OpenLDAP на Ubuntu 22.04. Если на вашем LDAP-сервере SSL уже настроен, можно пропустить первый раздел — в таком случае убедитесь, что сертификат добавлен на мастер-хост ADB, а затем включите LDAPS или StartTLS в ADB.

  1. Создайте директорию для сертификатов и перейдите в нее:

    $ sudo mkdir -p /etc/ldap/ssl && cd /etc/ldap/ssl
  2. Создайте самоподписанный сертификат CA:

    $ sudo openssl req -new -x509 -nodes -out ca.crt -keyout ca.key -days 3650 -subj "/CN=My Certificate Authority"
  3. Сгенерируйте закрытый ключ сервера и запрос на подпись сертификата (CSR). В поле Common Name (CN) укажите адрес сервера LDAP, доступный с мастер-хоста ADB:

    $ sudo openssl req -new -nodes \
      -out server.csr \
      -keyout server.key \
      -subj "/CN=val-pam.ru-central1.internal" \
      -addext "subjectAltName = DNS:val-pam.ru-central1.internal"
  4. Подпишите CSR сервера с помощью CA для получения серверного сертификата:

    $ sudo openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 365
  5. Установите права доступа для созданных файлов:

    $ sudo chown -R openldap:openldap /etc/ldap/ssl/
    $ sudo chmod 600 /etc/ldap/ssl/server.key
    $ sudo chmod 644 /etc/ldap/ssl/server.crt /etc/ldap/ssl/ca.crt
  6. Настройте демон slapd так, чтобы он использовал созданные сертификаты. Для этого создайте файл tls.ldif со следующим содержимым:

    dn: cn=config
    changetype: modify
    replace: olcTLSCACertificateFile
    olcTLSCACertificateFile: /etc/ldap/ssl/ca.crt
    -
    replace: olcTLSCertificateFile
    olcTLSCertificateFile: /etc/ldap/ssl/server.crt
    -
    replace: olcTLSCertificateKeyFile
    olcTLSCertificateKeyFile: /etc/ldap/ssl/server.key
  7. Примените созданную конфигурацию:

    $ sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f tls.ldif

    Вывод должен быть следующим:

    SASL/EXTERNAL authentication started
    SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
    SASL SSF: 0
    modifying entry "cn=config"
  8. Откройте файл /etc/default/slapd и добавьте опцию ldaps:/// в значение параметра SLAPD_SERVICES, чтобы получившаяся строка выглядела следующим образом:

    SLAPD_SERVICES="ldap:/// ldaps:/// ldapi:///"

    В результате этой настройки сервер LDAP будет доступен на портах 636 (LDAPS) и 389 (незашифрованный LDAP). Незашифрованный LDAP используется для StartTLS, который переключает соединение на TLS после установки соединения.

  9. Перезапустите slapd:

    $ sudo systemctl restart slapd
  10. Убедитесь, что сервер LDAPS принимает соединения на порту 636:

    $ sudo lsof -i :636

    Вывод должен выглядеть подобным образом:

    COMMAND    PID     USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
    slapd   114824 openldap   10u  IPv4 184207      0t0  TCP *:ldaps (LISTEN)
    slapd   114824 openldap   11u  IPv6 184208      0t0  TCP *:ldaps (LISTEN)

Добавление сертификатов на мастер-хост

Для проверки подлинности сервера LDAP со стороны ADB сертификат, подписанный центром сертификации (ЦС), должен присутствовать на мастер-хосте. Если это самоподписанный сертификат (как в примере выше), его необходимо также добавить в хранилище доверенных сертификатов операционной системы.

  1. На мастер-хосте создайте директорию для сертификата:

    $ sudo mkdir -p /etc/ldap/ssl
  2. Скопируйте сертификат с сервера LDAP в эту директорию на мастер-хосте:

    $ scp user@val-pam.ru-central1.internal:/etc/ldap/ssl/ca.crt /tmp/ca.crt
    $ sudo cp /tmp/ca.crt /etc/ldap/ssl/
  3. Измените права доступа к файлу следующим образом:

    $ sudo chmod 644 /etc/ldap/ssl/ca.crt
  4. Установите сертификат в хранилище доверенных сертификатов:

    $ sudo cp /etc/ldap/ssl/ca.crt /usr/local/share/ca-certificates
    $ sudo update-ca-certificates

Проверка защищенного соединения

Перед внесением изменений в ADB можно дополнительно убедиться, что между мастер-хостом ADB и настроенным сервером LDAP успешно устанавливаются зашифрованные LDAP-соединения.

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

$ ldapsearch -H ldaps://val-pam.ru-central1.internal -D cn=admin,dc=ru-central1,dc=internal -W -b "dc=ru-central1,dc=internal" -s base

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

$ ldapsearch -H ldap://val-pam.ru-central1.internal -ZZ -D cn=admin,dc=ru-central1,dc=internal -W -b "dc=ru-central1,dc=internal" -s base

В обоих случаях вывод должен содержать результат Success.

Пример успешного ответа
# extended LDIF
#
# LDAPv3
# base <dc=ru-central1,dc=internal> with scope baseObject
# filter: (objectclass=*)
# requesting: ALL
#

# ru-central1.internal
dn: dc=ru-central1,dc=internal
objectClass: top
objectClass: dcObject
objectClass: organization
o: ru-central1.internal
dc: ru-central1

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1

Включение LDAPS в ADB

  1. Откройте конфигурационные параметры сервиса ADB в ADCM.

  2. Переведите переключатель UI LDAP authentication в активное состояние и настройте следующие параметры LDAP:

    • URI — укажите адрес сервера LDAP в формате <хост>:<порт>. Для LDAPS обычно используется порт 636. Например, val-pam.ru-central1.internal:636.

    • LDAP encryption — выберите ldaps.

  3. Все остальные параметры LDAP можно настроить так же, как описано для LDAP по стандартному протоколу.

  4. Нажмите Save и запустите действие Reconfigure & Restart сервиса ADB, чтобы применить изменения.

Включение LDAPS в ADB
Включение LDAPS в ADB

В результате успешного завершения действия Reconfigure & Restart в файл pg_hba.conf добавляется новое правило для членов группы ldap_users. Это правило включает адрес сервера LDAP со схемой ldaps, что активирует LDAPS. В результате секция конфигурации LDAP в файле pg_hba.conf должна выглядеть следующим образом:

# BEGIN LDAP
host all +ldap_users 0.0.0.0/0 ldap ldapserver=ldaps://val-pam.ru-central1.internal:636 ldapbasedn="ou=People,dc=ru-central1,dc=internal" ldapbinddn="cn=admin,dc=ru-central1,dc=internal" ldapbindpasswd="12345" ldapsearchattribute="uid"
# END LDAP

Теперь можно проверить аутентификацию LDAP — для пользователей из группы ldap_users ADB будет выполнять аутентификацию через LDAP-сервер с использованием LDAPS.

Включение StartTLS в ADB

  1. Откройте конфигурационные параметры сервиса ADB в ADCM.

  2. Переведите переключатель UI LDAP authentication в активное состояние и настройте параметры LDAP:

    • URI — укажите адрес сервера LDAP в формате хост:порт. Для StartTLS обычно используется стандартный порт LDAP — 389. Например, val-pam.ru-central1.internal:389.

    • LDAP encryption — выберите starttls.

  3. Все остальные параметры LDAP можно настроить так же, как описано для обычного LDAP.

  4. Нажмите Save и запустите действие Reconfigure & Restart сервиса ADB, чтобы применить изменения.

Включение StartTLS в ADB
Включение StartTLS в ADB

В результате успешного завершения действия Reconfigure & Restart в файл pg_hba.conf добавляется новое правило для членов группы ldap_users. Это правило включает опцию ldaptls=1, которая активирует TLS-шифрование через операцию StartTLS. В результате секция конфигурации LDAP в файле pg_hba.conf должна выглядеть следующим образом:

# BEGIN LDAP
host all +ldap_users 0.0.0.0/0 ldap ldapserver=val-pam.ru-central1.internal:389 ldaptls=1 ldapbasedn="ou=People,dc=ru-central1,dc=internal" ldapbinddn="cn=admin,dc=ru-central1,dc=internal" ldapbindpasswd="12345" ldapsearchattribute="uid"
# END LDAP

Теперь можно проверить аутентификацию LDAP — для пользователей из группы ldap_users ADB будет выполнять аутентификацию через LDAP-сервер с использованием StartTLS.

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

Для того чтобы проверить возможность подключения к ADB после настройки LDAP-аутентификации, можно воспользоваться клиентом psql, указав в качестве аргумента -U имя одного из пользователей, заведенных на стороне LDAP (в приведенном примере — ffedorov).

$ psql adb -h <Имя или IP-адрес мастер-хоста> -U "ffedorov"

Если настройка LDAP-аутентификации выполнена успешно, на экране появится приглашение для ввода пароля пользователя. После ввода корректного пароля (назначенного на стороне LDAP-сервера) пользователю открывается доступ к работе с БД.

Password for user ffedorov:
psql (9.4.26)
Type "help" for help.

adb=>
Ошибки LDAP-аутентификации
  • При попытке подключения к ADB под пользователем, не включенным в роль ldap_users, формируется следующая ошибка:

    psql: FATAL:  no pg_hba.conf entry for host "10.92.42.236", user "bds", database "adb", SSL off
  • Если пользователь, под которым выполняется подключение, существует в ADB и включен в роль ldap_users, но при этом он отсутствует на стороне LDAP или его пароль не совпадает с введенным, возвращается следующая ошибка:

    psql: FATAL:  LDAP authentication failed for user "bds"

В обоих случаях необходимо дождаться синхронизации с LDAP-сервером по расписанию либо запустить ее вручную, применив действие Reconfigure & Restart к сервису ADB.

Нашли ошибку? Выделите текст и нажмите Ctrl+Enter чтобы сообщить о ней