Github

Шифрование соединений с базой данных

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

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-сертификатов используется самоподписанный сертификат ЦС.

Вход на мастер-хост

  1. Войдите на мастер-хост под пользователем gpadmin и перейдите в домашний каталог.

  2. Создайте каталог certs и войдите в него:

    $ mkdir certs && cd certs

Создание корневого центра сертификации

  1. Сгенерируйте закрытый ключ:

    $ openssl genrsa -out root.key 2048
  2. Создайте самоподписанный сертификат ЦС:

    $ openssl req \
      -x509 \
      -subj "/CN=ExampleCorp Root CA" \
      -key root.key \
      -days 365 \
      -out root.crt

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

  1. Сгенерируйте закрытый ключ сервера:

    $ openssl genrsa -out server.key 2048
  2. Сгенерируйте запрос на подпись сертификата (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) мастер-хоста.

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

    $ 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

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

    $ vi $MASTER_DATA_DIRECTORY/postgresql.conf
  2. Установите значение параметра 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 — путь к файлу, содержащему закрытый ключ сервера.

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

Перезапуск СУБД Greengage

  1. Чтобы применить изменения, перезапустите кластер Greengage DB:

    $ gpstop -ra
  2. После перезапуска кластера проверьте, включен ли 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:

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

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

    # connection-type  database  user   address       auth-method
    host               postgres  alice  .example.com  password

    Обратите внимание на следующее:

    • connection-type установлено в значение host и позволяет как незашифрованные, так и зашифрованные соединения для пользователя alice.

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

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

  4. Перезагрузите конфигурацию с помощью 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"