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

Kerberos — это протокол для запросов службы аутентификации между доверенными хостами в ненадежной сети. Kerberos управляет учетными данными (аутентификация), а LDAP хранит достоверную информацию об учетных записях пользователей и их правах доступа (авторизация).

В этой статье описано создание защищенного соединения между следующими хостами с операционной системой CentOS:

  • 10.92.6.36, adpg-host, adpg-host.domain.local;

  • 10.92.6.201, freeipa-host, freeipa-host.domain.local.

ADPG установлен на хост adpg-host.

Установка сервера FreeIPA

Чтобы развернуть сервер FreeIPA на хосте freeipa-host, будем использовать Docker CE. Выполните шаги описанные ниже для установки:

  1. Добавьте имена хостов и их IP-адреса в файл hosts:

    sudo tee -a /etc/hosts > /dev/null <<EOT
    10.92.6.36  adpg-host.domain.local adpg-host
    10.92.6.201 freeipa-host.domain.local freeipa-host
    EOT
  2. Используйте утилиту hostnamectl, чтобы задать имя хоста:

    sudo hostnamectl set-hostname freeipa-host.domain.local
  3. Выполните следующие команды, чтобы отключить SELinux:

    sudo setenforce 0
    sudo sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
    sudo reboot
  4. Установите Docker CE:

    sudo -i
    yum remove docker \
                   docker-client \
                   docker-client-latest \
                   docker-common \
                   docker-latest \
                   docker-latest-logrotate \
                   docker-logrotate \
                   docker-engine
    yum install -y yum-utils
    yum-config-manager \
        --add-repo \
        https://download.docker.com/linux/centos/docker-ce.repo
    yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
    systemctl start docker
    systemctl enable docker
  5. Создайте каталог ipa-data для файлов конфигурации FreeIPA, укажите параметры установки FreeIPA и запишите их в файл ipa-server-install-options:

    mkdir /var/lib/ipa-data
    tee -a /var/lib/ipa-data/ipa-server-install-options > /dev/null <<EOT
    --realm=DOMAIN.LOCAL
    --ds-password=freeipaDSpass
    --admin-password=freeipaADMINpass
    EOT
  6. Установите сервер FreeIPA:

    docker run -ti -h freeipa-host.domain.local --read-only \
        -v /sys/fs/cgroup:/sys/fs/cgroup:ro \
        --name freeipa \
        --network host \
        -v /var/lib/ipa-data:/data:Z -v /etc/hosts:/etc/hosts \
        -e PASSWORD=Password123 \
        freeipa/freeipa-server:centos-7 ipa-server-install -U -r DOMAIN.LOCAL --no-ntp

Установка клиента FreeIPA

