PostgreSQL · 6 min read · Dec 21, 2025

Как включить SSL для соединений PostgreSQL

По умолчанию все соединения PostgreSQL незащищены, что может вызвать проблемы с безопасностью при работе в условиях высокой нагрузки в производственной среде. Шифрование SSL гарантирует, что любые передаваемые данные не будут перехвачены никем в процессе соединения.

Этот учебник научит вас, как включить SSL/TLS для соединений PostgreSQL.

Предварительные требования

  • Сервер на базе Linux. Для нашего учебника мы используем сервер Ubuntu 22.04.
  • Пользователь sudo без прав root.
  • Полностью квалифицированное доменное имя (FQDN), например, postgresql.example.com.
  • Убедитесь, что все обновлено. $ sudo apt update $ sudo apt upgrade
  • Несколько пакетов, которые нужны вашей системе. $ sudo apt install curl nano software-properties-common apt-transport-https ca-certificates lsb-release ubuntu-keyring -y Некоторые из этих пакетов могут уже быть установлены на вашей системе.

Шаг 1 - Настройка брандмауэра

Перед установкой любых пакетов первым шагом является настройка брандмауэра для открытия портов для HTTP, HTTPS и PostgreSQL.

Проверьте статус брандмауэра.

$ sudo ufw status

Вы должны увидеть что-то вроде следующего.

Статус: активен

Кому                       Действие      Откуда
--                         ------      ----
OpenSSH                    ALLOW       Везде
OpenSSH (v6)               ALLOW       Везде (v6)

Откройте порты HTTP, HTTPS и PostgreSQL в брандмауэре.

$ sudo ufw allow 5432
$ sudo ufw allow http
$ sudo ufw allow https

Проверьте статус снова, чтобы подтвердить.

$ sudo ufw status
Статус: активен

Кому                       Действие      Откуда
--                         ------      ----
OpenSSH                    ALLOW       Везде                  
80/tcp                     ALLOW       Везде                  
443                        ALLOW       Везде                  
5432                       ALLOW       Везде                  
OpenSSH (v6)               ALLOW       Везде (v6)             
80/tcp (v6)                ALLOW       Везде (v6)             
443 (v6)                   ALLOW       Везде (v6)
5432 (v6)                  ALLOW       Везде (v6)             

Шаг 2 - Установка PostgreSQL 14

Ubuntu 22.04 по умолчанию поставляется с PostgreSQL 14. Чтобы установить, выполните следующую команду.

$ sudo apt install postgresql postgresql-contrib

Пакет postgresql-contrib содержит некоторые дополнительные утилиты.

Вы также можете использовать официальный репозиторий APT PostgreSQL для установки. Выполните следующую команду, чтобы добавить GPG-ключ PostgreSQL.

$ curl https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor | sudo tee /usr/share/keyrings/postgresql-key.gpg >/dev/null

Добавьте репозиторий APT в список источников.

$ sudo sh -c 'echo "deb [signed-by=/usr/share/keyrings/postgresql-key.gpg arch=amd64] http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'

Обновите системный репозиторий.

$ sudo apt update

Теперь вы можете установить PostgreSQL, используя команду, упомянутую выше.

Проверьте статус службы PostgreSQL.

$ sudo systemctl status postgresql
? postgresql.service - PostgreSQL RDBMS
     Загружено: загружено (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled)
     Активно: активно (вышло) с Пн 2022-12-12 00:01:06 UTC; 19s назад
   Основной PID: 3497 (код=вышел, статус=0/УСПЕШНО)
        CPU: 1ms

Dec 12 00:01:06 postgresql systemd[1]: Запуск PostgreSQL RDBMS...
Dec 12 00:01:06 postgresql systemd[1]: Завершено PostgreSQL RDBMS.

Вы можете увидеть, что служба включена и работает по умолчанию.

Установите пароль для учетной записи postgres.

$ sudo -i -u postgres psql -c "ALTER USER postgres PASSWORD '';"

Шаг 3 - Установка SSL

