Защита соединений PostgreSQL с помощью конфигурации SSL/TLS: Полное руководство

Узнайте, как защитить соединения PostgreSQL с помощью шифрования SSL/TLS. Это полное руководство охватывает конфигурацию на стороне сервера и клиента, включая генерацию сертификатов, изменение файлов `postgresql.conf` и `pg_hba.conf`, а также настройку клиентов для безопасной, зашифрованной связи. Защитите свои конфиденциальные данные при передаче и обеспечьте соответствие современным стандартам безопасности.

90 просмотров

Защита соединений PostgreSQL с помощью конфигурации SSL/TLS: Полное руководство

В современном взаимосвязанном цифровом пространстве защита передаваемых данных имеет первостепенное значение. PostgreSQL, мощная реляционная база данных с открытым исходным кодом, предлагает надежные механизмы для шифрования соединений с использованием SSL/TLS. Это руководство предоставляет исчерпывающее пошаговое описание настройки серверов и клиентов PostgreSQL для принудительного использования шифрования SSL/TLS, защищая конфиденциальную информацию от перехвата данных и атак типа «человек посередине» в недоверенных сетях. Внедрение этих мер безопасности имеет решающее значение для поддержания целостности данных, обеспечения соответствия строгим стандартам безопасности и формирования доверия у ваших пользователей.

В этой статье будут рассмотрены основные шаги: от генерации или получения SSL-сертификатов до настройки PostgreSQL для их использования и, наконец, настройки клиентов для защищенных соединений. Мы углубимся в необходимые параметры конфигурации и предоставим практические примеры, которые помогут вам эффективно реализовать эти улучшения безопасности.

Понимание SSL/TLS в PostgreSQL

SSL/TLS (Secure Sockets Layer/Transport Layer Security) — это криптографический протокол, предназначенный для обеспечения безопасности связи по компьютерной сети. Применительно к PostgreSQL он шифрует данные, обмениваемые между сервером базы данных и его клиентами. Это предотвращает перехват и чтение конфиденциальной информации, такой как учетные данные, финансовые данные или персональные данные, неавторизованными сторонами.

PostgreSQL поддерживает два основных режима для SSL/TLS:

  • ssl=on: Разрешает SSL-соединения, но не требует их. Клиенты могут подключаться как с использованием SSL, так и без него.
  • ssl=prefer: Пытается установить SSL-соединение, но при неудаче переключается на не-SSL-соединение.
  • ssl=require: Требует SSL-соединений. Если SSL-соединение не может быть установлено, клиентское соединение будет отклонено.

Принудительное использование ssl=require является наиболее безопасным вариантом для защиты данных при передаче.

Предварительные условия для конфигурации SSL/TLS

Прежде чем приступить к настройке PostgreSQL для SSL/TLS, убедитесь, что у вас есть следующее:

  1. Установленный OpenSSL: Инструментарий OpenSSL необходим для генерации и управления SSL-сертификатами. Обычно он предустановлен в системах Linux и macOS. Для Windows может потребоваться загрузить и установить его отдельно.
  2. Доступ к файлам конфигурации PostgreSQL: Вам потребуются права администратора для изменения файлов postgresql.conf и pg_hba.conf.
  3. Понимание центров сертификации (ЦС): Хотя вы можете создавать самоподписанные сертификаты для тестирования, производственные среды в идеале должны использовать сертификаты, подписанные доверенным центром сертификации (ЦС) или внутренним корпоративным ЦС.

Конфигурация SSL/TLS на стороне сервера

Конфигурация на стороне сервера включает включение SSL, указание расположения SSL-сертификатов и ключей, а также настройку аутентификации клиента.

1. Генерация или получение SSL-сертификатов и ключей

