Задание 5: Настройка аутентификации по сертификатам
В этом разделе мы рассмотрим процесс проверки наличия сертификатов на узлах кластера, а также их практическое применение. Освоим настройку конфигурации для использования сертификатов, экспортирование переменных окружения для SSL и выполним вход в сеанс с аутентификацией по клиентскому сертификату.
Проверка наличия сертификатов
Сертификаты были сгенерированы и размещены на узлах кластера в «Задании 3: Сертификаты TLS». Тем не менее, в процессе удаления и очистки после неудачной попытки развертывания кластера с помощью Ansible каталоги с сертификатами стираются. Поэтому необходимо проверить их наличие, а также правильность установки владельца и прав на файлы:
[student@srv1 ~]$ for comp in srv{1..3}; do echo -e "\n$comp"; ssh $comp sudo ls -l /pg_ssl; done
Вывод команды:
srv1
итого 68
-rw------- 1 postgres postgres 4523 ноя 24 16:48 patroni.crt
-rw------- 1 postgres postgres 4535 ноя 24 16:48 patronietcd.crt
-rw------- 1 postgres postgres 1708 ноя 24 16:48 patronietcd.key
-rw------- 1 postgres postgres 1704 ноя 24 16:48 patroni.key
-rw------- 1 postgres postgres 4529 ноя 24 16:48 pgbouncer.crt
-rw------- 1 postgres postgres 1704 ноя 24 16:48 pgbouncer.key
-rw-r--r-- 1 postgres postgres 3790 ноя 24 16:48 postgres.crt
-rw------- 1 postgres postgres 1704 ноя 24 16:48 postgres.key
-rw-r----- 1 postgres pangolin_users 1273 ноя 24 16:48 root.crt
drwx---r-x 2 postgres postgres 4096 ноя 24 17:11 root_dir
-rw------- 1 postgres postgres 1708 ноя 24 16:48 root.key
-rw------- 1 postgres postgres 4516 ноя 24 16:48 server.crt
-rw------- 1 postgres postgres 1704 ноя 24 16:48 server.key
srv2
итого 68
-rw------- 1 postgres postgres 4523 ноя 24 16:48 patroni.crt
-rw------- 1 postgres postgres 4535 ноя 24 16:48 patronietcd.crt
-rw------- 1 postgres postgres 1704 ноя 24 16:48 patronietcd.key
-rw------- 1 postgres postgres 1704 ноя 24 16:48 patroni.key
-rw------- 1 postgres postgres 4529 ноя 24 16:48 pgbouncer.crt
-rw------- 1 postgres postgres 1704 ноя 24 16:48 pgbouncer.key
-rw-r--r-- 1 postgres postgres 3790 ноя 24 16:48 postgres.crt
-rw------- 1 postgres postgres 1704 ноя 24 16:48 postgres.key
-rw-r----- 1 postgres pangolin_users 1273 ноя 24 16:48 root.crt
drwx---r-x 2 postgres postgres 4096 ноя 24 17:11 root_dir
-rw------- 1 postgres postgres 1708 ноя 24 16:48 root.key
-rw------- 1 postgres postgres 4516 ноя 24 16:48 server.crt
-rw------- 1 postgres postgres 1708 ноя 24 16:48 server.key
srv3
итого 68
-rw-r--r-- 1 postgres postgres 4523 ноя 24 16:48 patroni.crt
-rw------- 1 postgres postgres 4535 ноя 24 16:48 patronietcd.crt
-rw------- 1 postgres postgres 1708 ноя 24 16:48 patronietcd.key
-rw------- 1 postgres postgres 1708 ноя 24 16:48 patroni.key
-rw-r--r-- 1 postgres postgres 4529 ноя 24 16:48 pgbouncer.crt
-rw------- 1 postgres postgres 1704 ноя 24 16:48 pgbouncer.key
-rw-r--r-- 1 postgres postgres 3790 ноя 24 16:48 postgres.crt
-rw------- 1 postgres postgres 1704 ноя 24 16:48 postgres.key
-rw------- 1 postgres postgres 1273 ноя 24 16:48 root.crt
drwxr-xr-x 2 postgres postgres 4096 ноя 24 16:56 root_dir
-rw------- 1 postgres postgres 1708 ноя 24 16:48 root.key
-rw-r--r-- 1 postgres postgres 4516 ноя 24 16:48 server.crt
-rw------- 1 postgres postgres 1704 ноя 24 16:48 server.key
Настройка конфигурации для использования сертификатов
Настройка СУБД на узлах кластера осуществляется с помощью централизованного файла конфигурации /etc/pangolin-manager/postgres.yml. В централизованном файле конфигурации наряду с параметрами PostgreSQL (postgresql.conf) размещаются настройки правил доступа из pg_hba.conf. Выглядят они следующим образом:
[student@srv1 ~]$ sudo -u postgres sed -n '/pg_hba:/,+10p' /etc/pangolin-manager/postgres.yml
pg_hba:
- host all postgres 127.0.0.1/32 scram-sha-256
- host all profile_tuz 127.0.0.1/32 scram-sha-256
- hostssl all patroni 127.0.0.1/32 scram-sha-256
- host all postgres <IP-Address1>/32 scram-sha-256
- hostssl all patroni <IP-Address1>/32 scram-sha-256
- host all profile_tuz <IP-Address1>/32 scram-sha-256
- host all postgres <IP-Address2>/32 scram-sha-256
- hostssl all patroni <IP-Address2>/32 scram-sha-256
- host all profile_tuz <IP-Address2>/32 scram-sha-256
- hostssl replication patroni 127.0.0.1/32 scram-sha-256
Приведенная выше команда использует потоковый редактор sed в режиме, который не изменяет содержимое исходного файла /etc/pangolin-manager/postgres.yml. Здесь получены десять строк, начиная со строки (не включая), содержащей pg_hba:.
Необходимо на мастере srv1 и на реплике srv2 добавить в файл следующие строки:
- hostssl all postgres <IP-Address1>/32 cert
- hostssl all postgres <IP-Address2>/32 cert
То есть, для успешной аутентификации ролью postgres при подключении с адресов <IP-Address1>/32 и <IP-Address2>/32 будет требоваться валидный сертификат.
Редактирование файла /etc/pangolin-manager/postgres.yml можно выполнить вручную с помощью текстового редактора (на srv1 и srv2).
Рекомендуется сохранить резервную копию этого файла (на каждом узле) перед редактированием.
В этом примере выполняется автоматическое редактирование этого файла на двух узлах: srv1 и srv2. В приведенной команде резервное копирование файла с расширением .bak выполняется автоматически.
Сначала отредактируем файл на мастере srv1:
[student@srv1 ~]$ sudo -u postgres vi /etc/pangolin-manager/postgres.yml
Затем зайдем на реплику с помощью SSH и сделаем то же самое:
[student@srv1 ~]$ ssh srv2
[student@srv2 ~]$ sudo -u postgres vi /etc/pangolin-manager/postgres.yml
- hostssl all postgres <IP-Address1>/32 cert
- hostssl all postgres <IP-Address1>/32 cert
Приведенные выше команды не будут работать, если их вызвать, указав их непосредственно в качестве аргумента команды ssh.
Экспортирование переменных окружения для SSL
Простейший способ указать местоположение сертификатов и ключей заключается в использовании переменных окружения. Поместим команды экспортирования этих переменных в конец файла профиля пользователя ОС postgres:
[student@srv1 ~]$ ssh srv1
[student@srv1 ~]$ sudo vi ~postgres/.bash_profile
export PGSSLROOTCERT=/pg_ssl/root.crt
export PGSSLKEY=/pg_ssl/postgres.key
export PGSSLCERT=/pg_ssl/postgres.crt
Теперь добавим эти же строки в профиль postgres на реплике srv2:
[student@srv1 ~]$ sudo -u postgres tail -3 ~postgres/.bash_profile | ssh srv2 sudo -u postgres tee -a ~postgres/.bash_profile
Вывод на экран:
export PGSSLROOTCERT=/pg_ssl/root.crt
export PGSSLKEY=/pg_ssl/postgres.key
export PGSSLCERT=/pg_ssl/postgres.crt
Проверка:
[student@srv1 ~]$ for comp in srv{1..2}; do echo -e "\n$comp"; ssh $comp sudo -u postgres tail -3 ~postgres/.bash_profile; done
srv1
export PGSSLROOTCERT=/pg_ssl/root.crt
export PGSSLKEY=/pg_ssl/postgres.key
export PGSSLCERT=/pg_ssl/postgres.crt
srv2
export PGSSLROOTCERT=/pg_ssl/root.crt
export PGSSLKEY=/pg_ssl/postgres.key
export PGSSLCERT=/pg_ssl/postgres.crt
Вход в сеанс с аутентификацией по клиентскому сертификату
Перечитаем конфигурацию СУБД Pangolin:
[student@srv1 ~]$ sudo systemctl reload pangolin-manager
[student@srv1 ~]$ ssh srv2
Можете воспользоваться переключением на сервер srv2 или зайдите в соседнем окне на него и выполните команду.
[student@srv2 ~]$ sudo systemctl reload pangolin-manager
Войдем в сеанс от имени суперпользователя, потребовав аутентификации по SSL (последнее не требуется, но сделано для подтверждения):
[student@srv1 ~]$ ssh srv1
[student@srv1 ~]$ sudo su - postgres
[postgres@srv1 ~]$ psql "sslmode=require"
psql (15.5)
SSL-соединение (протокол: TLSv1.3, шифр: TLS_AES_256_GCM_SHA384, сжатие: выкл.)
Введите "help", чтобы получить справку.
postgres=# \conninfo
Вы подключены к базе данных "postgres" как пользователь "postgres" (сервер "<IP-Address1>", порт "5433").
SSL-соединение (протокол: TLSv1.3, шифр: TLS_AES_256_GCM_SHA384, сжатие: выкл.)
Параметр sslmode=require строки соединения библиотеки libpq требует аутентификации клиента (то есть, psql) с использованием сертификата SSL.