Перейти к основному содержимому

Задание 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.

Подведем итоги​

Вопрос 1

Вопрос 1: В каком файле находятся централизованные настройки СУБД и правила pg_hba.conf?

Вопрос 2

Вопрос 2: Какие методы аутентификации HBA будут работать при настройке параметра ssl=off?

Вопрос 3

Вопрос 3: Какая переменная окружения указывает на сертификат аутентифицируемого пользователя?