Github

GSSAPI-аутентификация с использованием FreeIPA

Андрей Аксенов

Доступ к кластеру Greengage DB можно контролировать с помощью GSSAPI-аутентификации. В частности, вы можете настроить сервер FreeIPA для управления идентификацией пользователей. Поскольку FreeIPA использует MIT Kerberos для аутентификации, вы можете интегрировать ваш кластер Greengage DB с сервером FreeIPA и задать сопоставление между пользователями FreeIPA и ролями Greengage DB. Это позволит использовать GSSAPI-аутентификацию для соответствующих пользователей.

Предварительные требования

Для демонстрации интеграции кластера Greengage DB с сервером FreeIPA используются следующие хосты и параметры домена IPA:

  • Мастер-хост: имя — mdw.example.com, FQDN — mdw.example.com.

  • Хост FreeIPA: имя — ipa.example.com, FQDN — ipa.example.com, операционная система — RHEL или CentOS.

  • Область (realm): EXAMPLE.COM.

  • Сервисный принципал: postgres/mdw.example.com@EXAMPLE.COM.

Используйте имена хостов, полные доменные имена (FQDN) и имя области, соответствующие вашему окружению.

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

Войдите на хост FreeIPA под пользователем с правами суперпользователя:

$ ssh sampleuser@ipa.example.com

В этом примере имя пользователя — sampleuser.

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

Для установки библиотек FreeIPA выполните следующую команду:

$ sudo yum install ipa-server

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

Выполните команду ниже, чтобы запустить настройку сервера FreeIPA в неинтерактивном режиме:

$ sudo ipa-server-install \
  --unattended \
  --hostname=ipa.example.com \
  --domain=example.com \
  --realm=EXAMPLE.COM \
  --ds-password=87654321 \
  --admin-password=12345678
ВАЖНО

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

Когда настройка сервера FreeIPA завершена, проверьте состояние сервисов с помощью команды ipactl status:

$ sudo ipactl status

В частности, вывод должен показывать, что сервисы Directory, krb5kdc и kadmin запущены:

Directory Service: RUNNING
krb5kdc Service: RUNNING
kadmin Service: RUNNING

Создание сервисов и пользователей FreeIPA

Выполните описанные ниже шаги на хосте FreeIPA:

  • Создайте сервис, необходимый для использования аутентификации Kerberos в СУБД Greengage.

  • Создайте обычного пользователя FreeIPA. Этот пользователь будет сопоставлен с соответствующей ролью Greengage DB.

ПРИМЕЧАНИЕ

Вам нужно создать пользователей FreeIPA для всех пользователей Greengage DB, которые используют Kerberos-аутентификацию.

Аутентификация в качестве администратора

Для выполнения административных действий автоматически создается пользователь admin. Выполните команду kinit, чтобы аутентифицироваться под пользователем admin:

$ kinit admin

Когда будет показано данное приглашение, введите пароль, заданный в параметре admin-password во время настройки сервера FreeIPA:

Password for admin@EXAMPLE.COM:

Создание сервиса postgres

Сервис postgres необходим для реализации протокола аутентификации Kerberos в Greengage DB.

Сначала добавьте мастер-хост Greengage DB в домен IPA с помощью команды ipa host-add:

$ ipa host-add mdw.example.com

Затем создайте сервис, который соответствует процессу postgres на мастер-хосте:

$ ipa service-add postgres/mdw.example.com@EXAMPLE.COM

Результат должен выглядеть следующим образом:

--------------------------------------------------------------------------------------
Added service "postgres/mdw.example.com@EXAMPLE.COM"
--------------------------------------------------------------------------------------
  Principal name: postgres/mdw.example.com@EXAMPLE.COM
  Principal alias: postgres/mdw.example.com@EXAMPLE.COM
  Managed by: mdw.example.com

Добавление ключа сервиса в keytab-файл

После создания сервиса postgres необходимо добавить его ключ в keytab-файл. Для этого используйте команду ipa-getkeytab:

$ ipa-getkeytab \
  --principal=postgres/mdw.example.com@EXAMPLE.COM \
  --keytab=ggdb-freeipa.keytab

Эта команда создает файл ggdb-freeipa.keytab.

Создание обычного пользователя

Создайте обычного пользователя FreeIPA с помощью команды ipa user-add:

$ ipa user-add alice \
  --first=Alice \
  --last=Johnson \
  --password

Введите пароль и нажмите Enter, когда будут показаны эти приглашения:

Password:
Enter Password again to verify:

Результат должен выглядеть следующим образом:

------------------
Added user "alice"
------------------
  User login: alice
  First name: Alice
  Last name: Johnson
  Full name: Alice Johnson
  Display name: Alice Johnson
  Initials: AJ
  Home directory: /home/alice
  GECOS: Alice Johnson
  Login shell: /bin/sh
  Principal name: alice@EXAMPLE.COM
  Principal alias: alice@EXAMPLE.COM
  User password expiration: 20250109101949Z
  Email address: alice@example.com
  UID: 1389000001
  GID: 1389000001
  Password: True
  Member of groups: ipausers
  Kerberos keys available: True

