===================================================================== Настройка PostgreSQL РЅР° аутентификацию клиентов только РїРѕ сертификату ===================================================================== Оригинальная документация РїРѕ теме ================================= Главными отправными точками являются страницы документации PostgreSQL: `17.9. Secure TCP/IP Connections with SSL <https://www.postgresql.org/docs/9.5/ssl-tcp.html>`_ `18.3.2. Security and Authentication <https://www.postgresql.org/docs/9.5/runtime-config-connection.html#GUC-SSL-CIPHERS>`_ Рвспомогательные: `19.3.9. Certificate Authentication <https://www.postgresql.org/docs/9.5/auth-methods.html#AUTH-CERT>`_ `19.2. User Name Maps <https://www.postgresql.org/docs/9.5/auth-username-maps.html>`_ `19.1. The pg_hba.conf File <https://www.postgresql.org/docs/9.5/auth-pg-hba-conf.html#EXAMPLE-PG-HBA.CONF>`_ `20.12. Certificate Authentication <https://www.postgresql.org/docs/11/auth-cert.html>`_ Введение ======== Для включения режима аутентификации клиентов РїРѕ сертификатам, потребуется произвести следующие изменения РІ настройках сервера postgresql: - Разместить РЅР° сервере файлы: сертификата сервера, ключа сертификата сервера, доверенный корневой сертификат (для валидации клиентских сертификатов) - Внести изменения РІ файлы конфигурации: **postgresql.conf**, **pg_hba.conf**, **pg_ident.conf** Установка сертификатов РЅР° сервер ================================ Необходимо разместить РІ каталоге **pgdata** трех файла: - | **postgresql.crt** | Сертификат сервера - | **postgresql.key** | Ключ сертификата сервера (без шифрования контента) - | **robin_CA.crt** | Доверенный корневой сертификат (для валидации клиентских сертификатов) Внести изменения РІ файлы конфигурации: - | **postgresql.conf** | Укажем размещений файлов сертификатов Рё разрешим РёС… использование - | **pg_hba.conf** | Включим требование РЅР° обязательное использование клиентом сертификата РїСЂРё аутентификации - | **pg_ident.conf** | Смапируем имена клиентов РЅР° логины БД Подготовка файлов сертификатов ------------------------------ Создание файла серверного сертификата ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Для подготовки серверного сертификата воспользуемся процедурой описанной РІ разделе "Сертификат сервера" страницы :doc:`Создание Рё установка сертификатов сервера приложений WildFly (JBoss EAP) </ssl_wildfly>`, включая момент скачивания файла сертификата РІ формате CER, СЃРѕ страницы РЈР¦. Переименуем скачанный файл РІ postgresql.cer. Теперь необходимо преобразовать формат файла РІ CRT. Для этого воспользуемся утилитой openssl: Конвертация формата файла сертификата CER в†’ CRT :: openssl x509 -inform DER -in postgresql.cer -out postgresql.crt Таким образом РјС‹ получили первый РёР· необходимых файлов - **postgresql.crt** Создание файла приватного ключа серверного сертификата ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Теперь необходимо получить незашифрованный приватный ключ. Р’ данный момент РѕРЅ размещен РІ хранилище - файле server.keystore. Для его извлечения так Р¶Рµ воспользуемся утилитой openssl (РІ РґРІРµ операции): 1) Ркспортируем приватный ключ РёР· хранилища РІ файл формата PKCS12 :: keytool -v -importkeystore -srckeystore server.keystore -storepass secret -srcalias selfsigned-cert -destkeystore postgresql.p12 -deststoretype PKCS12 2) Рзвлечем приватный ключ РёР· файла PKCS12 РІ незашифрованном РІРёРґРµ :: openssl pkcs12 -in postgresql.p12 -nocerts -nodes -out postgresql.key Таким образом РјС‹ получили второй РёР· необходимых файлов - **postgresql.key** Создание файла клиентского корневого доверенного сертификата ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Третий файл скачиваем СЃ частного Центра сертификации РїРѕ ссылке: http://172.28.4.14/certsrv/certcarc.asp Далее конвертируем формат файла сертификата (CER в†’ CRT): :: openssl x509 -inform DER -in robin_CA.cer -out robin_CA.crt Таким образом РјС‹ получили третий Рё последний РёР· необходимых файлов - **robin_CA.key** Теперь, разместив РІСЃРµ полученные файлы РІ директории pgdata, перейдем Рє правке конфигурационных файлов сервера БД. Внесение правок РІ файлы конфигурации ------------------------------------ postgresql.conf (Укажем размещений файлов сертификатов Рё разрешим РёС… использование) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Р’ секции SSL, необходимо ключить использование SSL Рё указать имена файлов сертификатов Рё приватный ключ .. image:: images/image-sp-1.png pg_hba.conf (Включим требование РЅР° обязательное использование клиентом сертификата РїСЂРё аутентификации) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Отключим аутентификацию РїРѕ паролю (закомментировав соответствующую строку) Рвключим аутентификацию РїРѕ сертификату, добавив строку СЃ ключом hostssl. Р’ методе аутентификации указано: "cert" - аутентификация РїРѕ сертификату, "map=robin" - использовать карту мапирования "robin" (РёР· файла pg_ident.conf), "clientcert=1" - требовать РѕС‚ клиента предоставить клиентский сертификат. .. image:: images/image-sp-2.png pg_ident.conf (Мапинг имени клиента РЅР° логин БД) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Пример, приведенный РЅР° скриншоте, РЅРµ очень удачный. Рспользуется РёРјСЏ РіСЂСѓРїРїС‹, вместо логина юзера. РќРѕ так получилось, потому что РІ сертификате было указано РґРІР° поля CN, РІ РѕРґРЅРѕРј было РёРјСЏ РіСЂСѓРїРїС‹, РІ РґСЂСѓРіРѕРј логи пользователя. Сервер подхватил РёРјСЏ РіСЂСѓРїРїС‹, поэтому пришлось прописать СЃСЋРґР° его. Что может быть СѓРґРѕР±РЅРѕ РІ некоторых сценариях организации коннекта Рє БД. .. image:: images/image-sp-3.png Пример использования клиентом сертификата для аутентификации ============================================================ .. image:: images/image-sp-4.png Клиентский сертификат получаем аналогично сертификату сервера. Создаем самоподписанный сертификат, подписываем его РІ РЈР¦ (шаблон сертификата - User), конвертируем РІ crt. Приватный ключ получаем РёР· соответствующего самоподписанного сертификата. Указание доменного имени РїСЂРё коннекте ------------------------------------- Рў.Рє. РІ CN серверного сертификата указано конкретное доменное РёРјСЏ, клиент должен обязательно использовать данное доменное РёРјСЏ РїСЂРё установлении соединения .. image:: images/image-sp-5.png Предоставление файлов клиентского сертификата Рё ключа ----------------------------------------------------- Как РІРёРґРЅРѕ РЅР° скриншоте, РїСЂРё настройке коннекта РЅР° клиенте, указываются пути Рє файлам сертификата РІ формате CRT Рё Рє файлу СЃ незашифрованным приватным ключом. Предоставление файла доверенного корневого серверного сертификата ----------------------------------------------------------------- Как РІРёРґРЅРѕ РЅР° скриншоте, РїСЂРё настройке коннекта РЅР° клиенте, указывается путь Рє доверенному корневому сертификату сервера, который будет использован для валидации серверного сертификата. Полезные команды OpenSSL ======================== Конвертация формата файла сертификата ------------------------------------- :: openssl x509 -inform DER -in postgresql.cer -out postgresql.crt РРєСЃРїРѕСЂС‚ приватного ключа РІ PKCS12 --------------------------------- :: keytool -v -importkeystore -srckeystore server.keystore -storepass secret -srcalias selfsigned-cert -destkeystore postgresql.p12 -deststoretype PKCS12 Рзвлечение приватного ключа РІ незашифрованном РІРёРґРµ -------------------------------------------------- :: openssl pkcs12 -in postgresql.p12 -nocerts -nodes -out postgresql.key