Как включить SSL в PostgreSQL

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

Как включить SSL в PostgreSQL

Шаги по включению SSL-соединения в PostgreSQL следующие. 

На сервере PostgreSQL нам нужны 3 сертификата (например, в каталоге данных) для настройки SSL:

  • rootCA.crt (доверенный корневой сертификат)
  • server.crt (сертификат сервера)
  • server.key (закрытый ключ)

Откройте терминал и выполните следующую команду для запуска от имени root

$ sudo -i
# mkdir /var/lib/CA
# cd /var/lib/CA

Первым делом создаём корневой ключ для CA и затем создаем корневой сертификат CA с помощью openssl.

# openssl genrsa -out rootCA.key 2048
# openssl req -x509 -new -key rootCA.key -days 10000 -out rootCA.crt

Аналогично, сгенерируем ключ для сервера. Имена выбираем произвольно, мы используем очевидное server.*

# mkdir server
# cd server
# openssl genrsa -out server.key 2048

Теперь создаем запрос на сертификат. При заполнении полей, в поле Common Name важно указать имя сервера: домен или IP адрес.

# openssl req -new -key server.key -out server.csr

Подписываем запрос на сертификат нашим корневым сертификатом.

# openssl x509 -req -in server.csr -CA ../rootCA.crt -CAkey ../rootCA.key -CAcreateserial -out server.crt -days 5000

В приведенном выше примере параметр -x509 указывает на самозаверяющий сертификат. Вам будет предложено ввести такие данные, как адрес электронной почты, страна и т.д. Введите их и завершите генерацию сертификата.

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

Теперь проделываем эти три последние команды снова, но уже создаем связку ключ-сертификат для потенциального клиента. Имена файлов соответственно меняем (например client.key, client.crt, client.csr). В поле Common Name указываем логин под которым будет выполняться подключение к БД.

# cd ..
# mkdir client
# cd client
# openssl genrsa -out client.key 2048
# openssl req -new -key client.key -out client.csr
# openssl x509 -req -in client.csr -CA ../rootCA.crt -CAkey ../rootCA.key -CAcreateserial -out client.crt -days 5000

Копируем корневой сертификат CA, ключ и сертификат сервера в каталог БД.

# cd ..
# cd server
# cp server.key /var/lib/pgsql/data
# cp server.crt /var/lib/pgsql/data
# cp ../rootCA.crt /var/lib/pgsql/data
# chown postgres:postgres /var/lib/pgsql/data/server.{crt,key} /var/lib/pgsql/data/rootCA.crt
# chmod 600 /var/lib/pgsql/data/server.crt
# chmod 600 /var/lib/pgsql/data/server.key

Обновите файл pg_hba.conf, чтобы добавить следующие строки

# IPv4 remote connections for authenticated users
hostssl all postgres 0.0.0.0/0 trust clientcert=verify-ca

Отредактируйте файл postgresql.conf, чтобы добавить следующие строки

ssl = on
ssl_ciphers = 'HIGH:MEDIUM:+3DES:!aNULL'
ssl_cert_file = 'server.crt'
ssl_key_file = 'server.key'
ssl_ca_file = 'rootCA.crt'

Перезапустите сервер PostgreSQL

$ /etc/init.d/postgresql restart

Включить SSL на клиенте PostgreSQL

Нам также нужны 3 файла для включения SSL на клиенте PostgreSQL. Мы будем хранить их в каталоге ~/.postgresql/

  • rootCA.crt (доверенный корневой сертификат сервера PostgreSQL)
  • postgresql.crt (сертификат клиента)
  • postgresql.key (закрытый ключ)
$ mkdir .postgresql/
# scp pgserver.local:/var/lib/CA/client/client.key ~/.postgresql/postgresql.key
# scp pgserver.local:/var/lib/CA/client/client.crt ~/.postgresql/postgresql.crt
# scp pgserver.local:/var/lib/CA/rootCA.crt ~/.postgresql/root.crt
# chmod 600 ~/.postgresql/postgresql.key

На этом все, выполняем попытку подключения.

# psql -h pgserver.local -U username database_name
SSL connection (cipher: ECDHE-RSA-AES256-SHA, bits: 256)

Строка с SSL шифром свидетельствует о том что подключение выполнено с использованием SSL.

Добавить комментарий

Ваш адрес email не будет опубликован.