8.3.16. Настройка SSL для PostgreSQL

При установке и удалении сертификата выполняется перезапуск инстанса.

Шифрование TLS/SSL используется для защиты передаваемых данных между клиентом и сервером. С помощью данной инструкции можно настроить шифрование с использованием собственного SSL-сертификата с проверкой на соответствие адреса хоста.

  1. Сгенерируйте файлы сертификата и ключа (в команде вместо example.psql.tools в двух строках используйте адрес хоста вашего инстанса):
    openssl req -x509 -newkey rsa:2048 \
      -sha256 -days 365 \
      -nodes \
      -keyout server-key.pem \
      -out server-cert.pem \
      -subj "/CN=example.psql.tools" \
      -addext "subjectAltName=DNS:example.psql.tools" \
      -addext "keyUsage=digitalSignature,keyEncipherment" \
      -addext "extendedKeyUsage=serverAuth"
  2. Установите сертификат в разделе «PostgreSQL» на вкладке «Настройки → SSL» (поле с паролем приватного ключа оставьте пустым, если не указывали его при генерации сертификата и ключа):
  3. Проверьте адрес хоста в установленном сертификате (в команде используйте ваши данные для подключения: example.psql.tools — хост, 12345 — порт):
    openssl s_client -connect example.psql.tools:12345 -starttls postgres -showcerts </dev/null 2>/dev/null | openssl x509 -noout -subject -issuer -ext subjectAltName

    Без установленного сертификата вывод выглядит так:

    subject -issuer -ext subjectAltName
    subject=CN = adm.tools
    issuer=CN = adm.tools
    No extensions in certificate

    После установки сертификата в выводе будет адрес хоста вашего инстанса:

    subject=CN = example.psql.tools
    issuer=CN = example.psql.tools
    X509v3 Subject Alternative Name:
        DNS:example.psql.tools
  4. Подключитесь к инстансу с использованием сертификата и убедитесь, что соединение зашифровано (в команде используйте ваши данные для подключения: example.psql.tools — хост, 12345 — порт, user — пользователь):
    psql "host=example.psql.tools port=59264 dbname=db1 user=user sslmode=verify-full sslrootcert=server-cert.pem"

    Выполните SQL-запрос:

    SELECT ssl, version, cipher, bits, client_dn FROM pg_stat_ssl WHERE pid = pg_backend_pid();

    Если всё настроено верно, подключение проходит успешно и вывод выглядит так:

     ssl | version |         cipher         | bits | client_dn
    -----+---------+------------------------+------+-----------
     t   | TLSv1.3 | TLS_AES_256_GCM_SHA384 |  256 |
Содержание