Установим клиент FreeIPA на хост adpg-host.

  1. Добавьте имена хостов и их IP-адреса в файл hosts:

    sudo tee -a /etc/hosts > /dev/null <<EOT
    10.92.6.36  adpg-host.domain.local adpg-host
    10.92.6.201 freeipa-host.domain.local freeipa-host
    EOT
  2. Используйте утилиту hostnamectl, чтобы задать имя хоста:

    sudo hostnamectl set-hostname adpg-host.domain.local
  3. Выполните следующие команды, чтобы отключить SELinux:

    sudo setenforce 0
    sudo sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
    sudo reboot
  4. Установите клиент FreeIPA:

    sudo -i
    
    yum install freeipa-client
  5. Используйте команду ipa-client-install, чтобы сконфигурировать adpg-host для использования IPA:

    ipa-client-install --mkhomedir --domain=domain.local --server=adpg-host.domain.local

    Терминал отобразит следующее уведомление:

    Autodiscovery of servers for failover cannot work with this configuration.
    If you proceed with the installation, services will be configured to always access the discovered server for all operations and will not fail over to other servers in case of failure.
    Proceed with fixed values and no DNS discovery? [no]:

    Наберите yes для продолжения с фиксированными значениями. Фиксированные значения будут выведены на дисплей:

    Client hostname: adpg-host.domain.local
    Realm: DOMAIN.LOCAL
    DNS Domain: domain.local
    IPA Server: freeipa-host.domain.local
    BaseDN: dc=domain,dc=local
    
    Continue to configure the system with these values? [no]:

    Наберите yes для подтверждения.

    Укажите admin в качестве авторизованного пользователя:

    User authorized to enroll computers: admin

    Введите пароль, который был передан в качестве параметра PASSWORD команды docker run (в нашем примере — Password123).

  6. Используйте команду kinit, чтобы получить новый мандат (ticket) Kerberos. Выполните команду klist, чтобы проверить, создан ли мандат:

    kinit admin
    klist
  7. Добавьте пользователя и установите для него пароль:

    ipa user-add pguser --first=pguser --last=PG --password

    Результат:

    -------------------
    Added user "pguser"
    -------------------
      User login: pguser
      First name: pguser
      Last name: PG
      Full name: pguser PG
      Display name: pguser PG
      Initials: pP
      Home directory: /home/pguser
      GECOS: pguser PG
      Login shell: /bin/sh
      Principal name: pguser@DOMAIN.LOCAL
      Principal alias: pguser@DOMAIN.LOCAL
      User password expiration: 20220804150601Z
      Email address: pguser@domain.local
      UID: 1391600001
      GID: 1391600001
      Password: True
      Member of groups: ipausers
      Kerberos keys available: True
  8. Службам требуется SPN (Service Principal Name) для использования аутентификации Kerberos. Зарегистрируйте службу postgres для получения SPN:

    ipa service-add postgres/adpg-host.domain.local@DOMAIN.LOCAL --force

    Результат:

    ---------------------------------------------------------------
    Added service "postgres/adpg-host.domain.local@DOMAIN.LOCAL"
    ---------------------------------------------------------------
      Principal name: postgres/adpg-host.domain.local@DOMAIN.LOCAL
      Principal alias: postgres/adpg-host.domain.local@DOMAIN.LOCAL
      Managed by: adpg-host.domain.local

Настройка ADPG для использования Kerberos

Создайте keytab-файл на хосте adpg-host :

ipa-getkeytab --principal=postgres/adpg-host.domain.local@DOMAIN.LOCAL --keytab=/etc/krb5.keytab

Выполните команду chown, чтобы изменить владельца и группу файла krb5.keytab:

chown postgres:postgres /etc/krb5.keytab

Используйте ADCM чтобы изменить конфигурационные параметры ADPG. Откройте вкладку Clusters → ADPG cluster → Services → ADPG → Primary configuration и установите значение listen_addresses  — *.

Добавьте в поле postgresql.conf custom section новый параметр krb_server_keyfile.

krb_server_keyfile = '/etc/krb5.keytab'

Добавьте следующую строку в поле PG_HBA:

host all pguser 0.0.0.0/0 gss  include_realm=0 krb_realm=DOMAIN.LOCAL

Кликните кнопку Save и выполните действие Reconfigure & Restart, чтобы применить изменения.

Создайте пользователя на хосте adpg-host:

sudo su - postgres
psql -c "CREATE USER pguser"

Проверьте соединение c использованием GSSAPI:

kinit pguser
psql -h adpg-host.domain.local -U pguser postgres

Результат:

psql (14.3)
GSSAPI-encrypted connection
Type "help" for help.

postgres=#

Установка пакета openldap-clients

Пакет openldap-clients содержит инструменты командной строки для просмотра и изменения каталогов на сервере LDAP. Установите пакет openldap-clients на хост adpg-host:

yum install openldap-clients -y

Выполните команду klist, чтобы проверить, получил ли текущий системный пользователь мандат Kerberos с правами администратора IPA. Если нет, выполните команду kinit admin:

klist
kinit admin

Добавьте пользователя:

ipa user-add pgldap --first=pgldap --last=PG --password

Проверьте соединение:

ldapsearch -x -h freeipa-host.domain.local  -b dc=domain,dc=local uid=pgldap

Настройка ADPG для использования LDAP

Создайте пользователя pgldap:

sudo su - postgres
psql -c "CREATE USER pgldap"

Добавьте следующую строку в поле PG_HBA:

host all pgldap 0.0.0.0/0 ldap  ldapserver=freeipa-host.domain.local ldapbasedn="cn=users,cn=compat,dc=domain,dc=local" ldapsearchattribute=uid

Кликните кнопку Save и выполните действие Reconfigure & Reload, чтобы применить изменения.

Проверьте соединение:

kinit pgldap
psql -h adpg-host.domain.local -U pgldap postgres

Результат:

psql (14.3)
GSSAPI-encrypted connection
Type "help" for help.

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