Включение SSL-шифрования и аутентификации пароля SCRAM-SHA-256 в PostgreSQL

Включение 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

 

 

Author: forgero