Github

Аутентификация по SSL-сертификату

Андрей Аксенов

Аутентификация по SSL-сертификату позволяет серверу проверить, что сертификат клиента подписан одним из доверенных центров сертификации (ЦС). Вы также можете включить проверку клиентского сертификата при использовании любого другого метода аутентификации. Чтобы использовать аутентификацию по SSL-сертификату, необходимо включить шифрование соединений с базой данных.

Дополнительную информацию о настройке SSL на стороне клиента вы можете найти в соответствующем разделе документации PostgreSQL: SSL Support.

Предварительные требования

Для демонстрации того, как включить аутентификацию по SSL-сертификату в Greengage DB, используются следующие хосты:

  • Мастер-хост: FQDN — mdw.example.com.

  • Клиентский хост: FQDN — alice.example.com, операционная система — Windows, Linux или macOS.

OpenSSL должен быть установлен как на мастер-хосте, так и на клиентском хосте.

Создание сертификата для клиента

Чтобы узнать, как создать корневой сертификат, который используется для подписания серверных и клиентских сертификатов, смотрите раздел Создание сертификатов. Затем вы можете создать клиентский сертификат, как показано ниже:

  1. Сгенерируйте запрос на подпись сертификата (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, вам необходимо настроить сопоставление между этими значениями.

  2. Создайте и подпишите клиентский сертификат с помощью корневого ключа и сертификата ЦС:

    $ 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.

  1. Откройте pg_hba.conf для редактирования:

    $ vi $MASTER_DATA_DIRECTORY/pg_hba.conf
  2. Добавьте в файл следующую строку:

    # connection-type  database  user   address       auth-method
    hostssl            postgres  alice  .example.com  cert

    auth-method установлен в значение cert и включает аутентификацию по SSL-сертификату для alice.

  3. Сохраните и закройте файл.

  4. Чтобы применить изменения, перезапустите кластер 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, и так далее.