Кerberos, LDAP, PAM для PostgreSQL на сервере FreeIPA

Настроим аутентификацию PostgreSQL методами Кerberos, LDAP, PAM на сервере FreeIPA.

Имеем две машины — одна для PostgreSQL, другая для домена на FreeIPA

vav-pg.domain.local
vav-packs.domain.local

Разворачиваем сервер freeipa

Разворачиваем домен средствами freeipa на vav-packs

sudo tee -a /etc/hosts > /dev/null <<EOT
XXX.XXX.XXX.101   vav-pg  vav-pg.domain.local
XXX.XXX.XXX.100  vav-packs  vav-packs.domain.local
EOT

sudo hostnamectl set-hostname vav-packs.domain.local

sudo setenforce 0

sudo sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
sudo reboot
sudo -i

yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

yum install -y yum-utils

yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin

systemctl start docker

systemctl enable docker

mkdir /var/lib/ipa-data

tee -a /var/lib/ipa-data/ipa-server-install-options > /dev/null <<EOT
--realm=DOMAIN.LOCAL
--ds-password=freeipaDSpass1
--admin-password=freeipaADMINpass1
EOT
docker run -ti -h vav-packs.domain.local --read-only \
    -v /sys/fs/cgroup:/sys/fs/cgroup:ro \
    --name freeipa \
    --network host \
    -v /var/lib/ipa-data:/data:Z -v /etc/hosts:/etc/hosts \
    -e PASSWORD=Secret123 \
    freeipa/freeipa-server:centos-7 ipa-server-install -U -r DOMAIN.LOCAL --no-ntp

Ставим клиента freeipa

Ставим клиента freeipa на сервере vav-pg

sudo tee -a /etc/hosts > /dev/null <<EOT
XXX.XXX.XXX.101   vav-pg  vav-pg.domain.local
XXX.XXX.XXX.100  vav-packs  vav-packs.domain.local
EOT

sudo hostnamectl set-hostname vav-pg.domain.local

sudo setenforce 0

sudo sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
sudo reboot
sudo -i

yum install freeipa-client

ipa-client-install --mkhomedir --domain=domain.local --server=vav-packs.domain.local

# проверка

kinit admin
klist

Добавляем пользователя и сервис с сервера vav-pg

ipa user-add pguser --first=pguser --last=PG --password
ipa service-add postgres/vav-pg.domain.local@DOMAIN.LOCAL --force

Настраиваем PostgreSQL для Kerberos

Ставим PostgreSQL на сервере vav-pg

Создаем key файл на сервере vav-pg

ipa-getkeytab --principal=postgres/vav-pg.domain.local@DOMAIN.LOCAL --keytab=/etc/krb5.keytab
chown postgres:postgres /etc/krb5.keytab

Правим конфигурацию PostgreSQL

listen_addresses = '*'
krb_server_keyfile = '/etc/krb5.keytab'

и hba

host    all     pguser                  0.0.0.0/0               gss  include_realm=0 krb_realm=DOMAIN.LOCAL

Выполняем RESTART PostgreSQL

Создаем пользователя

sudo su - postgres
psql -c "CREATE USER pguser"

Проверяем подключение через gss

sudo su - postgres

kinit pguser

$ psql -h vav-pg.domain.local -U pguser postgres
psql (14.2)
GSSAPI-encrypted connection
Type "help" for help.
postgres=> 

Ставим openldap-clients

Ставим openldap-clients на сервере vav-pg

yum install openldap-clients -y

Добавляем пользователя на vav-pg

ipa user-add pgldap --first=pgldap --last=PG --password

Проверяем подключение

ldapsearch -x -h vav-packs.domain.local -b dc=domain,dc=local uid=pgldap

Настраиваем PostgreSQL для LDAP

Создаем пользователя

sudo su - postgres
psql -c "CREATE USER pguser"

Правим hba

host    all     pgldap                  0.0.0.0/0              ldap ldapserver=vav-packs.domain.local ldapbasedn="cn=users,cn=compat,dc=domain,dc=local" ldapsearchattribute=uid

Выполняем RELOAD PostgreSQL

Проверяем подключение

sudo su - postgres

$ psql -h vav-pg.domain.local -U pgldap postgres
Password for user pgldap:
psql (14.2)
GSSAPI-encrypted connection
Type "help" for help.
postgres=>

PAM + pgbouncer

pgbouncer может работать только со следующими типами авторизации: any, trust, plain, md5, cert, hba, pam.

Следовательно, мы не можем указать ldap или gss.

Существует способ использовать ldap авторизацию через pam авторизацию на локальном сервере.

Создадим пользователя

psql > create user pgpam;

Создадим и отредактируем файл /etc/pam.d/postgresql

touch /etc/pam.d/postgresql

#%PAM-1.0

auth  include  system-auth

account  include system-auth

password  include system-auth
session  include system-auth

Дадим права на чтение shadow — не очень хороший вариант

chmod 404 /etc/shadow

Внесем изменения в для авторизации в домене /pg_data1/pg14/pg_hba.conf

host    all     pgpam                  0.0.0.0/0              ldap ldapserver=vav-packs.domain.local ldapbasedn="cn=users,cn=compat,dc=domain,dc=local" ldapsearchattribute=uid

Если нужен просто PAM, то достаточно

host    all     pgpam                  0.0.0.0/0               pam pamservice=postgresql

Выполним reload postgresql

Добавим системного пользователя и создадим его в домене

useradd -m pgpam
ipa user-add pgpam --first=Дмитрий --last=Моск --password

Создадим файл для авторизации в домене

touch /etc/pam.d/authorization
# authorization: auth account
auth optional pam_krb5.so use_first_pass use_kcminit default_principal
auth sufficient pam_krb5.so use_first_pass default_principal
auth optional pam_ntlm.so use_first_pass
auth required pam_opendirectory.so use_first_pass nullok
account required pam_opendirectory.so

И изменим строчки в /etc/pgbouncer/pgbouncer.ini

[databases]
;;* = host=127.0.0.1 port=5432 auth_user=postgres
* = host=127.0.0.1 port=5432
;;; Authentication settings
;; any, trust, plain, md5, cert, hba, pam
auth_type = pam 

Проверка подключения к posgres

[centos@vav-pg1 ~]$  psql -h vav-pg.domain.local -p 5432 -U pgpam postgres
Password for user pgpam:
psql (10.20, server 14.2)
WARNING: psql major version 10, server major version 14.
         Some psql features might not work.
Type "help" for help.
postgres=> 

К pgbouncer

[centos@vav-pg1 ~]$  psql -h vav-pg.domain.local -p 6432 -U pgpam postgres
Password for user pgpam:
psql (10.20, server 14.2)
WARNING: psql major version 10, server major version 14.
         Some psql features might not work.
Type "help" for help.
postgres=> 

Добавить комментарий

Ваш адрес email не будет опубликован.