Аутентификация по SSL-сертификату
Аутентификация по SSL-сертификату позволяет серверу проверить, что сертификат клиента подписан одним из доверенных центров сертификации (ЦС). Вы также можете включить проверку клиентского сертификата при использовании любого другого метода аутентификации. Чтобы использовать аутентификацию по SSL-сертификату, необходимо включить шифрование соединений с базой данных.
Дополнительную информацию о настройке SSL на стороне клиента вы можете найти в соответствующем разделе документации PostgreSQL: SSL Support.
Предварительные требования
Для демонстрации того, как включить аутентификацию по SSL-сертификату в Greengage DB, используются следующие хосты:
-
Мастер-хост: FQDN —
mdw.example.com
. -
Клиентский хост: FQDN —
alice.example.com
, операционная система — Windows, Linux или macOS.
OpenSSL должен быть установлен как на мастер-хосте, так и на клиентском хосте.
Создание сертификата для клиента
Чтобы узнать, как создать корневой сертификат, который используется для подписания серверных и клиентских сертификатов, смотрите раздел Создание сертификатов. Затем вы можете создать клиентский сертификат, как показано ниже:
-
Сгенерируйте запрос на подпись сертификата (Certificate Signing Request, CSR):
$ openssl req \ -newkey rsa:2048 \ -subj "/CN=alice" \ -nodes \ -keyout postgresql.key \ -out postgresql.csr
В качестве идентификатора сертификата
CN
(Common Name) используется имя пользователя Greengage DB. Если значениеCN
отличается от имени пользователя Greengage DB, вам необходимо настроить сопоставление между этими значениями. -
Создайте и подпишите клиентский сертификат с помощью корневого ключа и сертификата ЦС:
$ openssl x509 \ -req \ -in postgresql.csr \ -out postgresql.crt \ -CA root.crt \ -CAkey root.key \ -CAcreateserial \ -days 365
Настройка аутентификации по SSL-сертификату
Создание пользователя
Создайте роль alice
в Greengage DB:
$ createuser alice
Редактирование pg_hba.conf
Файл pg_hba.conf позволяет задать типы соединений, которые разрешены для различных пользователей с помощью поля connection-type.
Аутентификацию по SSL-сертификату можно использовать только для соединений типа hostssl
.
-
Откройте pg_hba.conf для редактирования:
$ vi $MASTER_DATA_DIRECTORY/pg_hba.conf
-
Добавьте в файл следующую строку:
# connection-type database user address auth-method hostssl postgres alice .example.com cert
auth-method
установлен в значениеcert
и включает аутентификацию по SSL-сертификату дляalice
. -
Сохраните и закройте файл.
-
Чтобы применить изменения, перезапустите кластер Greengage DB:
$ gpstop -ra
Теперь вы можете подключиться к базе данных, как описано в разделе Подключение к базе данных.
Сопоставление CN (Common Name) и имени пользователя
Сервер не только проверяет цепочку сертификатов, но и контролирует, соответствует ли имя пользователя Greengage DB значению CN
предоставленного сертификата.
Если значение CN
отличается от имени пользователя Greengage DB, настройте сопоставление между этими значениями в файле pg_ident.conf.
Например, следующая конфигурация pg_hba.conf указывает, что для сопоставления значения CN
и имени пользователя Greengage DB используется user_map
:
# connection-type database user address auth-method
hostssl postgres alice .example.com cert map=user_map
Если при генерации клиентского сертификата в качестве CN
используется значение alice@example.com
, задайте сопоставление данного CN
с именем пользователя alice
в Greengage DB в файле pg_ident.conf следующим образом:
# MAPNAME SYSTEM-USERNAME PG-USERNAME
user_map alice@example.com alice
Проверка клиентского сертификата при использовании других методов аутентификации
Вы можете включить проверку сертификата клиента для любого метода аутентификации, используя параметр аутентификации clientcert
.
Данный пример показывает, как проверить сертификат клиента при использовании аутентификации по паролю:
# connection-type database user address auth-method
hostssl postgres alice .example.com password clientcert=1
Сопоставление значения CN
и имени пользователя Greengage DB не поддерживается при использовании clientcert
для проверки сертификата клиента.
Подключение к базе данных
Войдите на клиентский хост.
Копирование сертификатов на клиентский хост
Скопируйте клиентские сертификаты (postgresql.key и postgresql.crt) в следующий каталог:
-
~/.postgresql/ для Linux или macOS;
-
%APPDATA%\postgresql\ для Windows.
Для Linux и macOS вам также нужно изменить права доступа к файлу закрытого ключа:
$ chmod 600 ~/.postgresql/postgresql.key
Подключение к базе данных с использованием psql
Для подключения к базе данных выполните команду psql
с параметром sslmode
, установленным в значение require
:
$ psql "sslmode=require host=mdw.example.com dbname=postgres user=alice"
Вывод показывает, что установлено SSL-соединение, а также отображает используемые параметры данного соединения:
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off) Type "help" for help. postgres=>
Может потребоваться выполнить дополнительные действия, если вы используете проверку клиентского сертификата вместе с другим методом аутентификации. Например, указать пароль, если используется аутентификация по паролю, создать тикет на предоставление тикетов (Ticket-Granting Ticket, TGT), если используется аутентификация GSSAPI, и так далее.