Вы можете видеть, что принципал пользователя — alice@EXAMPLE.COM. Имя принципала используется далее для сопоставления пользователя FreeIPA и роли Greengage DB.

Настройка мастера Greengage DB

Для настройки мастер-хоста Greengage DB войдите на него как gpadmin:

$ ssh gpadmin@mdw.example.com

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

Установите клиентские библиотеки FreeIPA на мастер-хост Greengage DB:

$ sudo apt install freeipa-client
$ sudo yum install ipa-client

Настройка клиента FreeIPA

Выполните команду ниже, чтобы запустить настройку клиента FreeIPA в неинтерактивном режиме:

$ sudo ipa-client-install \
  --unattended \
  --server=ipa.example.com \
  --domain=example.com \
  --realm=EXAMPLE.COM \
  --principal admin \
  --password=12345678

Обратите внимание, что параметр password использует пароль пользователя admin, заданный во время настройки сервера FreeIPA.

Копирование keytab-файла

  1. Скопируйте keytab-файл (ggdb-freeipa.keytab), созданный на хосте Kerberos, в каталог /home/gpadmin/ на мастер-хосте Greengage DB.

  2. Настройте владельца и права доступа для скопированного keytab-файла:

    $ sudo chown gpadmin:gpadmin ggdb-freeipa.keytab
    $ sudo chmod 400 ggdb-freeipa.keytab

Создание роли Greengage DB

Создайте роль alice в Greengage DB:

$ createuser alice

В следующем разделе для этой роли будет настроено сопоставление с принципалом alice@EXAMPLE.COM.

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

  1. Задайте путь к keytab-файлу, используя параметр конфигурации сервера krb_server_keyfile:

    $ gpconfig -c krb_server_keyfile -v  '/home/gpadmin/ggdb-freeipa.keytab'

    Результат должен выглядеть следующим образом:

    20250109:11:30:05:004599 gpconfig:mdw:gpadmin-[INFO]:-completed successfully with parameters '-c krb_server_keyfile -v /home/gpadmin/ggdb-freeipa.keytab'
  2. Откройте файл pg_hba.conf для редактирования:

    $ vi $MASTER_DATA_DIRECTORY/pg_hba.conf

    Добавьте в этот файл следующую строку:

    # connection-type  database  user   address  auth-method  auth-options
    host               all       alice  samenet  gss          include_realm=1 krb_realm=EXAMPLE.COM map=user_map

    Эта конфигурация позволяет пользователю alice получить доступ к любой базе данных с использованием GSSAPI-аутентификации (auth-method установлен в gss). Параметры GSSAPI-аутентификации указываются в поле auth-options:

    • include_realm — 1 означает, что имя области включено в принципалы пользователей.

    • krb_realm — устанавливает имя области Kerberos в EXAMPLE.COM.

    • map — указывает, что user_map используется для сопоставления принципалов Kerberos и ролей СУБД. Фактическое сопоставление определяется в файле pg_ident.conf.

  3. Откройте файл pg_ident.conf:

    $ vi $MASTER_DATA_DIRECTORY/pg_ident.conf

    Задайте сопоставление принципала alice@EXAMPLE.COM и роли alice, как показано ниже:

    # MAPNAME  SYSTEM-USERNAME    PG-USERNAME
    user_map   alice@EXAMPLE.COM  alice
  4. Перезагрузите конфигурацию с помощью gpstop, чтобы применить изменения:

    $ gpstop -u

Подключение к базе данных

В этом разделе описывается подключение к базе данных, защищенной аутентификацией GSSAPI, с использованием psql. Выполните описанные ниже шаги на мастер-хосте.

  1. Перед подключением к базе данных создайте тикет на предоставление тикетов (Ticket-Granting Ticket, TGT) для пользователя alice, используя команду kinit:

    $ kinit alice
  2. Введите пароль пользователя, заданный в разделе Создание обычного пользователя, и измените его, как предлагается в приглашении:

    Password for alice@EXAMPLE.COM:
    Password expired.  You must change it now.
    Enter new password:
    Enter it again:
  3. Убедитесь в успешном создании тикета, запустив команду klist:

    $ klist

    Результат должен выглядеть следующим образом:

    Ticket cache: KEYRING:persistent:997:997
    Default principal: alice@EXAMPLE.COM
    
    Valid starting       Expires              Service principal
    01/09/2025 12:05:07  01/10/2025 12:05:07  krbtgt/EXAMPLE.COM@EXAMPLE.COM
  4. Подключитесь к базе данных postgres, созданной по умолчанию, под ролью alice с помощью psql:

    $ psql postgres -U alice -h mdw.example.com

    Результат должен выглядеть следующим образом:

    psql (9.4.26)
    Type "help" for help.
    
    postgres=>
  5. Проверьте имя текущего пользователя:

    SELECT current_user;

    Команда должна вернуть следующее:

     current_user
    ---------------
     alice