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-файла
-
Скопируйте содержимое файла 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
-
Скопируйте keytab-файл (ggdb-kerberos.keytab), созданный на хосте Kerberos, в каталог /home/gpadmin/ на мастер-хосте Greengage DB.
-
Настройте владельца и права доступа для скопированного 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-аутентификации
-
Задайте путь к 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'
-
Откройте файл 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.
-
-
Откройте файл 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
-
Перезагрузите конфигурацию с помощью
gpstop
, чтобы применить изменения:$ gpstop -u
Подключение к базе данных
В этом разделе описывается подключение к базе данных, защищенной аутентификацией GSSAPI, с использованием psql. Выполните описанные ниже шаги на мастер-хосте.
-
Перед подключением к базе данных создайте тикет на предоставление тикетов (Ticket-Granting Ticket, TGT) для принципала
gpadmin/admin@EXAMPLE.COM
, используя командуkinit
:$ kinit -k -t ggdb-kerberos.keytab gpadmin/admin@EXAMPLE.COM
-
Убедитесь в успешном создании тикета, запустив команду
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
-
Подключитесь к базе данных
postgres
, созданной по умолчанию, под рольюgpadmin/admin
с помощьюpsql
:$ psql postgres -U "gpadmin/admin" -h mdw
Результат должен выглядеть следующим образом:
psql (9.4.26) Type "help" for help. postgres=#
-
Проверьте имя текущего пользователя:
SELECT current_user;
Команда должна вернуть следующее:
current_user --------------- gpadmin/admin
-
Если выйти из
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
-
Удалите существующие тикеты с помощью команды
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)