Чтобы установить SSL-сертификат с помощью Let’s Encrypt, нам нужно скачать инструмент Certbot. Мы будем использовать установщик пакетов Snapd для этого. Ubuntu 22.04 поставляется с предустановленным Snap.

Убедитесь, что ваша версия Snapd обновлена.

$ sudo snap install core 
$ sudo snap refresh core

Установите Certbot.

$ sudo snap install --classic certbot

Используйте следующую команду, чтобы убедиться, что команда Certbot запускается, создав символическую ссылку на директорию /usr/bin.

$ sudo ln -s /snap/bin/certbot /usr/bin/certbot

Сгенерируйте SSL-сертификат.

$ sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d postgresql.example.com

Вышеуказанная команда загрузит сертификат в директорию /etc/letsencrypt/live/postgresql.example.com на вашем сервере.

Сгенерируйте сертификат группы Диффи-Хеллмана.

$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096

Шаг 4 - Настройка автоматического обновления Certbot для PostgreSQL

PostgreSQL не имеет разрешения на доступ к сертификатам из папки Let’s Encrypt, поэтому мы не можем сказать ему использовать сертификаты из папки напрямую. Альтернатива - скопировать сертификаты в директорию PostgreSQL, но это работает только временно, так как они истекут, и вам придется копировать их снова вручную.

Лучший метод - использовать хук обновления, который будет автоматически запускаться при каждом обновлении и выполнять операции копирования.

Узнайте директорию данных PostgreSQL.

$ sudo -i -u postgres psql -U postgres -c 'SHOW data_directory'

Создайте файл хука обновления и откройте его для редактирования.

$ sudo nano /etc/letsencrypt/renewal-hooks/deploy/postgresql.sh

Вставьте следующий код в него.

#!/bin/bash
umask 0177
DOMAIN=postgresql.example.com
DATA_DIR=/var/lib/postgresql/15/main
cp /etc/letsencrypt/live/$DOMAIN/fullchain.pem $DATA_DIR/server.crt
cp /etc/letsencrypt/live/$DOMAIN/privkey.pem $DATA_DIR/server.key
chown postgres:postgres $DATA_DIR/server.crt $DATA_DIR/server.key
# только для SELinux - CentOS, Red Hat
# chcon -t postgresql_db_t $DATA_DIR/server.crt $DATA_DIR/server.key

Сохраните файл, нажав Ctrl + X и введя Y, когда будет предложено.

Сделайте файл исполняемым.

$ sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/postgresql.sh

Шаг 5 - Настройка PostgreSQL

Найдите путь к файлу конфигурации PostgreSQL.

$ sudo -i -u postgres psql -U postgres -c 'SHOW config_file'

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

$ sudo nano /etc/postgresql/15/main/postgresql.conf

Найдите раздел Настройки соединения и раскомментируйте переменную listen_address, изменив ее значение на *. Убедитесь, что оно выглядит следующим образом.

listen_address = '*'        # на каком IP-адресе(ах) слушать;

Найдите раздел SSL и измените файл, чтобы он соответствовал следующим значениям.

ssl = on  
ssl_cert_file = 'server.crt'  
ssl_key_file = 'server.key'  
ssl_prefer_server_ciphers = on
ssl_dh_params_file = '/etc/ssl/certs/dhparam.pem'

Сохраните файл, нажав Ctrl + X и введя Y, когда будет предложено.

Шаг 6 - Настройка соединения PostgreSQL

Откройте файл /etc/postgresql/15/main/pg_hba.conf для редактирования.

$ sudo nano /etc/postgresql/15/main/pg_hba.conf

Добавьте следующую строку, чтобы включить SSL для PostgreSQL.

hostssl all  all  0.0.0.0/0  scram-sha-256

Сохраните файл, нажав Ctrl + X и введя Y, когда будет предложено.

Шаг 7 - Обновление сертификата

Выполните следующую команду, чтобы выполнить принудительное обновление. Это вызовет скрипт развертывания, который копирует сертификаты в правильное место для использования PostgreSQL.

