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)