Поиск по сайту:

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


На этой странице

  1. Предпосылки
  2. Шаг 1. Настройка брандмауэра
  3. Шаг 2. Установите PostgreSQL 14.
  4. Шаг 3. Установите SSL
  5. Шаг 4. Настройка продления Certbot для PostgreSQL
  6. Шаг 5. Настройка PostgreSQL
  7. Шаг 6. Настройка подключения к PostgreSQL
  8. Шаг 7. Продление сертификата
  9. Шаг 8. Проверка подключения
  10. Шаг 9. Проверка клиентов
  11. Заключение

По умолчанию все соединения 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 завершено. Если у вас есть какие-либо вопросы, задайте их в комментариях ниже.