$ sudo certbot renew --force-renewal

Проверьте, что сертификаты скопированы в директорию данных PostgreSQL.

$ sudo ls /var/lib/postgresql/15/main/

Вы увидите следующий вывод, который покажет вам сертификаты.

base          pg_dynshmem   pg_notify    pg_snapshots  pg_subtrans  PG_VERSION  postgresql.auto.conf  server.crt
global        pg_logical    pg_replslot  pg_stat       pg_tblspc    pg_wal      postmaster.opts       server.key
pg_commit_ts  pg_multixact  pg_serial    pg_stat_tmp   pg_twophase  pg_xact     postmaster.pid

Перезапустите PostgreSQL, чтобы применить изменения.

$ sudo systemctl restart postgresql

Шаг 8 - Протестируйте соединение

Подключитесь к базе данных с другого компьютера с установленным клиентом PostgreSQL.

$ psql -d "dbname=postgres sslmode=require" -h postgresql.example.com -U postgres

Вы должны увидеть следующий запрос PostgreSQL. Мы используем клиент с PostgreSQL 14, поэтому вы увидите предупреждение о несовместимых версиях.

Пароль для пользователя postgres:
psql (14.5 (Ubuntu 14.5-0ubuntu0.22.04.1), сервер 15.1 (Ubuntu 15.1-1.pgdg22.04+1))
WARNING: psql major version 14, server major version 15.
         Некоторые функции psql могут не работать.
SSL соединение (протокол: TLSv1.3, шифр: TLS_AES_256_GCM_SHA384, биты: 256, сжатие: отключено)
Введите "help" для справки.

postgres=#

Это подтверждает успешное SSL-соединение.

Выйдите из оболочки.

postgres=# \q

Если ваше приложение использует строку подключения, используйте ее в следующем формате для SSL-соединения.

postgres://user:[email protected]:5432/database_name?sslmode=require

Вы можете изменить режим SSL на verify-full или verify-ca, если у вас есть корневой сертификат для Let’s Encrypt, доступный в директории /var/lib/postgresql/.postgresql на стороне клиента.

Создайте директорию /var/lib/postgresql/.postgresql.

$ sudo mkdir -p /var/lib/postgresql/.postgresql

Корневой сертификат Let’s Encrypt - это ISRG Root X1, который находится на сервере по адресу /usr/share/ca-certificates/mozilla/ISRG_Root_X1.crt.

Скопируйте корневой сертификат в директорию /var/lib/postgresql/.postgresql.

$ sudo cp /usr/share/ca-certificates/mozilla/ISRG_Root_X1.crt /var/lib/postgresql/.postgresql/root.crt

Протестируйте соединение, используя режим verify-full или verify-ca, и вы должны увидеть успешное соединение.

Шаг 9 - Проверьте клиентов

Войдите в оболочку PostgreSQL на сервере.

$ sudo -i -u postgres psql

Выполните следующую SQL-команду, чтобы проверить подключенные клиенты.

SELECT ssl.pid, usename, datname, ssl, ssl.version, ssl.cipher, ssl.bits, client_addr
FROM pg_catalog.pg_stat_ssl ssl, pg_catalog.pg_stat_activity activity
WHERE ssl.pid = activity.pid;

Вы должны увидеть аналогичный вывод.

 pid  | usename  | datname  | ssl | version |         cipher         | bits |  client_addr
------+----------+----------+-----+---------+------------------------+------+----------------
 5126 | postgres | postgres | t   | TLSv1.3 | TLS_AES_256_GCM_SHA384 |  256 | 122.161.84.220
 5154 | postgres | postgres | f   |         |                        |      |
(2 строки)

Это подтверждает подключение клиента со стороны сервера.

Заключение

Это завершает учебник по включению SSL на соединениях PostgreSQL. Если у вас есть какие-либо вопросы, оставьте их в комментариях ниже.

Share: X/Twitter LinkedIn

Get new posts in your inbox

No spam. Unsubscribe anytime.