Двухфакторная аутентификация
Двухфакторная аутентификация – это технология, обеспечивающая идентификацию пользователей при помощи запроса аутентификационных данных двух разных типов. Она обеспечивает двухслойную, а значит, более эффективную защиту СУБД от несанкционированного проникновения.
Подключение пользователя к СУБД с помощью двухфакторной аутентификации может осуществляться:
- непосредственно (или напрямую) к Pangolin;
- через Pangolin Pooler с включенной сквозной аутентификацией;
- через Pangolin Pooler с выключенной сквозной аутентификацией.
Для реализации механизма двухфакторной аутентификации требуется:
-
Настроить режим взаимодействия с клиентами по TLS.
Вторым фактором проверки в двухфакторной аутентификации всегда является проверка сертификата клиента.
Сертификат безопасности клиента должен содержать поле
CN, содержащее логин клиента и, опционально, полеSubjectAltName, содержащее один или несколько IP-адресов (возможен вариант указания подсети) и (или) DNS-имен клиента. -
Указать в конфигурации один из специальных методов аутентификации:
2f-scram-sha-256,2f-ldap,2f-md5и2f-password.Внимание!Необходимо учитывать, что разрешенными по умолчанию механизмами двухфакторной аутентификации являются
2f-scram-sha-256и2f-ldap.При необходимости использования методов аутентификации
2f-md5и2f-passwordнужно добавить эти методы в параметрenabled_extra_auth_methodsв конфигурационном файле:postgresql.confдля конфигурации сервера standalone;postgres.ymlдля конфигурации cluster.
Например:
enabled_extra_auth_methods = '2f-md5, 2f-password'
Описание механизма
Алгоритм выполнения двухфакторной аутентификации:
- Сверка IP-адреса (при наличии IP/DNS в клиентском сертификате) и сверка логина:
- сверка IP-адреса, закодированного в атрибуте
SubjectAltNameсертификата, используемого клиентом для установления соединения по TLS/SSL с фактическим IP-адресом клиента. Сверка IP-адреса не выполняется в случае, если в сертификате нет атрибутаSubjectAltNameили он не содержит IP/DNS. АтрибутSubjectAltNameможет содержать и другие значения, например DNS; - сверка логина, закодированного в атрибуте
CNсертификата, используемого клиентом для установления соединения по TLS/SSL, c логином из первого фактора;
- Аутентификация по паролю с методами:
md5,scram-sha-256.
Общая схема выполнения двухфакторной аутентификации:

Прямое подключение к Pangolin
В данном разделе будет рассмотрен пример настройки двухфакторной аутентификации при подключении пользователя напрямую к СУБД Pangolin.
Для прямого подключения к СУБД необходимо выполнить настройку Pangolin для двухфакторной аутентификации:
-
Создайте сертификаты, удовлетворяющие требованиям двухфакторной аутентификации (
rootилиca,serverиclient). Информация по генерации представлена в разделах «Генерация сертификатов» и «Использование сертификатов PKCS#12 в кластере Pangolin». -
В файле
postgresql.conf/postgres.yamlвключите SSL-режим и укажите пути к корневому и серверному сертификатам. Далее приведен пример настройки параметров с обычными сертификатами:# Включить SSL-режим
ssl = on
# Путь в Root/CA-сертификату
ssl_ca_file = './root.crt'
# Путь к SSL-сертификату сервера
ssl_cert_file = './server.crt'
# Путь к SSL-ключу сервера
ssl_key_file = './server.key' -
В файле
pg_hba.conf(или секцииpg_hbaконфигурационного файлаpostgres.yml, в случае кластерной конфигурации) укажите:-
тип соединения -
hostssl; -
метод аутентификации:
2f-scram-sha-256,2f-md5,2f-passwordили2f-ldap. Пример:# TYPE DATABASE USER ADDRESS METHOD
hostssl test test1 127.0.0.1/32 2f-md5
hostssl test test1 hostname 2f-scram-sha-256
-
-
Перечитайте конфигурацию сервера (reload).
Пример подключения
Для подключения к серверу баз данных с использованием двухфакторной аутентификации необходимо в строке подключения передать параметр SSL-соединения и пути к серверному сертификату и ключу. Пример команды:
$ psql "host=127.0.0.1 port=5432 user=test_cert_user dbname=postgres sslmode=require sslcert=/pg_ssl/test_cert_user.crt sslkey=/pg_ssl/test_cert_user.key"
Введите пароль при возникновении запроса:
Password for user test_cert_user:
Ожидаемый результат:
psql (17.5)
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)
Type "help" for help.
postgres=>
Схема процесса

