Шифрование соединений с базой данных
Greengage DB (на основе Greenplum) позволяет шифровать соединения между клиентами и мастер-хостом с помощью SSL. Рекомендуется включить SSL для всех клиентов, которые подключаются к мастер-хосту через небезопасные соединения.
Вы можете узнать больше о защите соединений с помощью SSL в данном разделе документации PostgreSQL: Secure TCP/IP connections with SSL.
Если вам нужно шифровать соединения между хостами кластера Greengage DB, используйте стороннее решение, например, IPsec.
Предварительные требования
Для демонстрации того, как включить SSL-шифрование в Greengage DB, используются следующие хосты:
-
Мастер-хост: FQDN —
mdw.example.com
, IP —192.168.1.10
. -
Клиентский хост: FQDN —
alice.example.com
, операционная система — Windows, Linux или macOS.
OpenSSL должен быть установлен как на мастер-хосте, так и на клиентском хосте.
Создание сертификатов
Мастер-хост должен использовать сертификат, подписанный центром сертификации (ЦС), чтобы клиенты смогли проверить подлинность сервера. Это может быть глобальный ЦС (например, GlobalSign или Let’s Encrypt) или локальный ЦС, используемый для выпуска сертификатов внутри вашей организации. В этом разделе для генерации SSL-сертификатов используется самоподписанный сертификат ЦС.
Вход на мастер-хост
-
Войдите на мастер-хост под пользователем
gpadmin
и перейдите в домашний каталог. -
Создайте каталог
certs
и войдите в него:$ mkdir certs && cd certs
Создание корневого центра сертификации
-
Сгенерируйте закрытый ключ:
$ openssl genrsa -out root.key 2048
-
Создайте самоподписанный сертификат ЦС:
$ openssl req \ -x509 \ -subj "/CN=ExampleCorp Root CA" \ -key root.key \ -days 365 \ -out root.crt
Создание сертификата для сервера
-
Сгенерируйте закрытый ключ сервера:
$ openssl genrsa -out server.key 2048
-
Сгенерируйте запрос на подпись сертификата (Certificate Signing Request, CSR):
$ openssl req \ -new \ -key server.key \ -subj "/CN=mdw.example.com" \ -out server.csr
В качестве идентификатора сертификата
CN
(Common Name) используется полное доменное имя (Fully Qualified Domain Name, FQDN) мастер-хоста. -
Создайте и подпишите серверный сертификат с помощью закрытого ключа и сертификата ЦС:
$ openssl x509 \ -req \ -in server.csr \ -extfile <(printf "subjectAltName=DNS:mdw.example.com,IP:192.168.1.10") \ -days 365 \ -CA root.crt \ -CAkey root.key \ -CAcreateserial \ -out server.crt
Создание сертификата для клиента
Если вы планируете использовать метод аутентификации cert
, создайте сертификат для клиента, как описано в разделе Создание сертификата для клиента.
Изменение прав доступа
Измените права доступа для созданных файлов следующим образом:
$ chmod 600 root.key root.crt server.key server.crt
Настройка SSL
Чтобы включить SSL, укажите пути к SSL-файлам сервера в конфигурационном файле postgresql.conf.
По умолчанию такие файлы хранятся в каталоге $MASTER_DATA_DIRECTORY.
Если включено зеркалирование мастера, не храните SSL-файлы сервера в данном каталоге.
При выполнении команды gpinitstandby
содержимое $MASTER_DATA_DIRECTORY копируется с мастер-хоста на резервный мастер-хост.
Так как SSL-файлы уникальны для каждого хоста, это может вызвать проблемы при запуске резервного мастер-хоста.
Редактирование postgresql.conf
-
Откройте файл postgresql.conf для редактирования:
$ vi $MASTER_DATA_DIRECTORY/postgresql.conf
-
Установите значение параметра
ssl
вon
и укажите пути к SSL-файлам следующим образом:ssl=on ssl_ca_file='/home/gpadmin/certs/root.crt' ssl_cert_file='/home/gpadmin/certs/server.crt' ssl_key_file='/home/gpadmin/certs/server.key'
Заданы следующие параметры:
-
ssl_ca_file
— путь к файлу, содержащему SSL-сертификат центра сертификации (ЦС). -
ssl_cert_file
— путь к файлу, содержащему SSL-сертификат сервера. -
ssl_key_file
— путь к файлу, содержащему закрытый ключ сервера.
-
-
Сохраните и закройте файл.
Перезапуск СУБД Greengage
-
Чтобы применить изменения, перезапустите кластер Greengage DB:
$ gpstop -ra
-
После перезапуска кластера проверьте, включен ли SSL, с помощью
gpconfig
:$ gpconfig -s ssl
Результат должен выглядеть следующим образом:
Values on all segments are consistent GUC : ssl Master value: on Segment value: off
Разрешение SSL-соединений
Создание пользователя
Создайте роль alice
с паролем в Greengage DB:
$ createuser --pwprompt alice
Редактирование pg_hba.conf
Файл pg_hba.conf позволяет задать типы соединений, разрешенные для различных пользователей, с помощью поля connection-type
.
Вы можете использовать SSL-шифрование для типов соединений host
и hostssl
:
-
host
разрешает как незашифрованные, так и зашифрованные соединения. Тип соединения зависит от значения параметраsslmode
, заданного на стороне клиента. -
hostssl
разрешает только зашифрованные соединения.
Выполните следующие шаги, чтобы пользователь мог подключаться по SSL:
-
Откройте pg_hba.conf для редактирования:
$ vi $MASTER_DATA_DIRECTORY/pg_hba.conf
-
Добавьте в файл следующую строку:
# connection-type database user address auth-method host postgres alice .example.com password
Обратите внимание на следующее:
-
connection-type
установлено в значениеhost
и позволяет как незашифрованные, так и зашифрованные соединения для пользователяalice
. -
auth-method
установлено в значениеpassword
и включает аутентификацию по паролю для пользователяalice
.
-
-
Сохраните и закройте файл.
-
Перезагрузите конфигурацию с помощью
gpstop
, чтобы применить изменения:$ gpstop -u
Подключение к базе данных
Войдите на клиентский хост.
Копирование корневого сертификата на клиентский хост
Если вы хотите, чтобы клиент проверял сертификат сервера, скопируйте файл root.crt в следующий каталог:
-
~/.postgresql/ для Linux или macOS;
-
%APPDATA%\postgresql\ для Windows.
Дополнительную информацию о настройке SSL на стороне клиента вы можете найти в соответствующем разделе документации PostgreSQL: SSL Support.
Подключение к базе данных с использованием psql
Для подключения к базе данных выполните команду psql
с параметром sslmode
, установленным в значение require
:
$ psql "sslmode=require host=mdw.example.com dbname=postgres user=alice"
Введите пароль пользователя alice
и нажмите Enter
.
Вывод показывает, что установлено SSL-соединение, а также отображает используемые параметры SSL:
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off) Type "help" for help. postgres=>
Проверка сертификата сервера
Для проверки сертификата сервера установите sslmode
в значение verify-ca
при подключении к базе данных:
$ psql "sslmode=verify-ca host=mdw.example.com dbname=postgres user=alice"
Если sslmode
установлен в verify-full
, клиент также проверяет, что имя хоста сервера соответствует имени, указанному в сертификате сервера:
$ psql "sslmode=verify-full host=mdw.example.com dbname=postgres user=alice"