Включение SSL-шифрования

ADPG поддерживает SSL-шифрование трафика между клиентом и сервером. Чтобы использовать эту функцию, OpenSSL должен быть установлен как на сервере, так и на клиенте. Поддержка SSL включается в ADPG во время его сборки. Чтобы его использовать, необходимо получить сертификаты и настроить SSL с помощью пользовательского интерфейса ADCM.

Для работы сервера в режиме SSL ему необходимы файлы, содержащие сертификат сервера и закрытый ключ. По умолчанию эти файлы называются server.crt и server.key соответственно и хранятся в каталоге данных ADPG (/pg_data1/adpg16). Другие имена и местоположения можно указать с помощью параметров конфигурации ssl_cert_file и ssl_key_file, как описано в разделе Настройка через ADCM.

Если закрытый ключ защищен паролем, сервер запросит пароль и не запустится, пока он не будет введен. Использование пароля отключает возможность изменения SSL-конфигурации сервера без перезагрузки.

Использование клиентских сертификатов

Чтобы требовать от клиентов предоставления доверенного сертификата, поместите сертификаты корневых центров сертификации (ЦС), которым вы доверяете, в файл каталога данных, укажите параметр ssl_ca_file в пользовательском интерфейсе ADCM и добавьте вариант аутентификации clientcert=verify-ca или clientcert=verify-full в соответствующие строки hostssl секции PG_HBA, как описано в разделе Настройка SSL через ADCM. Сертификат будет запрошен у клиента во время запуска SSL-соединения. За информацией о том, как настроить сертификаты на клиенте, обратитесь к статье SSL Support.

Для записи hostssl с clientcert=verify-ca сервер проверяет, что сертификат клиента подписан одним из доверенных центров сертификации. Если используется clientcert=verify-full, сервер не только проверяет цепочку сертификатов, но также проверяет, соответствует ли имя пользователя или его сопоставление cn (Common Name) предоставленного сертификата. Обратите внимание, что при использовании метода аутентификации cert всегда обеспечивается проверка цепочки сертификатов.

Промежуточные сертификаты, которые связаны с существующими корневыми сертификатами, также могут быть включены в файл, указанный в параметре ssl_ca_file, если вы хотите избежать их хранения на клиентах. Списки отзыва сертификатов (Certificate Revocation List, CRL) также проверяются, если параметры ssl_crl_file, ssl_crl_dir установлены через ADCM так же, как и другие параметры SSL.

Опция аутентификации clientcert доступна для всех методов аутентификации в записях PG_HBA, указанных как hostssl. Если clientcert не указан, сервер проверяет сертификат клиента по своему списку ЦС, только если сертификат предоставлен и этот список определен.

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

  • Использование метода аутентификации cert для записей hostssl в PG_HBA. Сертификат будет использоваться как для аутентификации, так и для защиты SSL-соединения. См. Certificate authentication. (При использовании метода аутентификации cert нет необходимости явно указывать какие-либо параметры clientcert). В этом случае параметр cn (Common Name), указанный в сертификате, сверяется с именем пользователя или применяемым сопоставлением.

  • Использование любого метода аутентификации для записей hostssl с проверкой клиентских сертификатов через установку для параметра аутентификации clientcert значения verify-ca или verify-full. Первое значение только гарантирует, что сертификат действителен, а второе также гарантирует, что cn (Common Name) в сертификате соответствует имени пользователя или применимому сопоставлению.

Создание SSL-сертификатов

Вместо сертификатов ЦС вы также можете создать свои собственные самоподписанные сертификаты, которые можно использовать для разработки и тестирования, но не рекомендуется использовать в производственном окружении.

Генерация SSL-сертификата для сервера

Для сервера можно создать самоподписанный сертификат, в котором Issuer и Subject совпадают, или сертификат, подписанный корневым центром сертификации, который также создан на вашем сервере.

Чтобы сгенерировать SSL-сертификаты, измените текущий рабочий каталог на каталог данных ADPG (по умолчанию, /pg_data1/adpg16):

$ cd /pg_data1/adpg16

Генерация самоподписанного SSL-сертификата

Чтобы создать простой самоподписанный сертификат для сервера, действительный в течение 365 дней, используйте следующую команду OpenSSL, заменив <dbhost.yourdomain.com> именем хоста сервера, например, CN=ees-adpg-adpg:

$ openssl req -new -x509 -days 365 -nodes -text -out server.crt \
  -keyout server.key -subj "/CN=<dbhost.yourdomain.com>"

Будут созданы следующие файлы:

  • server.crt — файл сертификата сервера;

  • server.key — файл закрытого ключа.

В системах Unix права доступа к server.key должны запрещать любой доступ группы и других пользователей. Также необходимо присвоить права владельца файлов server.key и server.crt пользователю и группе postgres. Для этого используйте следующие команды:

$ chmod 600 server.key
$ chown postgres:postgres server.key server.crt

Генерация корневого сертификата и подписание им сертификата сервера

Чтобы создать сертификат сервера, который смогут проверить клиенты, создайте запрос сертификата (Certificate Signing Request, CSR) и файлы открытого/закрытого ключей. Также необходимо установить разрешения:

