пятница, 19 августа 2016 г.

Настройка PostgreSQL для работы с клиентами через SSL

Сначала создаем центр сертификации (далее CA - Certificate Authority) с помощью которого мы будем выпускать сертификаты как для серверов так и для клиентов. CA можно создать где угодно, лишь бы был установлен пакет OpenSSL благо он установлен во всех дистрибутивах по-умолчанию

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

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

На этом центр сертификации создан. Переходим к созданию ключей и сертификатов для серверов и клиентов. Перед тем как начать, рекомендуется подумать над иерархией хранения всех ключей и сертификатов
, представьте что через год у вас будет несколько десятков ключей, сертификатов для серверов, клиентов.
Итак, генерируем ключ для сервера. Имена выбираем произвольно, я выбрал очевидное server.*. Если же ключей будет много, то в качестве имен можно использовать имена хостов.

# openssl genrsa -out server.key 2048

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

# 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

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

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

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

Теперь переходим к правке конфигурации PostgreSQL. PostgreSQL должен быть собран с поддержкой SSL.

# vi postgresql.conf
ssl = on
ssl_ciphers = 'HIGH:MEDIUM:+3DES:!aNULL'
ssl_renegotiation_limit = 512MB
ssl_cert_file = 'server.crt'
ssl_key_file = 'server.key'
ssl_ca_file = 'rootCA.crt'
# vi pg_hba.conf
hostssl database_name           username           192.168.122.1/32        trust clientcert=1

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

# scp caserver.lo:client.key /home/username/.postgresql/postgresql.key
# scp caserver.lo:сlient.crt /home/username/.postgresql/postgresql.crt
# scp caserver.lo:rootCA.crt /home/username/.postgresql/root.crt
# chmod 600 /home/username/.postgresql/postgresql.key

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

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

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

Взято отсюда.