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

Задание 5: Настройка аутентификации по сертификатам

В этом разделе мы рассмотрим настройку аутентификации по сертификатам. Мы научимся конфигурировать систему для ее использования, проверять настройки HBA, размещать сертификат для пользователя и выполнять проверку работоспособности данного метода.

Настройка конфигурации для аутентификации по сертификатам​

Исходная конфигурация перед выполнением этой лабораторной работы получена в результате выполнения задания 5 «Задание 5: Настройка аутентификации по сертификатам».

Добавьте в файл конфигурации config.yml следующие настройки:

# Custom HBA
hba_rules: ['host all +all-sa-pam-group 0.0.0.0/0 ldap {{ ldap_pam_parameters }}',
'host all +as_admin, +as_admin_read 0.0.0.0/0 ldap {{ ldap_users_parameters }}',
'hostssl all student 0.0.0.0/0 cert',
'hostssl all postgres 0.0.0.0/0 cert']

Обратите внимание на строки:

'hostssl all student 0.0.0.0/0 cert'
'hostssl all postgres 0.0.0.0/0 cert'

Эта строка должна быть включена в результирующую конфигурацию HBA (Host Based Authentication) для аутентификации роли student по ее пользовательскому сертификату.

Далее выполните установку средствами Pangolin Installer по аналогии с предыдущими лабораторными заданиями этой темы.

Проверка настройки HBA​

При успешном завершении развертывания кластера Pangolin он уже должен быть запущен. Проверьте это:

[student@srv1 ~]$ sudo su - postgres
===============================================================
You are connected to Pangolin Cluster (Pobeda)
- Hostname : srv1
- IP Address : <IP-Address1>
---------------------------------------------------------------
- node ( master ) : <IP-Address1>
- node ( replica ) : <IP-Address2>
- arbiter : <IP-Address3>
- Manager version : 2.1.13
- Pangolin version : 6.7.0
===============================================================
[postgres@srv1 ~]$ list
+ Cluster: Pobeda (7630156715853689531) --------+----+-----------+-----------------+
| Member | Host | Role | State | TL | Lag in MB | Pending restart |
+--------+-----------+--------------+-----------+----+-----------+-----------------+
| srv1 | srv1:5433 | Leader | running | 2 | | |
| srv2 | srv2:5433 | Sync Standby | streaming | 2 | 0 | |
+--------+-----------+--------------+-----------+----+-----------+-----------------+

Получите настройки HBA в файле конфигурации Pangolin /etc/pangolin-manager/postgres.yml:

[postgres@srv1 ~]$ sed -n '/hba/,/monitoring/p' /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
- hostssl replication patroni <IP-Address1>/32 scram-sha-256
- hostssl replication patroni <IP-Address2>/32 scram-sha-256
...
- hostssl all student 0.0.0.0/0 cert
- hostssl all postgres 0.0.0.0/0 cert

Обратите внимание на присутствие среди правил HBA строки:

- hostssl all student 0.0.0.0/0 cert
- hostssl all postgres 0.0.0.0/0 cert

Чтобы вход в psql по сертификатам для postgres работал, необходимо перенести строку - hostssl all postgres 0.0.0.0/0 cert в начало списка:

Примечание

Действие необходимо сделать на серверах srv1 и srv2.

[postgres@srv1 ~]$ vi /etc/pangolin-manager/postgres.yml
pg_hba:
- hostssl all postgres 0.0.0.0/0 cert
- 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
- hostssl replication patroni <IP-Address1>/32 scram-sha-256
- hostssl replication patroni <IP-Address2>/32 scram-sha-256
...
- hostssl all student 0.0.0.0/0 cert

После этого необходимо выполнить рестарт сервиса:

[postgres@srv1 ~]$ pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml restart $CLNAME

Подключитесь к СУБД и проверьте актуальность настроек средствами SQL:

[postgres@srv1 ~]$ psql
psql (15.15)
SSL-соединение (протокол: TLSv1.3, шифр: TLS_AES_256_GCM_SHA384, сжатие: выкл.)
Введите "help", чтобы получить справку.
postgres=# SELECT type, database, user_name, address, auth_method FROM pg_hba_file_rules;
type | database | user_name | address | auth_method
---------+---------------+----------------------------+---------------+---------------
hostssl | {all} | {postgres} | 0.0.0.0 | cert
host | {all} | {postgres} | 127.0.0.1 | scram-sha-256
host | {all} | {profile_tuz} | 127.0.0.1 | scram-sha-256
hostssl | {all} | {patroni} | 127.0.0.1 | scram-sha-256
host | {all} | {postgres} | <IP-Address1> | scram-sha-256
hostssl | {all} | {patroni} | <IP-Address1> | scram-sha-256
host | {all} | {profile_tuz} | <IP-Address1> | scram-sha-256
host | {all} | {postgres} | <IP-Address2> | scram-sha-256
hostssl | {all} | {patroni} | <IP-Address2> | scram-sha-256
host | {all} | {profile_tuz} | <IP-Address2> | scram-sha-256
hostssl | {replication} | {patroni} | 127.0.0.1 | scram-sha-256
hostssl | {replication} | {patroni} | <IP-Address1> | scram-sha-256
hostssl | {replication} | {patroni} | <IP-Address2> | scram-sha-256
host | {all} | {+as_TUZ,backup_user} | 0.0.0.0 | scram-sha-256
host | {all} | {+all-sa-pam-group} | 0.0.0.0 | ldap
host | {all} | {+as_admin,+as_admin_read} | 0.0.0.0 | ldap
hostssl | {all} | {student} | 0.0.0.0 | cert
(17 rows)