$ openssl req -new -nodes -text -out root.csr  -keyout root.key -subj "/CN=<root.yourdomain.com>"
$ chmod 600 root.key

Подпишите запрос ключом, чтобы создать корневой центр сертификации. Обратите внимание, что путь к файлу openssl.cnf (/etc/ssl/openssl.cnf) может отличаться в вашем окружении:

$ openssl x509 -req -in root.csr -text -days 3650 \
  -extfile /etc/ssl/openssl.cnf -extensions v3_ca \
  -signkey root.key -out root.crt

$ chmod 600 root.crt

Создайте сертификат сервера, подписанный новым корневым центром сертификации:

$ openssl req -new -nodes -text -out server.csr -keyout server.key -subj "/CN=<dbhost.yourdomain.com>"
$ chmod 600 server.key
$ openssl x509 -req -in server.csr -text -days 365 -CA root.crt -CAkey root.key -CAcreateserial -out server.crt

Удалите файл CSR:

$ rm server.csr

Файлы server.crt и server.key должны храниться на сервере, а root.crt — на клиенте, по следующему пути: ~/.postgresql/root.crt.(См. SSL client file usage.) Таким образом, клиент сможет убедиться в том, что сертификат сервера подписан центром сертификации, которому он доверяет.

Файл root.key следует хранить в изолированном месте для создания сертификатов в будущем.

Генерация SSL-сертификата для клиентов

В этом примере используется сертификат сервера из примера Генерация корневого сертификата и подписание им сертификата сервера.

Создайте запрос сертификата (CSR), где CN — имя пользователя базы данных:

$ openssl req -days 3650 -new -nodes -subj "/CN=<database_username>" -keyout client.key -out client.csr
$ chmod 600 client.key

Создайте подписанный сертификат для клиента, используя корневой сертификат:

$ openssl x509 -days 3650 -req  -CAcreateserial -in client.csr -CA root.crt -CAkey root.key -out client.crt

Удалите файл CSR:

$ rm client.csr

Файлы client.crt и client.key должны храниться на клиенте, по следующему пути: ~/.postgresql/. См. SSL client file usage.

Настройка SSL через ADCM

Для настройки SSL потребуются параметры, перечисленные в таблице. Поле таблицы Значение содержит имена файлов из примера, приведенного выше.

Имя Значение Описание

ssl

on

Включает SSL-соединения

ssl_ca_file

root.crt

Указывает имя файла, содержащего сертификаты центров сертификации (ЦС) для SSL-сервера. Путь должен быть указан относительно каталога данных ADPG. Параметр нужен, только если ожидается проверка клиентского сертификата. Значение пути по умолчанию: /pg_data1/adpg16

ssl_cert_file

server.crt

Указывает имя файла, содержащего сертификат SSL-сервера. Путь должен быть указан относительно каталога данных ADPG. Значение пути по умолчанию: /pg_data1/adpg16

ssl_key_file

server.key

Указывает имя файла, содержащего закрытый ключ SSL-сервера. Путь должен быть указан относительно каталога данных ADPG. Значение пути по умолчанию: /pg_data1/adpg16

Чтобы настроить SSL через ADCM, перейдите на страницу Clusters, выберите кластер ADPG и переключитесь на вкладку Services. Выберите сервис ADPG, разверните ноду ADPG configurations в дереве Configuration и кликните по полю postgresql.conf.

Поле postgresql.conf
Поле postgresql.conf

Добавьте SSL-параметры в открывшееся текстовое поле. Параметры со значениями из примера выше будут выглядеть следующим образом:

ssl_cert_file = '/pg_data1/adpg16/server.crt'
ssl_key_file = '/pg_data1/adpg16/server.key'
ssl_ca_file = '/pg_data1/adpg16/root.crt'
ssl = on
Настройки SSL в поле postgresql.conf
Настройки SSL в поле postgresql.conf

Кликните Apply, чтобы применить изменения. После того как поле postgresql.conf закроется, сохраните конфигурацию, нажав Save.

Далее запустите действие Reconfigure & Restart, чтобы сервис ADPG применил изменения. Это необходимо сделать до добавления настроек SSL-соединения в поле PG_HBA.

Разрешите SSL-соединения для сервера ADPG. Например, добавьте следующую строку к содержимому поля PG_HBA в дереве Configuration:

hostssl     all     all     0.0.0.0/0     cert

Эта запись позволяет всем пользователям (all) использовать SSL-соединения (hostssl) со всеми базами данных (all) со всех адресов IPv4 (0.0.0.0/0). Аутентификация осуществляется с использованием клиентских сертификатов SSL (cert).

Сохраните изменения и запустите действие Reconfigure and Restart, чтобы применить изменения.

Также возможно выполнить действие Reconfigure and Restart только один раз после настройки PG_HBA, установив флаг Force reconfigure and restart. Будьте осторожны при использовании этого флага, так как он отключает валидацию конфигурационных файлов и в случае ошибки в настройках предупреждающее сообщение не будет выведено.

Нашли ошибку? Выделите текст и нажмите Ctrl+Enter чтобы сообщить о ней