Включение SSL-шифрования и аутентификации пароля SCRAM-SHA-256 в PostgreSQL
Текущие потребности бизнеса продолжают расти из-за увеличения количества нарушений безопасности во всем мире. В результате каждая организация подтягивает свои носки, затягиваясь, и максимально сокращает поверхность атаки. Будь то приложения, сети, серверы или базы данных, стандарты безопасности являются ключевыми требованиями, от которых ни в коем случае нельзя уклоняться. В результате мы отправляемся в путешествие по защите вашей мощной объектно-реляционной базы данных с открытым исходным кодом PostgreSQL.
PostgreSQL — это мощная система объектно-реляционной базы данных с открытым исходным кодом, которая использует и расширяет язык SQL в сочетании с множеством функций, обеспечивающих безопасное хранение и масштабирование самых сложных рабочих нагрузок с данными. Источник: Страница PostgreSQL
Мы собираемся посмотреть, как включить соединение SSL / TLS с вашей базой данных PostgreSQL, сначала включив SSL в базе данных, а затем добавив сертификат клиенту для безопасного соединения. Кроме того, мы собираемся включить парольную аутентификацию SCRAM-SHA-256 в нашей базе данных PostgreSQL. Чтобы мы все были на одной странице, мы опишем парольную аутентификацию SCRAM-SHA-256 .
Метод аутентификации по паролю scram-sha-256 выполняет аутентификацию SCRAM-SHA-256, как описано в RFC 7677 . Это схема «запрос-ответ», которая предотвращает перехват паролей в ненадежных соединениях и поддерживает хранение паролей на сервере в криптографически хешированной форме, которая считается безопасной. Источник: Страница PostgreSQL
Now that the formalities are out of the way, we shall proceed to enabling SSL and SCRAM-SHA-256 password authentication by following the steps below.
NOTE: We shall be using CentOS for this example, the directory paths presented may differ in different distributions.
Теперь, когда формальности ушли, мы перейдем к включению аутентификации паролей SSL и SCRAM-SHA-256 , выполнив следующие шаги.
ПРИМЕЧАНИЕ. В этом примере мы будем использовать CentOS, представленные пути к каталогам могут отличаться в разных дистрибутивах.
Шаг 1. Установите базу данных PostgreSQL
Создайте сертификаты
PostgreSQL имеет встроенную поддержку использования SSL-соединений для шифрования связи клиент / сервер для повышения безопасности. Если у вас нет приобретенных сертификатов, создайте сертификат сервера, подлинность которого может быть подтверждена клиентами. Для этого сначала создайте запрос на подпись сертификата (CSR) и файл открытого / закрытого ключа, например:
openssl req -new -nodes -text -out root.csr \
-keyout root.key -subj "/CN=root.infoit.com.ua"
Убедитесь, что вы изменили « root.infoit.com » в соответствии с вашим доменным именем. После создания корневого ключа убедитесь, что для него установлены максимально безопасные разрешения. Убедитесь, что « группа » и « другие » не смогут читать, писать и выполнять..
sudo chmod og-rwx root.key
После этого подпишите запрос ключом для создания корневого центра сертификации (используя расположение файла конфигурации OpenSSL по умолчанию в Linux). Вы можете проверить расположение файла конфигурации OpenSSL в Linux, выполнив команду « openssl version -d »..
openssl x509 -req -in root.csr -text -days 3650 \
-extfile /etc/pki/tls/openssl.cnf -extensions v3_ca \
-signkey root.key -out root.crt
Наконец, создайте сертификат сервера, подписанный новым корневым центром сертификации:
\##Generate private server key and set secure permissions
openssl req -new -nodes -text -out server.csr \
-keyout server.key -subj "/CN=datab.infoit.com.ua"
sudo chmod og-rwx server.key
Затем также создайте сертификат сервера, подписанный новым корневым центром сертификации.
openssl x509 -req -in server.csr -text -days 365 \
-CA root.crt -CAkey root.key -CAcreateserial \
-out server.crt
Приведенные выше команды создадут server.crt и server.key . Это сертификаты серверов, которые мы будем добавлять в PostgreSQL. С другой стороны, root.crt должен храниться на клиенте, чтобы клиент мог убедиться, что сертификат сервера был подписан его доверенным корневым сертификатом. Теперь root.crt должен быть встроен в ваши приложения, написанные на Java и любом другом языке программирования. Для Java это должно быть добавлено в хранилище ключей .
Храните root.key в безопасном месте, чтобы его можно было использовать при создании будущих сертификатов.
Для удобства скопируем серверный и корневой сертификаты в место, где PostgreSQL хранит свои основные файлы конфигурации. Таким образом, Postgres сможет читать их в том же месте, где он читает свои файлы конфигурации.
Расположение в CentOS /var/lib/pgsql/13/data/ для PostgreSQL 13 и, /var/lib/pgsql/12/data/ для PostgreSQL 12 /var/lib/pgsql/11/data/ для PostgreSQL 11. В этом примере мы будем использовать PostgreSQL 11.
sudo cp server.* root.crt /var/lib/pgsql/11/data/ ##For PostgreSQL 11
Шаг 2. Настройте базу данных PostgreSQL для включения SSL
Теперь, когда у нас есть сертификаты, ничто не мешает нам включить SSL на нашем сервере PostgreSQL. В зависимости от версии вашей базы данных PostgreSQL откройте ее файл конфигурации. В качестве примера мы будем использовать версию 11. Найдите в файле комментарии, связанные с ssl, и раскомментируйте их. Линии разделены ниже.
$ sudo vim /var/lib/pgsql/11/data/postgresql.conf
ssl = on
ssl_ca_file = 'root.crt'
ssl_cert_file = 'server.crt'
ssl_key_file = 'server.key'
ssl_ciphers = 'ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH'
ssl_prefer_server_ciphers = on
ssl_ecdh_curve = 'prime256v1'
После этого нам нужно включить запись hostssl в файле pg_hba.conf, которая будет соответствовать попыткам подключения, сделанным с использованием TCP / IP, но только если подключение выполняется с использованием SSL-шифрования. Откройте файл и отредактируйте следующим образом::
$ sudo vim /var/lib/pgsql/11/data/pg_hba.conf
hostssl all all 10.38.87.40/32 md5 clientcert=verify-full
hostssl all all 10.38.87.41/32 md5 clientcert=verify-full
hostssl all all 10.38.87.42/32 md5 clientcert=verify-full
hostssl all all 10.38.87.43/32 md5 clientcert=verify-full
Чтобы сохранить изменения, которые мы сделали до сих пор, нам нужно перезапустить службу PostreSQL следующим образом:
sudo systemctl restart postgresql-<version>
Убедитесь, что SSL включен
Чтобы убедиться, что настройки SSL работают, мы собираемся войти в базу данных и проверить сообщение, которое она нам представит. Вы можете запустить приведенную ниже команду внутри сервера или с другого сервера с установленным psql и разрешенным для подключения к базе данных. Вы должны увидеть сообщение, подобное приведенному ниже, и SSL должен быть успешно включен.
$ psql -U postgres -h 10.38.87.46 -d postgres
Password for user postgres:
psql (11.11)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.
postgres=#
Шаг 3. Настройте базу данных PostgreSQL для включения SCRAM-SHA-256
Теперь, когда SSL включен и работает в соответствии с настройками, давайте добавим еще один уровень безопасности, включив аутентификацию по паролю SCRAM-SHA-256. Это очень простой процесс. Сначала откройте основной файл конфигурации postgresql и измените строку ниже, как показано.
$ sudo vim /var/lib/pgsql/11/data/postgresql.conf
password_encryption = scram-sha-256
Как только это будет сделано, нам нужно заставить клиентов аутентифицироваться по этой новой схеме, отредактировав файл pg_hba.conf, как показано ниже. Вы заметите, что все вхождения md5 были заменены на scram-sha-256.
$ sudo vim /var/lib/pgsql/11/data/pg_hba.conf
hostssl all all 10.38.87.40/32 scram-sha-256 clientcert=verify-full
hostssl all all 10.38.87.41/32 scram-sha-256 clientcert=verify-full
hostssl all all 10.38.87.42/32 scram-sha-256 clientcert=verify-full
hostssl all all 10.38.87.43/32 scram-sha-256 clientcert=verify-full
Чтобы сохранить изменения, которые мы сделали до сих пор, нам нужно перезапустить службу PostreSQL следующим образом:
sudo systemctl restart postgresql-11
После внесения этих изменений нам придется обновить пароли для всех пользователей в вашей базе данных, иначе вы не сможете войти в систему. Для этого войдите в свою базу данных следующим образом. У вас должны быть права sudo ..
$ sudo su - postgres
Last login: Fri Feb 19 17:16:16 EAT 2021 on pts/0
-bash-4.2$ psql
psql (11.11)
Type "help" for help.
postgres=#
Затем запустите команду пароля, например, и нажмите клавишу ВВОД. Вам будет предложено дважды ввести пароль. Вы можете ввести тот же пароль, что и раньше. Теперь он будет зашифрован с использованием новой схемы scram-sha-256 .
postgres=#\password <db_user>
Enter new password:
Enter it again:
postgres=#
Как только это будет сделано, останется только добавить сертификаты в клиентские приложения. Для систем * nix вы можете разместить сертификат клиента в каталоге $ {user.home} /. Postgresql / . Как встраивать сертификат клиента в различные приложения, написанные на разных языках, выходит за рамки этого руководства. Пример для Java представлен в документации PostgreSQL JDBC.
При подключении с помощью драйвера JDBC строка подключения должна соответствовать следующему формату. Обратите внимание на добавленную опцию ssl=true.
jdbc:postgresql://<database-server-ip-or-fqdn>:<database-port>/<database-name>?ssl=true
##For example
jdbc:postgresql://datab.infoit.com.ua:5432/all_cent_customers?ssl=true