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:

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

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

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

  • Сервисный принципал: postgres/mdw@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 yum 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
        default_tgs_enctypes = aes128-cts des3-hmac-sha1 des-cbc-crc des-cbc-md5
        default_tkt_enctypes = aes128-cts des3-hmac-sha1 des-cbc-crc des-cbc-md5
        permitted_enctypes = aes128-cts des3-hmac-sha1 des-cbc-crc des-cbc-md5
  • В секции 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
    default_tgs_enctypes = aes128-cts des3-hmac-sha1 des-cbc-crc des-cbc-md5
    default_tkt_enctypes = aes128-cts des3-hmac-sha1 des-cbc-crc des-cbc-md5
    permitted_enctypes = aes128-cts des3-hmac-sha1 des-cbc-crc des-cbc-md5

[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/mdw@EXAMPLE.COM"

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

ПРИМЕЧАНИЕ

Имя хоста в имени принципала должно совпадать с выводом команды hostname на мастер-хосте Greengage DB. Если команда hostname показывает полное доменное имя (FQDN), используйте его в имени принципала, например, postgres/mdw.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/mdw@EXAMPLE.COM

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

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

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

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

$ ssh gpadmin@mdw.example.com

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

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

$ sudo apt install krb5-user sssd-krb5
$ sudo yum 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
        default_tgs_enctypes = aes128-cts des3-hmac-sha1 des-cbc-crc des-cbc-md5
        default_tkt_enctypes = aes128-cts des3-hmac-sha1 des-cbc-crc des-cbc-md5
        permitted_enctypes = aes128-cts des3-hmac-sha1 des-cbc-crc des-cbc-md5
    
    [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'

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

    20241219:12:41:25:005039 gpconfig:mdw:gpadmin-[INFO]:-completed successfully with parameters '-c krb_server_keyfile -v /home/gpadmin/ggdb-kerberos.keytab'
  2. Откройте файл pg_hba.conf для редактирования:

    $ vi $MASTER_DATA_DIRECTORY/pg_hba.conf

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

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

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

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

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

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

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

    $ vi $MASTER_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_998
    Default principal: gpadmin/admin@EXAMPLE.COM
    
    Valid starting       Expires              Service principal
    12/19/2024 12:46:13  12/19/2024 22:46:13  krbtgt/EXAMPLE.COM@EXAMPLE.COM
            renew until 12/26/2024 12:46:13
  3. Подключитесь к базе данных postgres, созданной по умолчанию, под ролью gpadmin/admin с помощью psql:

    $ psql postgres -U "gpadmin/admin" -h mdw

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

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

    SELECT current_user;

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

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

    Ticket cache: FILE:/tmp/krb5cc_998
    Default principal: gpadmin/admin@EXAMPLE.COM
    
    Valid starting       Expires              Service principal
    12/19/2024 12:46:13  12/19/2024 22:46:13  krbtgt/EXAMPLE.COM@EXAMPLE.COM
            renew until 12/26/2024 12:46:13
    12/19/2024 12:47:19  12/19/2024 22:46:13  postgres/mdw@
            renew until 12/26/2024 12:46:13
            Ticket server: postgres/mdw@EXAMPLE.COM
  6. Удалите существующие тикеты с помощью команды kdestroy:

    $ kdestroy

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

    psql: GSSAPI continuation error: No credentials were supplied, or the credentials were unavailable or inaccessible
    GSSAPI continuation error: No Kerberos credentials available (default cache: FILE:/tmp/krb5cc_998)