Предполагается, что единственная роль, для которой настроена аутентификация cert - это student. Проверьте это:

postgres=# SELECT type, database, unnest(user_name) role, address, auth_method FROM pg_hba_file_rules WHERE auth_method = 'cert';
type | database | role | address | auth_method
---------+----------+----------+---------+-------------
hostssl | {all} | postgres | 0.0.0.0 | cert
hostssl | {all} | student | 0.0.0.0 | cert
(2 rows)

Зарегистрируйте роль student и одноименную базу данных для него:

postgres=# CREATE USER student;
CREATE ROLE
postgres=# CREATE DATABASE student OWNER student;
CREATE DATABASE
postgres=# \q
[postgres@srv1 ~]$ exit

Генерация сертификата для пользователя​

В сеансе пользователя ОС student создайте в его домашнем каталоге подкаталог .postgresql, в котором будут размещены сертификаты для его аутентификации:

[student@srv1 ~]$ mkdir .postgresql
[student@srv1 ~]$ ls -ld .postgresql/
drwxr-xr-x 2 student student 4096 апр 25 20:08 .postgresql/

В процессе установки некоторые права владения на файлы в каталоге ~student/cert могли быть изменены, верните их пользователю student:

sudo chown -R student:student ~student/cert

Сгенерируйте запрос на сертификат:

[student@srv1 ~]$ cd cert/crt/
[student@srv1 crt]$ ls
patroni.crt patronietcd.crt patronietcd.key pgbouncer.crt pgbouncer.key postgres.csr server.crt server.key
patroni.csr patronietcd.csr patroni.key pgbouncer.csr postgres.crt postgres.key server.csr
[student@srv1 crt]$ openssl req -new -nodes -text -out student.csr -keyout student.key -config ~/cert/cnf/client.cnf -subj "/CN=student"
.+......+++++++++++++++++++++++++++++++++++++++*...+...+.....+++++++++++++++++++++++++++++++++++++++*.....+...+..+............................+..+...+.......+........+...+....+...+...+..+............+.+..+.......+.....+.......+...+...+..+...+...+.+...............+......+...+.................+....+...........+...+....+.......................+...+.........+.+.....+....+..+..........+...........+.......+...+.........+...........+..........+..+...++++++
......+.....+.......+++++++++++++++++++++++++++++++++++++++*.....+++++++++++++++++++++++++++++++++++++++*..+..........+........+....+.....+.+...........++++++
-----

Проверьте результат:

[student@srv1 crt]$ openssl req -noout -text -in student.csr -reqopt no_sigdump,no_validity,no_pubkey
Certificate Request:
Data:
Version: 1 (0x0)
Subject: CN=student
Attributes:
Requested Extensions:
X509v3 Basic Constraints:
CA:FALSE
X509v3 Key Usage:
Digital Signature, Non Repudiation, Key Encipherment

Сгенерируйте сертификат:

[student@srv1 crt]$ openssl x509 -req -in student.csr -text -days 1800 -CA ~/cert/ca_ssl/root.crt -CAkey ~/cert/ca_ssl/root.key -CAcreateserial -out student.crt -extfile ~/cert/cnf/client.cnf
Certificate request self-signature ok
subject=CN=student

Проверьте результат:

[student@srv1 crt]$ openssl x509 -noout -text -in student.crt
Вывод команды:

