Настроим аутентификацию 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=>