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. Если у вас есть какие-либо вопросы, оставьте их в комментариях ниже.
Get new posts in your inbox
No spam. Unsubscribe anytime.