8.3.16. Налаштування SSL для PostgreSQL

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

Шифрування TLS/SSL використовується для захисту даних, що передаються між клієнтом і сервером. За допомогою цієї інструкції можна налаштувати шифрування з використанням власного SSL-сертифіката з перевіркою відповідності адреси хоста.

Для виконання команд використовуйте консоль на вашому пристрої. У результаті будуть сформовані файли сертифікатів і ключів. Файли серверного сертифіката встановлюються на хостингу, файли клієнтського сертифіката використовуються при налаштуванні клієнта, сертифікат CA використовується для перевірки автентичності серверного та клієнтського сертифікатів.

  1. Створіть сертифікат CA (Certificate Authority), який використовуватиметься для підписання та перевірки серверного та клієнтського сертифікатів:
    openssl req -new -x509 -newkey rsa:4096 -nodes -sha256 -days 3650 \
      -keyout ca-key.pem \
      -out ca-cert.pem \
      -subj "/CN=PostgreSQL_CA" \
      -addext "basicConstraints=critical,CA:true,pathlen:0" \
      -addext "keyUsage=critical,keyCertSign,cRLSign"
  2. Створіть серверний сертифікат (у командах замість example.psql.tools використовуйте адресу хосту вашого інстансу):
    1. Створіть ключ і CSR:
      openssl req -new -newkey rsa:2048 -nodes -sha256 \
        -keyout server-key.pem \
        -out server-req.pem \
        -subj "/CN=example.psql.tools"
    2. Підпишіть сертифікат:
      openssl x509 -req -sha256 -days 365 \
        -in server-req.pem \
        -CA ca-cert.pem \
        -CAkey ca-key.pem \
        -CAcreateserial \
        -out server-cert.pem \
        -extfile <(printf "basicConstraints=critical,CA:FALSE\nkeyUsage=critical,digitalSignature,keyEncipherment\nextendedKeyUsage=serverAuth\nsubjectAltName=DNS:example.psql.tools")
  3. Створіть клієнтський сертифікат:
    1. Створіть ключ і CSR:
      openssl req -new -newkey rsa:2048 -nodes -sha256 \
        -keyout client-key.pem \
        -out client-req.pem \
        -subj "/CN=postgresql-client"
    2. Підпишіть сертифікат:
      openssl x509 -req -sha256 -days 365 \
        -in client-req.pem \
        -CA ca-cert.pem \
        -CAkey ca-key.pem \
        -CAserial ca-cert.srl \
        -out client-cert.pem \
        -extfile <(printf "basicConstraints=critical,CA:FALSE\nkeyUsage=critical,digitalSignature,keyEncipherment\nextendedKeyUsage=clientAuth")
  4. Встановіть серверний сертифікат, його ключ та сертифікат CA у розділі «PostgreSQL» на вкладці «Налаштування → SSL» (поле з паролем приватного ключа залиште порожнім, якщо не вказували його при створенні сертифіката):
  5. Перевірте адресу хоста у встановленому сертифікаті (у команді використовуйте ваші дані для підключення: 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
  6. Підключіться до інстансу за допомогою клієнтського сертифіката та переконайтеся, що з’єднання зашифровано (у команді використовуйте ваші дані для підключення: example.psql.tools — хост, 12345 — порт, db1 — база даних, user1 — користувач):
    psql "host=example.psql.tools port=12345 dbname=db1 user=user1 sslmode=verify-full sslrootcert=ca-cert.pem sslcert=client-cert.pem sslkey=client-key.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 | /CN=postgresql-client
Зміст