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 |
Зміст