Двухфакторная аутентификация
Двухфакторная аутентификация – это технология, обеспечивающая идентификацию пользователей при помощи запроса аутентификационных данных двух разных типов. Она обеспечивает двухслойную, а значит, более эффективную защиту СУБД от несанкционированного проникновения.
Подключение пользователя к СУБД с помощью двухфакторной аутентификации может осуществляться:
- непосредственно (или напрямую) к 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 либо использует свободное соединение для подключения к БД (используется ранее созданный процесс), либо открывается новое соединение для работы с БД.