- Пользователь осуществляет попытку аутентификации по паре логин/пароль.
- SSL-сертификат пользователя, а так же его параметры подключения передаются в Pangolin.
- Выполняется сверка IP-адреса и логина пользователя из сертификата с IP-адресом и логином параметров подключения.
- В случае успешной аутентификации, открывается соединение к БД. В противном случае происходит разрыв соединения, выводится сообщение о причине отказа.
Подключение к Pangolin через Pangolin Pooler с включенной сквозной аутентификацией
Для подключения к Pangolin через Pangolin Pooler с включенной сквозной аутентификацией
-
Создайте сертификаты удовлетворяющие требованиям двухфакторной аутентификации (
rootилиca,serverиclientсертификаты). -
Настройте сквозную аутентификацию:
-
в конфигурационном файле СУБД Pangolin (
postgresql.conf/postgres.yaml) укажите:authentication_proxy = on;authentication_port = {AUTHPORT};
Пример:
port = 5432
...
authentication_port = 5544
authentication_timeout = 60 # sec
auth_activity_period = 10 # sec -
в конфигурационном файле Pangolin Pooler укажите:
auth_port={AUTHPORT};auth_proxy = on.
Пример:
[pgbouncer]
auth_proxy = on
...
[databases]
* = host=localhost port=5432 auth_port=5544 auth_pool_size=1
-
-
Выполните настройку СУБД Pangolin для двухфакторной аутентификации:
-
в файле
postgresql.conf/postgres.yaml- включите SSL режим и укажите пути к корневому, серверному сертификатам и ключу:ssl = on
ssl_ca_file = './root.crt'
ssl_cert_file = './server.crt'
ssl_key_file = './server.key' -
в файле
pg_hba.conf(или секцииpg_hba, конфигурационного файлаpostgres.ymlкластерной конфигурации) укажите:-
тип соединения -
hostssl; -
метод аутентификации:
2f-scram-sha-256,2f-md5,2f-passwordили2f-ldap. Пример настройки:# TYPE DATABASE USER ADDRESS METHOD
hostssl test test_user 127.0.0.1/32 2f-md5
hostssl test test_user hostname 2f-scram-sha-256
-
-
-
Перечитайте конфигурацию сервера (reload).
Пример подключения
Пример команды подключения к Pangolin с использованием механизма сквозной аутентификации:
psql 'host=<server_IP> port=6544 user=user1 sslmode=verify-ca sslcert=client-user1.crt sslkey=client-user1.key sslrootcert=root.crt'
Пример команды при использовании метода 2f-ldap:
psql 'host=<server_IP> port=6544 user=<username> sslmode=verify-ca sslcert=client-ldap-ip.crt sslkey=client-ldap-ip.key sslrootcert=root.crt'
Введите пароль при возникновении запроса:
Password for user user1:
Ожидаемый результат:
psql (17.5)
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)
Type "help" for help.
postgres=>
Схема процесса

