Шифрование SSL¶
Шифрование соединений Клиент/Сервер¶
ADB обладает нативной поддержкой соединения SSL между клиентом и мастер-сервером. Соединение SSL предотвращает доступ к пакетам третьей стороны и предотвращает атаки посредника. SSL должно использоваться, когда соединение проходит по незащищенной ссылке, а также когда используется аутентификация сертификата клиента.
Для включения SSL требуется установленный OpenSSL как на клиенте, так и на мастер-сервере. ADB может запускаться с включенным SSL если настроить параметры конфигурации сервера ssl=on в мастере postgresql.conf. При запуске в режиме SSL, сервер будет искать файлы server.key (частный ключ сервера) и server.crt (сертификат сервера) в папке master data. Эти файлы должны быть настроены для запуска системы ADB с включенным SSL.
Warning
Не используйте пароль для защиты частного ключа. Сервер не запрашивает пароля для частного ключа и БД не сможет запуститься, если должна затребовать его.
Для тестирования системы можно использовать самоподписанный сертификат, но в штатной работе необходим сертификат подписанный certificate authority (CA), чтобы клиент мог подтвердить сервер. CA может быть локальный и глобальный. Если все клиенты принадлежат локальной организации, рекомендуется использовать локальный CA.
Настройка аутентификации SSL¶
В процессе аутентификации SSL сравниваются Common Name (cn) сертификата, который предоставляет программа-клиент при подключении, и запрашиваемое имя пользователя Базы данных. Пользователь не должен существовать в БД. Для обеспечения соединения между системой и БД можно использовать map-файл.
Параметры аутентификации SSL¶
При аутентификации по сертификату доступны следующие опции:
- Hostssl - тип подключения должен быть hostssl.
- map - маппинг. Указывается в pg_ident.conf, или в файле, указанном в настройках сервера ident_file.
Пример pg_hba.conf:
Hostssl testdb certuser 192.168.0.0/16 cert
Hostssl testdb all 192.168.0.0/16 cert map=gpuser
Конфигурация OpenSSL¶
ADB считывает файл конфигурации OpenSSL, указанный в $GP_HOME/etc/openssl.cnf по умолчанию. Для изменения настроек OpenSSL нужно внести изменения в конфигурационный файл и перезапустить сервер.
Пример создания самоподписанного сертификата¶
Warning
Использовать самоподписанный сертификат рекомендуется только в целях тестирования системы! Для продуктивного окружения используйте проверенные удостоверяющие центры (CA) для подписания сертификатов.
Для создания самоподписанного сертификата необходимо:
- Ввести команду openssl:
openssl req -new -text -out server.req
- Ввести запрашиваемую информацию. Убедитесь, что вы указали локальный хост в качестве Common Name. Пароль можно оставить пустым.
- Программа создает ключ, защищенный паролем, который должен быть не короче четырех символов. Его необходимо отключить для автоматического запуска, для чего ввести команду:
openssl rsa -in privkey.pem -out server.key
rm privkey.pem
- Ввести старый пароль, чтобы разблокировать существующий ключ.
- Выполнить команду:
openssl req -x509 -in server.req -text -key server.key -out server.crt
Данная команда превращает сертификат в самоподписанный и копирует ключ и сертификат туда, где сервер будет их искать.
- Выполнить команду:
chmod og-rwx server.key
- Скопировать доверенный сертификат root.crt на базе server.crt:
cp server.crt root.crt
- Перенести root.crt на клиентскую машину (например через scp) для проверки работы SSL в различных режимах. Файл root.crt размещается на клиенте в домашнем каталоге пользователя (в Microsoft Windows эта директория называется %APPDATA%postgresql).
Более подробно о создании частного ключа и сертификата, см. документацию OpenSSL.
Конфигурация postgresql.conf для аутентификации SSL¶
Следующие настройки сервера должны быть указаны в конфигурационном файле postgresql.conf:
- ssl [boolean] - включить соединение SSL.
- ssl_renegotiation_limit [integer] - предел передачи данных до нового запроса ключа.
- ssl_ciphers [string] - список разрешенных шифрований SSL.
В папке $MASTER_DATA_DIRECTORY присутствуют следующие серверные файлы:
- server.crt - сертификат сервера.
- server.key - ключ сервера.
- root.crt - доверенные авторизации сертификата.
- root.crl - сертификаты, отозванные доверенными авторизациями.
Файлы server.crt и server.key сохраняются на сервере.
Файлы root.crt и root.crl сохраняются на клиенте в домашнем каталоге пользователя (в Microsoft Windows эта директория называется %APPDATA%postgresql). Это делается, чтобы клиент мог убедиться в том, что конечный сертификат сервера подписан центром сертификации, которому он доверяет. Если на клиенте существует файл root.crl, при проверке также учитывается содержащийся в нём список отозванных сертификатов Certificate Revocation List (CRL).
Более подробно о настройках сертификатов SSL на сервере см. документацию Postgres.
Конфигурация соединения SSL клиента¶
Доступны следующие опции SSL:
- sslmode - устанавливает уровень защиты (режимы подключения по SSL). Доступны следующие значения:
sslmode |
Защита от прослушивания | Защита от MITM | Политика применения |
---|---|---|---|
disable |
Нет | Нет | Мне не важна безопасность и я не приемлю издержки, связанные с шифрованием. |
allow |
Возможно | Нет | Мне не важна безопасность, но я приемлю издержки, связанные с шифрованием, если на этом настаивает сервер. |
prefer |
Возможно | Нет | Мне не важна безопасность, но я предпочитаю шифрование (и приемлю связанные издержки), если это поддерживает сервер. |
require |
Да | Нет | Я хочу, чтобы мои данные шифровались, и я приемлю сопутствующие издержки. Я доверяю сети в том, что она обеспечивает подключение к нужному серверу. |
verify-ca |
Да | Зависит от политики ЦС | Я хочу, чтобы мои данные шифровались, и я приемлю сопутствующие издержки. Мне нужна уверенность в том, что я подключаюсь к доверенному серверу. |
verify-full |
Да | Да | Я хочу, чтобы мои данные шифровались, и я приемлю сопутствующие издержки. Мне нужна уверенность в том, что я подключаюсь к доверенному серверу и это именно указанный мной сервер. |
- sslcert - имя файла клиентского сертификата SSL. Расположение по умолчанию: ~/.postgresql/postgresql.crt.
- sslkey - тайный ключ, используемый клиентским сертификатом. Расположение по умолчанию: ~/.postgresql/postgresql.key.
- sslrootcert - имя файла, содержащего сертификат(ы) SSL Certificate Authority. Расположение по умолчанию: ~/.postgresql/root.crt.
- sslcrl - имя списка отозванных сертификатов SSL. Расположение по умолчанию: ~/.postgresql/root.crl.
Для настройки клиентских параметров можно использовать следующие переменные:
- sslmode – PGSSLMODE
- sslkey – PGSSLKEY
- sslrootcert – PGSSLROOTCERT
- sslcert – PGSSLCERT
- sslcrl – PGSSLCRL
Более подробно о настройках сертификатов SSL на сервере см. документацию Postgres.
Примеры подключения с клиента на сервер ADB в различных режимах SSL¶
В режиме require наличие root.crt сертификата на клиенте не требуется:
psql "sslmode=require host=test-ssl dbname=gpadmin user=gpadmin"
psql (9.4.24)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.
gpadmin=#
В режиме verify-ca отсутствие root.crt сертификата на клиенте приведет к отказу подключения:
psql "sslmode=verify-ca host=test-ssl dbname=gpadmin user=gpadmin"
psql: root certificate file "/home/gpadmin/.postgresql/root.crt" does not exist
Either provide the file or change sslmode to disable server certificate verification.
После добавления root.crt подключение станет возможным:
psql "sslmode=verify-ca host=test-ssl dbname=gpadmin user=gpadmin"
psql (9.4.24)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.
gpadmin=#
В режиме verify-full требуется наличие root.crt сертификата на клиенте и совпадение hostname и server CN, иначе в подключении будет отказано:
psql "sslmode=verify-full host=test-ssl dbname=gpadmin user=gpadmin"
psql: server common name "ssl-server" does not match host name "test-ssl"
Если пересоздать сертификаты, указав при создании сертификата Server CN, который будем использовать при подключении, станет возможным соединение по SSL:
psql "sslmode=verify-full host=test-ssl dbname=gpadmin user=gpadmin"
psql (9.4.24)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.
gpadmin=#
Проверка SSL соединения с помощью расширения sslinfo¶
Проверить, использует ли текущее соединение SSL можно с помощью функций расширения sslinfo
, например:
gpadmin=# create extension sslinfo;
CREATE EXTENSION
gpadmin=# select ssl_is_used();
ssl_is_used
-------------
t
(1 row)
Более подробную информацию по расширению sslinfo
см. документацию Postgres.