Certificate:
Data:
Version: 3 (0x2)
Serial Number:
3e:da:b7:7b:ae:99:45:92:71:e8:a2:6f:02:71:be:71:3e:89:f0:13
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=RU, ST=Moscow, L=Moscow, O=Sbt, CN=CA_DBP2
Validity
Not Before: Apr 25 18:35:01 2026 GMT
Not After : Mar 30 18:35:01 2031 GMT
Subject: CN=student
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
00:b5:41:fc:e5:a0:ea:e7:60:97:d3:8d:4c:62:5d:
45:6a:a6:de:97:a1:ed:2b:60:f6:44:91:ef:ef:97:
48:01:d1:43:26:f4:78:56:5c:bb:66:dd:b5:3e:e3:
57:8d:e9:ff:f4:b9:02:31:22:39:27:5b:e3:87:63:
8b:f1:f0:f3:e7:7c:e5:a6:0e:ae:d5:51:37:6e:39:
c9:3d:aa:24:e0:0c:30:65:65:c9:cd:4e:b9:e2:b9:
00:55:80:10:05:b3:88:19:ed:96:38:0d:4b:0b:e9:
e2:e5:8b:5f:89:96:c6:0c:72:5c:8d:f5:db:e0:a3:
8e:64:46:a8:9f:1a:c6:49:80:ce:2a:67:f4:02:27:
ee:72:e8:ec:68:1d:c0:1d:c2:60:12:4d:1e:9e:37:
1f:77:b9:28:2d:64:07:3e:c8:98:e4:2b:d4:c7:80:
ad:38:e3:9e:94:52:85:20:41:38:e7:93:96:d0:c3:
3f:e2:bb:61:30:22:97:e8:37:ce:fc:23:fd:9e:1d:
6e:7b:2c:01:f2:91:d5:cc:32:c1:27:41:f5:03:cf:
14:ed:2c:d9:e5:09:9e:6d:fa:cf:ed:76:40:bb:f3:
78:0a:63:05:3b:16:00:fb:3d:03:aa:09:6d:1c:5a:
bd:39:a2:7f:6a:24:b0:c2:f3:a8:6e:23:e8:1a:2d:
17:cd
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Subject Key Identifier:
25:74:57:42:23:3D:B3:4A:C5:3A:7E:92:B4:16:45:3E:0B:39:F4:D5
X509v3 Authority Key Identifier:
CE:F2:15:FF:E0:D1:B7:E6:D4:0C:04:5E:4A:EA:DB:46:C5:2B:6B:27
Signature Algorithm: sha256WithRSAEncryption
Signature Value:
55:90:da:77:33:e2:89:6c:d6:1b:87:a6:3f:cd:b3:79:81:a4:
7e:19:d3:09:70:db:8b:95:b7:5a:9e:d8:e2:38:2d:63:37:a5:
03:9b:b6:ae:6b:e9:09:0b:b9:a4:7a:b8:b5:f7:d5:f3:f1:be:
78:f5:43:25:a2:f6:f5:bb:45:9f:9c:0c:6a:06:40:59:88:f0:
23:4d:45:ca:83:3b:9e:c4:0c:f5:32:ef:ce:f6:bb:1b:a0:8d:
19:81:0b:3a:3f:ca:ea:90:e1:d5:db:87:b5:91:a1:4e:b5:71:
51:39:91:f2:4d:87:6c:2b:de:da:ea:4c:00:c3:50:90:55:4f:
c5:04:69:c9:a7:4a:b9:6f:6c:a6:e1:3e:7a:5f:0e:f2:a1:57:
b0:aa:15:fb:d8:09:7a:48:32:31:75:b2:d7:96:81:b5:03:f7:
55:e9:52:7c:6e:da:e6:13:29:36:f3:2e:07:24:07:83:28:8a:
ae:1c:c0:d8:6b:23:2b:ef:81:d2:a4:06:f0:98:1d:13:6f:45:
3b:43:66:2d:1f:ec:c4:d3:dc:16:ff:4e:fe:81:90:2a:dc:1b:
a9:dd:6b:9c:9b:a3:ba:4e:5d:74:28:31:60:5f:f9:49:b7:55:
34:fa:5a:fe:10:ba:bf:38:4a:fe:56:6b:fb:80:af:db:8a:9c:
94:aa:1c:08

Скопируйте сертификат удостоверяющего центра в каталог ~student/.postgresql:

[student@srv1 crt]$ cd ~/.postgresql/
[student@srv1 .postgresql]$ cp -v ~/cert/ca_ssl/root.crt .
'/home/student/cert/ca_ssl/root.crt' -> './root.crt'

Скопируйте сертификат и ключ пользователя student в текущий каталог с именами, требуемыми библиотекой libpq по умолчанию:

[student@srv1 .postgresql]$ cp -v ~/cert/crt/student.key postgresql.key
'/home/student/cert/crt/student.key' -> 'postgresql.key'
[student@srv1 .postgresql]$ cp -v ~/cert/crt/student.crt postgresql.crt
'/home/student/cert/crt/student.crt' -> 'postgresql.crt'

Проверьте результат:

[student@srv1 .postgresql]$ ls -l
итого 16
-rw-r--r-- 1 student student 4144 апр 25 21:41 postgresql.crt
-rw------- 1 student student 1704 апр 25 21:41 postgresql.key
-rw------- 1 student student 1273 апр 25 21:40 root.crt
[student@srv1 .postgresql]$ cd

Проверка аутентификации по сертификату​

Попытайтесь подключиться от имени student:

[student@srv1 ~]$ psql -h srv1 -p 5433
psql (15.15)
SSL-соединение (протокол: TLSv1.3, шифр: TLS_AES_256_GCM_SHA384, сжатие: выкл.)
Введите "help", чтобы получить справку.
student=> \q

Таким образом, аутентификация по сертификату пользователя student работает.

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

Вопрос 1

Вопрос 1: Какое имя файла сертификата пользователя student по умолчанию использует библиотека libpq?

Вопрос 2

Вопрос 2: В каком каталоге по умолчанию библиотека libpq ищет сертификат клиента?