Postgres + GSSAPI

secure-postgresql-deployment-17-728Чисто ради интереса, решил попробовать настроить аутентификацию при подключению к PostgreSQL из ActiveDirectory развернутом на базе Samba 4.3. В общем, оказалось ничего сложного.

1. Заводим обычного пользователя в AD, под которым наш сервер PostgreSQL будет обращаться в AD, и выгружаем keytab следующим образом (из винды, которая в домене):

C:\>ktpass -princ postgresql/srv.krb.local@KRB.LOCAL -mapuser pguser -pass pgpass -out pgpass.keytab

где postgresql — имя службы (обязательно именно такое для PostgreSQL),
srv.krb.local — FQDN сервера, на котором работает PostgreSQL,
KRB.LOCAL — REALM нашего домена,
pguser — пользователь, которого мы завели в домене,
pgpass — пароль этого пользователя в домене,
pgpass.keytab — имя файла куда выгружаем все эти данные.

2. На сервере srv.krb.local необходимо установить и настроить Kerberos клиента. Если этот сервер был ранее введен в домен, то все это у Вас уже настроено. В противном случае необходимо установить пакет krb5-workstation (у Вас же там Centos, правда?) и привести файл /etc/krb5.conf примерно к такому виду:

[libdefaults]
        default_realm = KRB.LOCAL
        dns_lookup_realm = false
        dns_lookup_kdc = true

а в /etc/resolv.conf nameserver должен указывать на DNS сервер, который обслуживает Ваш AD

3. Запишем файл pgpass.keytab куда-нибудь на сервер srv.krb.local, где его сможет прочитать PostgreSQL. Я например его записал в /var/lib/pgsql/krb/pgpass.keytab и выставил права:

$ chown postgres:postgres /var/lib/pgsql/krb/pgpass.keytab
$ chmod 600 /var/lib/pgsql/krb/pgpass.keytab

4. В Файле postgresql.conf задаем параметры:

listen_addresses = '*'
krb_server_keyfile = '/var/lib/pgsql/krb/pgpass.keytab'

а в файле pg_hba.conf пишем:

host  all all 0.0.0.0/0 gss include_realm=0 krb_realm=KRB.LOCAL

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

5. Перечитываем настройки PostgreSQL:

# service postgresql-9.4 reload

6. Пользователи с именами аналогичными тем, что в домене должены обязательно присутствовать в PostgreSQL или же Вам потребуется делать map, используя файл pg_ident.conf, но я на этом останавливаться не буду, а просто создам пользователя в PostgreSQL как в домене, например, administrator.

postgres=# CREATE ROLE administrator LOGIN ;

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

$ whoami
administrator
 
$ klist 
Ticket cache: FILE:/tmp/krb5cc_500
Default principal: administrator@KRB.LOCAL
 
Valid starting     Expires            Service principal
03/02/16 18:09:22  03/03/16 04:09:22  krbtgt/KRB.LOCAL@KRB.LOCAL
        renew until 03/03/16 18:09:16
 
$ psql -h srv.krb.local postgres
psql (9.4.6)
Введите "help", чтобы получить справку.
 
postgres=> \conninfo
Вы подключены к базе данных "postgres" как пользователь "administrator" (сервер "srv.krb.local", порт "5432").
postgres=>

В общем это все.