Привет, Я DocuDroid!
Оценка ИИ поиска
Спасибо за оценку нашего ИИ поиска!
Мы будем признательны, если вы поделитесь своими впечатлениями, чтобы мы могли улучшить наш ИИ поиск для вас и других читателей.
GitHub

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

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

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

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

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

  • Координатор-хост: имя — cdw, FQDN — cdw.example.com.

  • Хост Kerberos: имя — kdc, FQDN — kdc.example.com.

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

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

  • Административный принципал: gpadmin/admin@EXAMPLE.COM.

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

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

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

$ ssh sampleuser@kdc.example.com

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

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

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

$ sudo apt install krb5-kdc krb5-admin-server
$ sudo dnf install krb5-libs krb5-server krb5-workstation

Если во время установки необходимо задать область по умолчанию и имена серверов Kerberos, используйте следующие значения:

  • Для области по умолчанию используйте EXAMPLE.COM.

  • Для серверов Kerberos используйте kdc.example.com.

Редактирование krb5.conf

Откройте файл krb5.conf для редактирования:

$ sudo vi /etc/krb5.conf

Необходимо задать следующие параметры:

  • В секции libdefaults установите default_realm в значение EXAMPLE.COM:

    [libdefaults]
        default_realm = EXAMPLE.COM
        dns_lookup_realm = false
        dns_lookup_kdc = false
        ticket_lifetime = 24h
        renew_lifetime = 7d
        forwardable = true
  • В секции realms укажите следующие параметры для области EXAMPLE.COM:

    [realms]
        EXAMPLE.COM = {
            kdc = kdc.example.com
            admin_server = kdc.example.com
            default_domain = example.com
        }
  • Обновите секцию domain_realm следующим образом:

    [domain_realm]
        .example.com = EXAMPLE.COM
        example.com = EXAMPLE.COM

Файл krb5.conf должен выглядеть следующим образом:

[libdefaults]
    default_realm = EXAMPLE.COM
    dns_lookup_realm = false
    dns_lookup_kdc = false
    ticket_lifetime = 24h
    renew_lifetime = 7d
    forwardable = true

[realms]
    EXAMPLE.COM = {
        kdc = kdc.example.com
        admin_server = kdc.example.com
        default_domain = example.com
    }

[domain_realm]
    .example.com = EXAMPLE.COM
    example.com = EXAMPLE.COM

Редактирование kdc.conf

Откройте файл kdc.conf для редактирования:

$ sudo vi /etc/krb5kdc/kdc.conf
$ sudo vi /var/kerberos/krb5kdc/kdc.conf

Обновите имя области в секции realms:

[kdcdefaults]
    kdc_ports = 750,88

[realms]
    EXAMPLE.COM = {
        database_name = /var/lib/krb5kdc/principal
        admin_keytab = FILE:/etc/krb5kdc/kadm5.keytab
        acl_file = /etc/krb5kdc/kadm5.acl
        key_stash_file = /etc/krb5kdc/stash
        kdc_ports = 750,88
        max_life = 10h 0m 0s
        max_renewable_life = 7d 0h 0m 0s
        #master_key_type = aes256-cts
        #supported_enctypes = aes256-cts:normal aes128-cts:normal
        default_principal_flags = +preauth
    }
[kdcdefaults]
    kdc_ports = 88
    kdc_tcp_ports = 88

[realms]
    EXAMPLE.COM = {
        #master_key_type = aes256-cts
        acl_file = /var/kerberos/krb5kdc/kadm5.acl
        dict_file = /usr/share/dict/words
        admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab
        supported_enctypes = aes256-cts:normal aes128-cts:normal des3-hmac-sha1:normal arcfour-hmac:normal camellia256-cts:normal camellia128-cts:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal
    }

Редактирование kadm5.acl

Откройте файл kadm5.acl:

$ sudo vi /etc/krb5kdc/kadm5.acl
$ sudo vi /var/kerberos/krb5kdc/kadm5.acl

Чтобы предоставить административные права всем принципалам с именем экземпляра admin, добавьте следующую строку:

*/admin@EXAMPLE.COM    *

EXAMPLE.COM — это область, к которой применяется данное правило.

Создание базы данных Kerberos

Создайте базу данных Kerberos, которая хранит ключи для областей, управляемых сервером KDC. Для этого используйте утилиту kdb5_util:

$ sudo kdb5_util create -s

Введите мастер-ключ базы данных Kerberos и нажмите Enter, когда будут показаны следующие приглашения:

Enter KDC database master key:
Re-enter KDC database master key to verify:

Запуск сервисов Kerberos

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

$ sudo systemctl start krb5-admin-server
$ sudo systemctl status krb5-admin-server
$ sudo systemctl enable krb5-admin-server
$ sudo systemctl start kadmin
$ sudo systemctl status kadmin
$ sudo systemctl enable kadmin

Выполните те же команды для сервера KDC:

$ sudo systemctl start krb5-kdc
$ sudo systemctl status krb5-kdc
$ sudo systemctl enable krb5-kdc
$ sudo systemctl start krb5kdc
$ sudo systemctl status krb5kdc
$ sudo systemctl enable krb5kdc

Создание принципалов

Выполните описанные ниже шаги на хосте Kerberos, чтобы создать два принципала:

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

  • Принципал с административными привилегиями в Kerberos KDC. Этот принципал будет сопоставлен с соответствующей ролью Greengage DB.

ПРИМЕЧАНИЕ

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

Создание сервисного принципала

Создайте принципала, соответствующего процессу postgres на координатор-хосте Greengage DB:

$ sudo kadmin.local -q "addprinc -randkey postgres/cdw@EXAMPLE.COM"

Опция -randkey позволяет пропустить ввод пароля.

