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.