- Пользователь осуществляет попытку аутентификации по паре логин/пароль.
- SSL-сертификат пользователя, а так же его параметры подключения передаются в Pangolin Pooler. Инициируется процесс аутентификации пользователя.
- Pangolin Pooler передает данные SSL-сертификата, параметры подключения, данные аутентификации в Pangolin.
- Выполняется сверка IP-адреса из сертификата с IP-адресом параметров подключения. В случае успешной сверки осуществляется переход к следующему шагу, иначе соединение разрывается по причине несовпадения IP-адреса, выводится сообщение о причине отказа.
- Выполняется сверка логина из сертификата с логином параметров подключения. При успешной сверке осуществляется переход к следующему шагу, иначе соединение разрывается по причине несовпадения логина, выводится сообщение о причине отказа.
- Выполняется попытка аутентификации по паре логин\пароль. При успешной сверке аутентификации осуществляется переход к следующему шагу, иначе соединение разрывается по причине не верного пароля, выводится сообщение о причине отказа.
- Аутентификация выполнена, происходит сохранение
auth-статуса в контексте аутентификации. Pangolin информирует Pangolin Pooler о выполнении аутентификации. В Pangolin Pooler передаютсяauth-статус,token,verifier. - Pangolin Pooler принимает
auth-статус,token,verifier, анализируетсяauth-статус. В случае статуса Active, в контексте аутентификации сохраняетсяauth-статус,token,verifier, устанавливается период активности аутентификации, происходит переход к следующему шагу. При других статусах выполняется отказ в открытии доступа к БД и сброс соединения по причине «плохого» контекста, устанавливается период неактивности и выводится сообщение о причине отказа. - В Pangolin выполняется анализ доступных соединений на основе контекста аутентификации и
token, вследствие чего Pangolin Pooler либо использует свободное соединение для подключения к БД (используется ранее созданный процесс), либо открывается новое соединение для работы с БД.
Подключение к Pangolin через Pangolin Pooler с выключенной сквозной аутентификацией
Данные настройки также влияют на подключение к интерфейсу администрирования Pangolin Pooler.
Аутентификация выполняется на уровне компонента Pangolin Pooler. В Pangolin Pooler с выключенной сквозной аутентификацией не поддерживается аутентификация LDAP, поэтому 2f-ldap так же не поддерживается.
Для подключения к серверу Pangolin через Pangolin Pooler с использованием двухфакторной аутентификации необходимо:
-
Создайте сертификаты, удовлетворяющие требованиям двухфакторной аутентификации (
rootилиca,serverиclient). -
В файле конфигурации
pangolin-pooler.iniукажите:-
параметры подключения SSL/TLS;
-
метод аутентификации:
2f-scram-sha-256,2f-passwordили2f-md5.Внимание!Методы
2f-passwordили2f-md5признаны небезопасными, рекомендуется использовать2f-scram-sha-256.
Пример:
[pgbouncer]
auth_type = 2f-scram-sha-256
; TLS settings
client_tls_protocols = all
client_tls_sslmode = verify-full
client_tls_ca_file = ./root.crt
client_tls_cert_file = ./server.crt
client_tls_key_file = ./server.key
[databases]
* = host=localhost port=5432ПримечаниеЕсли на сервере используется SSL-соединение, то в
pgbouncer.iniнеобходимо прописать настройкиserver_tls_*. Подробнее о конфигурационных параметров компонента Pangolin Pooler описано в разделе «Администрирование Pangolin Pooler» документа «Руководство администратора». -
-
Выполните настройку СУБД Pangolin. Определите в файле
pg_hba.confпараметры для аутентификации пользователей:# TYPE DATABASE USER ADDRESS METHOD
host all test_user 0.0.0.0/0 scram-sha-256Указать необходимо «обычный» метод аутентификации (не двухфакторный), так как защищенное соединение выполняется между клиентом и Pangolin Pooler.
-
Перечитайте конфигурацию сервера (reload).
Пример подключения
В данном разделе рассматривается пример подключения, где аутентификация выполняется на уровне Pangolin Pooler, с использованием двухфакторной аутентификации:
psql 'host=<server_IP> port=6544 user=user1 sslmode=verify-ca sslcert=client-user1.crt sslkey=client-user1.key sslrootcert=root.crt'
Введите пароль при возникновении запроса:
Password for user user1:
Ожидаемый результат:
psql (17.5)
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)
Type "help" for help.
postgres=>
Схема процесса двухфакторная аутентификация

- Пользователь осуществляет попытку аутентификации по паре логин/пароль.
- SSL-сертификат пользователя, а так же его параметры подключения передаются в Pangolin Pooler.
- Выполняется сверка IP-адреса и логина пользователя из сертификата с IP-адресом и логином параметров подключения. При успешной сверке осуществляется переход к следующему шагу. В случае неуспеха соединение разрывается выводится сообщение о причине отказа.
- Происходит аутентификация по паре логин/пароль, выполняется обмен данными аутентификации, Pangolin Pooler подключается к Pangolin. При успешной аутентификации осуществляется переход к следующему шагу. В случае неуспеха, соединение разрывается, выводится сообщение о причине отказа.
- Аутентификация выполнена, происходит сохранение
auth-статуса в контексте аутентификации. Pangolin информирует Pangolin Pooler о выполнении аутентификации. В Pangolin Pooler передаютсяauth-статус,token,verifier. - Pangolin Pooler принимает
auth-статус,token,verifier, анализируетсяauth-статус. В случае статуса Active, в контексте аутентификации сохраняетсяauth-статус,token,verifier, устанавливается период активности аутентификации. При других статусах выполняется отказ в открытии доступа к БД и сброс соединения по причине «плохого» контекста, устанавливается период неактивности и выводится сообщение о причине отказа. - В Pangolin выполняется анализ доступных соединений на основе контекста аутентификации и
token, вследствие чего Pangolin Pooler либо использует свободное соединение для подключения к БД (используется ранее созданный процесс), либо открывается новое соединение для работы с БД.