ПРИМЕЧАНИЕ

Имя хоста в имени принципала должно совпадать с выводом команды hostname на координатор-хосте Greengage DB. Если команда hostname показывает полное доменное имя (FQDN), используйте его в имени принципала, например, postgres/cdw.example.com@EXAMPLE.COM.

Создание административного принципала

Создайте принципала gpadmin/admin с административными привилегиями:

$ sudo kadmin.local -q "addprinc gpadmin/admin@EXAMPLE.COM"

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

Enter password for principal "gpadmin/admin@EXAMPLE.COM":
Re-enter password for principal "gpadmin/admin@EXAMPLE.COM":

Создание keytab-файла

Когда сервисный и административный принципалы созданы, их нужно добавить в keytab-файл. Сначала выполните команду listprincs, чтобы убедиться, что принципалы созданы:

$ sudo kadmin.local -q "listprincs"

Вывод должен включать следующие строки:

gpadmin/admin@EXAMPLE.COM
# ...
postgres/cdw@EXAMPLE.COM

Затем используйте команду ktadd, чтобы добавить оба принципала в файл ggdb-kerberos.keytab:

$ sudo kadmin.local -q "ktadd -k ggdb-kerberos.keytab postgres/cdw@EXAMPLE.COM gpadmin/admin@EXAMPLE.COM"

Настройка координатора Greengage DB

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

$ ssh gpadmin@cdw.example.com

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

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

$ sudo apt install krb5-user sssd-krb5
$ sudo dnf install krb5-libs krb5-workstation

Если во время установки необходимо задать область по умолчанию и имена серверов Kerberos, используйте следующие значения:

  • Для области по умолчанию используйте EXAMPLE.COM.

  • Для серверов Kerberos используйте kdc.example.com.

Копирование конфигурации Kerberos и keytab-файла

  1. Скопируйте содержимое файла krb5.conf с хоста Kerberos в файл /etc/krb5.conf на координатор-хосте Greengage DB. Файл krb5.conf выглядит следующим образом:

    [libdefaults]
        default_realm = EXAMPLE.COM
        dns_lookup_realm = false
        dns_lookup_kdc = false
        ticket_lifetime = 24h
        renew_lifetime = 7d
        forwardable = true
    
    [realms]
        EXAMPLE.COM = {
            kdc = kdc.example.com
            admin_server = kdc.example.com
            default_domain = example.com
        }
    
    [domain_realm]
        .example.com = EXAMPLE.COM
        example.com = EXAMPLE.COM
  2. Скопируйте keytab-файл (ggdb-kerberos.keytab), созданный на хосте Kerberos, в каталог /home/gpadmin/ на координатор-хосте Greengage DB.

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

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

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

Создайте роль gpadmin/admin с правами суперпользователя в Greengage DB:

$ createuser gpadmin/admin --superuser

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

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

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

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

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

    20260420:11:28:56:011587 gpconfig:cdw:gpadmin-[INFO]:-completed successfully with parameters '-c krb_server_keyfile -v /home/gpadmin/ggdb-kerberos.keytab'
  2. Откройте файл pg_hba.conf для редактирования:

    $ vi $COORDINATOR_DATA_DIRECTORY/pg_hba.conf

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

    # connection-type  database  user           address  auth-method  auth-options
    hostgssenc         all       gpadmin/admin  samenet  gss          krb_realm=EXAMPLE.COM map=admin_map

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

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

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

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

    $ vi $COORDINATOR_DATA_DIRECTORY/pg_ident.conf

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

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

    $ gpstop -u

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

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

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

    $ kinit -k -t ggdb-kerberos.keytab gpadmin/admin@EXAMPLE.COM
  2. Убедитесь в успешном создании тикета, запустив команду klist:

    $ klist

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

    Ticket cache: FILE:/tmp/krb5cc_999
    Default principal: gpadmin/admin@EXAMPLE.COM
    
    Valid starting     Expires            Service principal
    04/20/26 13:12:09  04/20/26 23:12:09  krbtgt/EXAMPLE.COM@EXAMPLE.COM
            renew until 04/27/26 13:12:09
  3. Подключитесь к базе данных postgres, созданной по умолчанию, под ролью gpadmin/admin с помощью psql:

    $ PGGSSENCMODE=require psql postgres -U "gpadmin/admin" -h cdw

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

    psql (12.22)
    GSSAPI-encrypted connection
    Type "help" for help.
    
    postgres=#
  4. Проверьте имя текущего пользователя:

    SELECT current_user;

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

     current_user
    ---------------
     gpadmin/admin
  5. Если выйти из psql и снова выполнить команду klist, вывод будет включать не только TGT, но и сервис выдачи тикетов (Ticket Granting Service, TGS) — postgres/cdw@EXAMPLE.COM. Этот сервис необходим для реализации протокола аутентификации Kerberos в Greengage DB.

    Ticket cache: FILE:/tmp/krb5cc_999
    Default principal: gpadmin/admin@EXAMPLE.COM
    
    Valid starting     Expires            Service principal
    04/20/26 13:12:09  04/20/26 23:12:09  krbtgt/EXAMPLE.COM@EXAMPLE.COM
            renew until 04/27/26 13:12:09
    04/20/26 13:13:23  04/20/26 23:12:09  postgres/cdw@
            renew until 04/27/26 13:12:09
            Ticket server: postgres/cdw@EXAMPLE.COM
  6. Удалите существующие тикеты с помощью команды kdestroy:

    $ kdestroy

    Затем попробуйте снова подключиться к координатор-хосту, используя psql. Должна быть выдана следующая ошибка:

    psql: error: GSSAPI encryption required but was impossible (possibly no credential cache, no server support, or using a local socket)