Существует два основных способа получения SSL-сертификатов для вашего сервера PostgreSQL:

  • Самоподписанные сертификаты (для тестирования/разработки): Они создаются с использованием OpenSSL и по умолчанию не являются доверенными для внешних клиентов. Они полезны для первоначальной настройки и внутреннего тестирования.
  • Сертификаты от центра сертификации (ЦС) (для производства): Получите сертификаты от доверенного публичного ЦС (например, Let's Encrypt, DigiCert) или внутреннего корпоративного ЦС. Это гарантирует, что клиенты смогут проверить подлинность сервера.

Создание самоподписанных сертификатов с использованием OpenSSL:

Это распространенный подход для сред разработки и внутренних сред. Выполните следующие команды на вашем сервере PostgreSQL или на машине с OpenSSL:

  1. Создайте каталог для сертификатов: Хорошей практикой является организация хранения сертификатов.
    bash sudo mkdir -p /etc/postgresql/ssl sudo chown postgres:postgres /etc/postgresql/ssl cd /etc/postgresql/ssl

  2. Сгенерируйте закрытый ключ сервера: Этот ключ должен храниться в секрете.
    bash sudo openssl genrsa -des3 -out server.key 2048
    Вам будет предложено ввести парольную фразу. Запомните эту парольную фразу, так как она понадобится при запуске PostgreSQL.

  3. Удалите парольную фразу (необязательно, но рекомендуется для автоматических перезапусков): Для автоматического запуска без ручного ввода парольной фразы удалите ее. Будьте предельно осторожны, так как любой, кто имеет доступ к этому файлу, может выдать себя за ваш сервер.
    bash sudo openssl rsa -in server.key -out server.key

  4. Создайте запрос на подпись сертификата сервера (CSR): Он содержит информацию о вашем сервере.
    bash sudo openssl req -new -key server.key -out server.csr
    Вам будет предложено ввести информацию, такую как Название страны, Штат, Название местности, Название организации, Общее имя (Common Name) (это должно быть имя хоста или IP-адрес вашего сервера) и адрес электронной почты.

  5. Подпишите сертификат с помощью собственного ЦС (для внутреннего использования):

    • Создайте закрытый ключ и сертификат корневого ЦС (если у вас его нет):
      bash # Сгенерировать закрытый ключ ЦС sudo openssl genrsa -des3 -out root.key 2048 # Создать сертификат ЦС (действителен 3650 дней) sudo openssl req -new -x509 -days 3650 -key root.key -out root.crt
    • Подпишите CSR сервера с помощью ЦС: Это создает доверенный сертификат сервера.
      bash sudo openssl x509 -req -days 365 -in server.csr -CA root.crt -CAkey root.key -set_serial 01 -out server.crt
  6. Установите разрешения: Убедитесь, что пользователь PostgreSQL может читать эти файлы.
    bash sudo chown postgres:postgres server.key server.crt root.crt sudo chmod 600 server.key sudo chmod 644 server.crt root.crt

Использование сертификатов от публичного/корпоративного ЦС:

Если вы получаете сертификаты от ЦС, вы обычно получите:

  • server.crt: Публичный сертификат вашего сервера.
  • server.key: Закрытый ключ вашего сервера.
  • root.crt (или аналогичный): Корневой сертификат ЦС (и, возможно, промежуточные сертификаты).

Разместите эти файлы в безопасном каталоге (например, /etc/postgresql/ssl/) и убедитесь, что пользователь PostgreSQL имеет права на чтение.

2. Настройка postgresql.conf

Отредактируйте файл postgresql.conf (обычно расположенный в каталоге данных PostgreSQL), чтобы включить SSL и указать файлы сертификатов.

#------------------------------------------------------------------------------
# SSL
#------------------------------------------------------------------------------

ssl = on

# These are all in PEM format, and are ignored if server key/certificate are
# not configured.  By default, the files are expected to be in the server's
# data directory.  Alternatively, they can be specified as full paths.
ssl_cert_file = '/etc/postgresql/ssl/server.crt'     # (change filename if needed)
ssl_key_file = '/etc/postgresql/ssl/server.key'      # (change filename if needed)
ssl_ca_file = '/etc/postgresql/ssl/root.crt'         # (optional, for client cert verification)

# Optional: specify cipher list if needed
#ssl_ciphers = 'HIGH:MEDIUM:+3DES:!aNULL'

# Optional: enable client certificate verification
#ssl_ca_file must be set to a file containing the CA certificate(s) to trust
#ssl_crl_file = ''
#ssl_crl_dir = ''
  • ssl = on: Включает поддержку SSL на сервере.
  • ssl_cert_file: Путь к публичному сертификату сервера.
  • ssl_key_file: Путь к закрытому ключу сервера.
  • ssl_ca_file: Путь к сертификату ЦС (если вы хотите проверять клиентские сертификаты или если ваш серверный сертификат подписан пользовательским ЦС).

3. Настройка pg_hba.conf для принудительного использования SSL

Файл pg_hba.conf управляет аутентификацией клиентов. Вам необходимо изменить записи, чтобы принудительно использовать SSL-соединения.

По умолчанию записи в pg_hba.conf выглядят так:

# TYPE  DATABASE        USER            ADDRESS                 METHOD
local   all             all                                     peer
# IPv4 local connections:
host    all             all             127.0.0.1/32            scram-sha-256
# IPv6 local connections:
host    all             all             ::1/128                 scram-sha-256

Чтобы принудительно использовать SSL, измените записи host на hostssl:

# TYPE  DATABASE        USER            ADDRESS                 METHOD
local   all             all                                     peer
# IPv4 local connections:
hostssl all             all             127.0.0.1/32            scram-sha-256
# IPv6 local connections:
hostssl all             all             ::1/128                 scram-sha-256

# Example for external network access - requires SSL
hostssl all             all             0.0.0.0/0               scram-sha-256
hostssl all             all             ::/0                    scram-sha-256
  • hostssl: Этот тип записи требует SSL-соединений. Любая попытка подключения без SSL будет отклонена.
  • hostnossl: Этот тип записи явно запрещает SSL-соединения.
  • host: Разрешает как SSL, так и не-SSL соединения (это значение по умолчанию и менее безопасно).

4. Перезапуск сервера PostgreSQL

После изменения postgresql.conf и pg_hba.conf вы должны перезапустить службу PostgreSQL, чтобы изменения вступили в силу.

# Для систем, использующих systemd (большинство современных дистрибутивов Linux)
sudo systemctl restart postgresql

# Для систем, использующих init.d
sudo service postgresql restart

Конфигурация SSL/TLS на стороне клиента

Клиенты также должны быть настроены для безопасного подключения. Это включает в себя указание параметров подключения, потенциальное предоставление клиентских сертификатов и проверку сертификата сервера.

1. Параметры строки подключения

При подключении через psql или любую клиентскую библиотеку PostgreSQL вы можете указать параметры SSL в строке подключения или в качестве отдельных опций.

Базовое SSL-соединение (только аутентификация сервера):

psql "sslmode=require host=your_server_hostname dbname=your_db user=your_user"
  • sslmode: Контролирует поведение SSL клиента.
    • disable: Разрешать только не-SSL-соединения.
    • allow: Разрешать не-SSL, но предпочитать SSL, если сервер его поддерживает.
    • prefer (по умолчанию): Предпочитать SSL, но разрешать не-SSL, если SSL не удается.
    • require: Разрешать только SSL-соединения. Если сервер не поддерживает SSL, соединение завершится с ошибкой.
    • verify-ca: Разрешать только SSL-соединения и проверять, что сертификат сервера подписан доверенным ЦС. Параметр sslrootcert должен быть установлен.
    • verify-full: Разрешать только SSL-соединения, проверять сертификат сервера на соответствие доверенному ЦС и проверять, что имя хоста сервера совпадает с общим именем (CN) или альтернативным именем субъекта (SAN) сертификата.

Проверка сертификата сервера (verify-ca или verify-full):

Для повышения безопасности клиенты должны проверять подлинность сервера. Для этого клиент должен доверять ЦС, который подписал сертификат сервера.

  1. Получите сертификат ЦС: Получите файл root.crt (или соответствующий сертификат ЦС), который использовался для подписи сертификата сервера.
  2. Укажите sslrootcert: Сообщите клиенту, где найти этот сертификат ЦС.
psql "sslmode=verify-full host=your_server_hostname dbname=your_db user=your_user sslrootcert=/path/to/your/root.crt"

2. Клиентские сертификаты (взаимная аутентификация)

Для еще более высокого уровня безопасности вы можете реализовать взаимную аутентификацию, при которой сервер также проверяет подлинность клиента с помощью клиентских сертификатов.

Генерация клиентских сертификатов:

Подобно серверным сертификатам, вам потребуется закрытый ключ клиента и клиентский сертификат, подписанный ЦС, которому доверяет сервер (часто тот же ЦС, что и для серверного сертификата).

  1. Сгенерируйте закрытый ключ клиента:
    bash openssl genrsa -des3 -out client.key 2048

  2. Создайте CSR клиента:
    bash openssl req -new -key client.key -out client.csr
    Предоставьте детали, убедившись, что Общее имя (Common Name) уникально для клиента.

  3. Подпишите CSR клиента с помощью ЦС:
    bash sudo openssl x509 -req -days 365 -in client.csr -CA root.crt -CAkey root.key -set_serial <unique_serial> -out client.crt

  4. Установите разрешения:
    bash chmod 600 client.key chmod 644 client.crt

Настройка pg_hba.conf для аутентификации по клиентскому сертификату:

На сервере вам необходимо настроить pg_hba.conf для приема аутентификации по клиентскому сертификату. Часто для этого используется метод аутентификации cert.

# TYPE  DATABASE        USER            ADDRESS                 METHOD
# Require SSL and client certificate authentication for specific user/db
hostssl all             your_user       your_client_ip/32       cert map=your_cert_map

Вам также может потребоваться определить файл карты сертификатов (опция cert_map), если вы хотите сопоставить конкретные детали клиентского сертификата (например, Subject или SubjectAltName) с пользователями PostgreSQL. Обратитесь к документации PostgreSQL для получения подробной информации о настройке аутентификации cert и сопоставления сертификатов.

Настройка клиента для использования сертификатов:

Обновите строку подключения клиента, включив пути к его сертификату и ключу:

psql "sslmode=verify-full host=your_server_hostname dbname=your_db user=your_user \nsslrootcert=/path/to/your/root.crt sslcert=/path/to/your/client.crt sslkey=/path/to/your/client.key"

Лучшие практики и советы

  • Используйте sslmode со значением verify-full: Всегда стремитесь использовать verify-full на стороне клиента для предотвращения атак типа «человек посередине».
  • Защищайте закрытые ключи: Убедитесь, что закрытые ключи (файлы .key) имеют строгие разрешения (например, chmod 600) и доступны для чтения только пользователю PostgreSQL на сервере и подключающемуся пользователю на клиенте.
  • Регулярно обновляйте сертификаты: Сертификаты имеют сроки истечения. Внедрите процесс их обновления до истечения срока действия, чтобы избежать перебоев в соединении.
  • Централизованное управление сертификатами: Для крупных развертываний рассмотрите возможность использования системы управления сертификатами или автоматизации выдачи и обновления сертификатов.
  • Мониторинг журналов: Проверяйте журналы PostgreSQL на наличие любых ошибок, связанных с SSL, во время запуска или попыток подключения.
  • Документация: Обратитесь к официальной документации PostgreSQL для получения самых актуальных параметров и расширенных параметров конфигурации, специфичных для вашей версии PostgreSQL.

Заключение

Настройка SSL/TLS для соединений PostgreSQL является критически важным шагом в защите вашей инфраструктуры базы данных. Включив SSL на сервере, принудительно используя ssl=require или hostssl в pg_hba.conf и настроив клиенты с соответствующими параметрами sslmode (в идеале verify-full), вы значительно повышаете безопасность данных, передаваемых по вашей сети. Внедрение взаимной аутентификации с клиентскими сертификатами добавляет еще один надежный уровень безопасности. Хотя первоначальная настройка может показаться сложной, долгосрочные преимущества защиты данных и соответствия требованиям делают ее незаменимой практикой для любого развертывания PostgreSQL.