Как включить SSL для соединений PostgreSQL
На этой странице
- Предпосылки
- Шаг 1. Настройка брандмауэра
- Шаг 2. Установите PostgreSQL 14.
- Шаг 3. Установите SSL
- Шаг 4. Настройка продления Certbot для PostgreSQL
- Шаг 5. Настройка PostgreSQL
- Шаг 6. Настройка подключения к PostgreSQL
- Шаг 7. Продление сертификата
- Шаг 8. Проверка подключения
- Шаг 9. Проверка клиентов
- Заключение
По умолчанию все соединения PostgreSQL небезопасны, что может вызвать проблемы с безопасностью при работе в производственных средах с высоким трафиком. SSL-шифрование гарантирует, что любые передаваемые данные не будут перехвачены никем в середине соединения.
В этом руководстве вы узнаете, как включить SSL/TLS для подключений к PostgreSQL. div-gpt-ad-howtoforge_com-medrectangle-3-0;var ffid=1;var alS=1021%1000;var container=document.getElementById(slotId);container.style.width=100%;var ins=document. createElement(ins);ins.id=slotId+-asloaded;ins.className=adsbygoogle ezasloaded;ins.dataset.adClient=pid;ins.dataset.adChannel=cid;if(ffid==2){ins.dataset.fullWidthResponsive= истинный;}
Предпосылки
-
A Linux server. For our tutorial, we are running a Ubuntu 22.04 server.
-
A non-root sudo user.
-
A fully qualified domain name (FQDN) like
postgresql.example.com
. -
Make sure everything is updated.
$ sudo apt update $ sudo apt upgrade
-
Few packages that your system needs.
$ sudo apt install curl nano software-properties-common apt-transport-https ca-certificates lsb-release ubuntu-keyring -y
Some of these packages may already be installed on your system.
Шаг 1. Настройте брандмауэр
Прежде чем устанавливать какие-либо пакеты, первым шагом является настройка брандмауэра для открытия портов для HTTP, HTTPS и PostgreSQL.
Проверьте состояние брандмауэра.
$ sudo ufw status
Вы должны увидеть что-то вроде следующего.
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6)
Откройте порты HTTP, HTTPS и PostgreSQL в брандмауэре.
$ sudo ufw allow 5432 $ sudo ufw allow http $ sudo ufw allow https
Проверьте статус еще раз для подтверждения.
$ sudo ufw status Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere 80/tcp ALLOW Anywhere 443 ALLOW Anywhere 5432 ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) 80/tcp (v6) ALLOW Anywhere (v6) 443 (v6) ALLOW Anywhere (v6) 5432 (v6) ALLOW Anywhere (v6)
Шаг 2 — Установите PostgreSQL 14
Ubuntu 22.04 поставляется с PostgreSQL 14 по умолчанию. Для установки введите следующую команду.
$ sudo apt install postgresql postgresql-contrib
Пакет postgresql-contrib
содержит несколько дополнительных утилит.
Вы также можете использовать официальный репозиторий APT PostgreSQL для установки. Выполните следующую команду, чтобы добавить ключ PostgreSQL GPG.
$ 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 Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled) Active: active (exited) since Mon 2022-12-12 00:01:06 UTC; 19s ago Main PID: 3497 (code=exited, status=0/SUCCESS) CPU: 1ms Dec 12 00:01:06 postgresql systemd[1]: Starting PostgreSQL RDBMS... Dec 12 00:01:06 postgresql systemd[1]: Finished PostgreSQL RDBMS.
Вы можете видеть, что служба включена и работает по умолчанию.
Установите пароль для учетной записи postgres
.
$ sudo -i -u postgres psql -c "ALTER USER postgres PASSWORD '<new_password>';"
Шаг 3 — Установите SSL
Чтобы установить SSL-сертификат с помощью Lets Encrypt, нам нужно загрузить инструмент Certbot. Для этого мы будем использовать установщик пакета Snapd. Ubuntu 22.04 поставляется с предустановленной программой Snap.
Убедитесь, что ваша версия Snapd обновлена.
$ sudo snap install core $ sudo snap refresh core
Установите Сертбот.
$ 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 -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 нет разрешения на доступ к сертификатам из папки Lets 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 # only for 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 = '*' # what IP address(es) to listen on;
Найдите раздел 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, поэтому вы увидите предупреждение о несовместимых версиях.
Password for user postgres: psql (14.5 (Ubuntu 14.5-0ubuntu0.22.04.1), server 15.1 (Ubuntu 15.1-1.pgdg22.04+1)) WARNING: psql major version 14, server major version 15. Some psql features might not work. SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off) Type "help" for help. postgres=#
Это подтверждает успешное SSL-соединение.
Выйдите из оболочки.
postgres=# \q
Если ваше приложение использует строку подключения, используйте ее в следующем формате для подключения SSL.
postgres://user::5432/database_name?sslmode=require
Вы можете изменить режим SSL на verify-full
или verify-ca
, если у вас есть корневой сертификат для Lets encrypt, доступный в /var/lib/postgresql/.postgresql
на стороне клиента.
Создайте каталог /var/lib/postgresql/.postgresql
.
$ sudo mkdir -p /var/lib/postgresql/.postgresql
Корневой сертификат Lets 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 rows)
Это подтверждает подключение клиента со стороны сервера.
Заключение
На этом руководство по включению SSL для соединений PostgreSQL завершено. Если у вас есть какие-либо вопросы, задайте их в комментариях ниже.