Шифрование SSL
Канал обмена данными между сервером ADQM и клиентом, а также между серверами кластера можно защитить шифрованием SSL. Эта статья описывает как настроить ADQM, чтобы обеспечить проверку SSL-сертификатов для входящих соединений и использовать безопасные протоколы для межсерверного взаимодействия. Для примера используется кластер ADQM, включающий следующие хосты:
-
10.92.17.146, adqm-host-1.arenadata.local;
-
10.92.17.106, adqm-host-2.arenadata.local;
-
10.92.17.140, adqm-host-3.arenadata.local;
-
10.92.16.245, adqm-host-4.arenadata.local.
ПРИМЕЧАНИЕ
Для демонстрационных целей в этой статье серверные SSL-сертификаты подписываются самоподписанным (self-signed) корневым сертификатом центра сертификации (Certification Authority, CA). В реальных системах используйте доверенный центр сертификации для подписи сертификатов. |
Создание SSL-сертификатов
Для выполнения приведенных команд необходимо установить openssl
(минимальная версия 1.1.1) — инструмент командной строки для использования функций криптографической библиотеки OpenSSL.
-
Сгенерируйте закрытый ключ:
$ openssl genrsa -out arenadata_ca.key 2048
Этот ключ будет использоваться для создания корневого сертификата центра сертификации, а также для подписи других сертификатов (серверных сертификатов и сертификатов для аутентификации пользователей), поэтому храните его в безопасном месте.
-
Создайте самоподписанный корневой сертификат CA:
$ openssl req \ -x509 \ -subj "/CN=arenadata.local CA" \ -nodes \ -key arenadata_ca.key \ -days 1095 \ -out arenadata_ca.crt
-
Для каждого сервера кластера сгенерируйте ключ и создайте запрос на подпись сертификата (Certificate Signing Request, CSR):
$ openssl req -newkey rsa:2048 -nodes -subj "/CN=adqm-host-1.arenadata.local" -addext "subjectAltName = DNS:adqm-host-1.arenadata.local,IP:10.92.17.146" -keyout adqm-host-1.key -out adqm-host-1.csr $ openssl req -newkey rsa:2048 -nodes -subj "/CN=adqm-host-2.arenadata.local" -addext "subjectAltName = DNS:adqm-host-2.arenadata.local,IP:10.92.17.106" -keyout adqm-host-2.key -out adqm-host-2.csr $ openssl req -newkey rsa:2048 -nodes -subj "/CN=adqm-host-3.arenadata.local" -addext "subjectAltName = DNS:adqm-host-3.arenadata.local,IP:10.92.17.140" -keyout adqm-host-3.key -out adqm-host-3.csr $ openssl req -newkey rsa:2048 -nodes -subj "/CN=adqm-host-4.arenadata.local" -addext "subjectAltName = DNS:adqm-host-4.arenadata.local,IP:10.92.16.245" -keyout adqm-host-4.key -out adqm-host-4.csr
В качестве идентификатора сертификата CN (Common Name) нужно указать полное доменное имя сервера (Fully Qualified Domain Name, FQDN), для которого создается сертификат. Иначе сертификат нельзя будет проверить.
-
Для каждого сервера кластера создайте и подпишите сертификат, используя закрытый ключ и корневой сертификат CA:
$ openssl x509 -req -in adqm-host-1.csr -out adqm-host-1.crt -CAcreateserial -CA arenadata_ca.crt -CAkey arenadata_ca.key -days 365 $ openssl x509 -req -in adqm-host-2.csr -out adqm-host-2.crt -CAcreateserial -CA arenadata_ca.crt -CAkey arenadata_ca.key -days 365 $ openssl x509 -req -in adqm-host-3.csr -out adqm-host-3.crt -CAcreateserial -CA arenadata_ca.crt -CAkey arenadata_ca.key -days 365 $ openssl x509 -req -in adqm-host-4.csr -out adqm-host-4.crt -CAcreateserial -CA arenadata_ca.crt -CAkey arenadata_ca.key -days 365
-
На каждый хост кластера ADQM скопируйте корневой сертификат, а также сертификат и ключ соответствующего сервера. Эти файлы должны храниться по одинаковому пути и называться одинаково на каждом хосте кластера — пути и названия файлов корневого сертификата, сертификата и ключа сервера указываются в настройках кластера (см. секцию Параметры SSL в сервисных конфигурациях).
Например, на хост adqm-host-1.arenadata.local скопируйте:-
arenadata_ca.crt в /etc/clickhouse-server/ca.crt;
-
adqm-host-1.crt в /etc/clickhouse-server/server.crt;
-
adqm-host-1.key в /etc/clickhouse-server/server.key.
-
Конфигурирование ADQM для включения SSL
Включить SSL-шифрование соединений в ADQM можно через интерфейс ADCM, который предоставляет для этого следующие функциональные возможности:
-
Действие Manage SSL на уровне кластера — можно включить SSL сразу для нескольких сервисов ADQM, а также отключить порты для незащищенных соединений.
-
Параметры SSL в конфигурациях сервисов ADQM — можно настроить SSL для каждого сервиса отдельно (например, изменить пути к файлам сертификатов и ключей по умолчанию, включить проверку клиентских сертификатов, указать корневой сертификат центра сертификации и др.).
Действие Manage SSL
-
На странице Clusters в строке кластера ADQM нажмите иконку
, чтобы открыть список действий для работы с кластером, и выберите Manage SSL.
Запуск действия "Manage SSL"Откроется диалоговое окно, где при активированном переключателе Enable SSL становятся доступны параметры, с помощью которых можно указать какие сервисы ADQM должны использовать безопасные соединения.
Параметры для включения SSL в окне конфигурации действия "Manage SSL" -
Заполните необходимые параметры в окне конфигурации действия Manage SSL:
-
Параметры в секции Enable SSL — чтобы включить/отключить SSL-шифрование входящих и внутренних соединений для различных сервисов ADQM.
Параметры включения SSL для сервисовПри выполнении действия Manage SSL указанные в его конфигурации значения параметров перезаписывают значения соответствующих параметров в конфигурациях сервисов — см. столбец Параметр сервиса ADQM в приведенной ниже таблице.
Параметр Manage SSL Описание параметра Параметр сервиса ADQM [ADQMDB] → Enable HTTP
Позволяет отключить порт для соединения с ADQM по протоколу HTTP, чтобы использовался только HTTPS
Сервис ADQMDB: параметр Network → Enable http
[ADQMDB] → Enable TCP
Позволяет отключить TCP-порт для незащищенного соединения, чтобы использовался только TCP-порт для SSL-защищенного соединения (SSL Configuration → TCP secure port)
Сервис ADQMDB: параметр Network → Enable tcp
[ADQMDB] → Secure gRPC
Включает SSL для защищенного взаимодействия с клиентами через gRPC
Сервис ADQMDB: параметр Enable gRPC → Enable SSL
[ADQMDB] → Secure intra-cluster communication
Если параметр активирован, только безопасные протоколы (HTTPS, защищенный TCP) будут использоваться для обмена данными между серверами ClickHouse
Сервис ADQMDB: параметр Intra-cluster communication security → Enable secure intra-cluster communication
[Zookeeper] → Secure Incoming Connections
Включает использование безопасных входящих соединений в ZooKeeper
Сервис Zookeeper: параметр SSL configuration → Enable SSL
[Zookeeper] → Secure SSL Quorum
Активирует зашифрованную кворумную коммуникацию в ZooKeeper
Сервис Zookeeper: параметр SSL configuration → sslQuorum
[Chproxy] → Secure Incoming Connections
Включает использование безопасных входящих соединений в Chproxy
Сервис Chproxy: параметр Network configuration → Enable HTTPS
[Chproxy] → Use HTTP to connect to Clickhouse if possible
Указывает, какой протокол (HTTP или HTTPS) Chproxy будет использовать для подключения к ClickHouse
Сервис Chproxy: параметр Network configuration → Use HTTP to connect to ADQMDB
-
Параметр Run service checks — чтобы указать, нужно ли запустить проверку работоспособности и доступности кластера после применения настроек.
-
-
Нажмите Next, а затем — Run в окне подтверждения запуска действия.
Во время выполнения действия Manage SSL ADCM последовательно останавливает все сервисы, перенастраивает их для включения или выключения SSL-шифрования, затем запускает сервисы и производит их проверку.
Результат действия и процесс его выполнения можно посмотреть на странице Jobs, где отображаются детали выполнения всех внутренних этапов действий, включая подробный stdout/stderr вывод Ansible.
Параметры SSL в сервисных конфигурациях
Альтернативный способ настроить защищенные соединения в ADQM — сконфигурировать параметры SSL для каждого сервиса отдельно.
-
Перейдите на вкладку Services кластера ADQM и выберите сервис, для которого нужно включить SSL-шифрование — ADQMDB, Zookeeper или Chproxy.
-
На вкладке Primary configuration настройте параметры SSL — название секции, где находятся эти параметры, зависит от сервиса.
ADQMDB: SSL Configuration
В разделе SSL Configuration конфигурации сервиса ADQMDB доступны параметры:-
Enable SSL — включает прослушивание портов для SSL-защищенных соединений по протоколам HTTPS и TCP.
-
HTTPS port — порт для безопасного соединения по HTTPS (по умолчанию
8443
). -
TCP secure port — TCP-порт для безопасного взаимодействия с клиентами и межсерверной коммуникации по бинарному протоколу (по умолчанию
9440
). -
Disable protocols — протоколы, которые не разрешено использовать (например,
sslv2
,sslv3
). -
Server certificate file — путь к файлу серверного SSL-сертификата в формате PEM.
-
Server private key file — путь к файлу закрытого ключа серверного SSL-сертификата.
-
Certificate authority file — путь к файлу корневого сертификата центра сертификации (Certification Authority, CA) для проверки клиентских сертификатов. Указывается, если необходимо включить TLS-аутентификацию.
-
Client certificate verification mode — режим проверки пользовательских SSL-сертификатов, подписанных корневым сертификатом (должен быть указан в Certificate authority file).
-
Client certificate file, Client private key file, Client certificate authority file — параметры для настройки защищенного соединения между ClickHouse и ZooKeeper.
Конфигурационные параметры сервиса ADQMDB для проверки SSL-сертификатов соединенийADQMDB: Enable gRPCЕсли для сервиса ADQMDB включены опции Enable SSL (в разделе SSL Configuration) и Enable gRPC, в разделе Enable gRPC можно также настроить следующие параметры SSL для gRPC-подключений:
-
Enable SSL — включает SSL для защищенного взаимодействия с клиентами через gRPC.
-
SSL certificate file — путь к файлу SSL-сертификата в формате PEM для gRPC-подключений.
-
SSL private key file — путь к файлу закрытого ключа SSL-сертификата для gRPC-подключений.
-
Client auth required — указывает, будет ли сервер запрашивать сертификат клиента.
-
Certificate authority file — путь к файлу корневого сертификата центра сертификации (Certification Authority, CA) в формате PEM, который будет использоваться для проверки клиентских сертификатов. Указывается при включенной опции Client auth required.
Конфигурационные параметры сервиса ADQMDB для SSL-подключений через gRPCADQMDB: Network
В разделе Network конфигурации сервиса ADQMDB доступны параметры для отключения незащищенных портов:-
Enable http — позволяет отключить порт для соединений по протоколу HTTP (в пользу соединений через HTTPS-порт, который настраивается параметром SSL Configuration → HTTPS port).
-
Enable tcp — позволяет отключить порт для незащищенных соединений по протоколу ClickHouse TCP (в пользу безопасных соединений по TCP через порт SSL Configuration → TCP secure port).
ADQMDB: Secure intra-cluster communicationВ разделе Secure intra-cluster communication конфигурации сервиса ADQMDB доступен параметр Enable secure intra-cluster communication, который позволяет включить использование только безопасных протоколов (HTTPS, защищенный TCP) для обмена данными между серверами ClickHouse. Чтобы активировать параметр, необходимо также включить SSL Configuration → Enable SSL.
Zookeeper: SSL configurationРаздел SSL configuration конфигурации сервиса Zookeeper (доступен, если включена опция Show advanced) содержит параметры для настройки SSL-соединений между ClickHouse и ZooKeeper:
-
Enable SSL — включает использование безопасных входящих соединений в ZooKeeper;
-
sslQuorum — включает шифрование внутренних соединений в кворуме;
-
serverCnxnFactory — имя класса, реализующего
ServerCnxnFactory
(чтобы использовать серверную коммуникацию на основе TLS, установите значение параметраNettyServerCnxnFactory
); -
ssl.quorum.keyStore.location — путь к файлу хранилища ключей сервера;
-
ssl.quorum.keyStore.password — пароль, используемый при создании хранилища ключей, указанного в ssl.quorum.keyStore.location;
-
ssl.quorum.trustStore.location — путь к файлу хранилища доверенных сертификатов сервера;
-
ssl.quorum.trustStore.password — пароль, используемый при создании хранилища доверенных сертификатов, указанного в ssl.quorum.trustStore.location;
-
ssl.keyStore.location — путь к файлу хранилища ключей сервера, который будет использоваться для клиентских TLS-подключений;
-
ssl.keyStore.password — пароль, используемый при создании хранилища ключей, указанного в ssl.keyStore.location;
-
ssl.trustStore.location — путь к файлу серверного хранилища доверенных сертификатов, который будет использоваться для клиентских TLS-подключений;
-
ssl.trustStore.password — пароль, используемый при создании хранилища доверенных сертификатов, указанного в ssl.trustStore.location;
-
ssl.protocol — протокол TLS для общения с клиентом;
-
ssl.quorum.protocol — протокол TLS для общения в кворуме;
-
secureClientPort — порт для безопасных клиентских соединений.
Конфигурационные параметры сервиса Zookeeper для соединений по SSLChproxy: Network configurationВ разделе Network configuration конфигурации сервиса Chproxy доступны следующие параметры для настройки безопасных соединений:
-
Enable HTTPS — включает прослушивание запросов по HTTPS;
-
HTTPS listen port — порт, на котором прослушиваются HTTPS-запросы;
-
HTTPS allowed networks — список сетей, из которых разрешен доступ по HTTPS;
-
Certificate file — путь к файлу серверного SSL-сертификата;
-
Private key file — путь к файлу закрытого ключа серверного SSL-сертификата;
-
Use HTTP to connect to ADQMDB — указывает, какой протокол (HTTP или HTTPS) Chproxy будет использовать для подключения к ClickHouse.
Конфигурационные параметры сервиса Chproxy для соединений по SSL -
-
После указания всех необходимых параметров для конфигурации SSL-соединений нажмите Save и выполните Reconfig and restart для сервиса, чтобы применить изменения.
Пример
-
В параметре Certificate authority file конфигурации сервиса ADQMDB укажите путь к файлу самоподписанного корневого сертификата — /etc/clickhouse-server/ca.crt.
Параметры SSL для сервиса ADQMDBНажмите Save.
-
Запустите кластерное действие Manage SSL. В окне с настройками активируйте Enable SSL, а также включите опцию Secure intra-cluster communication для шифрования внутреннего трафика между серверами ClickHouse.
Включение SSL в ADQM через кластерное действие "Manage SSL"Нажмите Next и далее — Run, чтобы начать выполнение действия.
Проверка соединения
Подключение через clickhouse-client
Чтобы убедиться, что соединение с ADQM защищено шифрованием SSL, можно подключиться к одному из серверов ADQM через clickhouse-client с флагом --secure
, указав TCP-порт для безопасного соединения по SSL (9440
). Например:
$ clickhouse-client --host adqm-host-1.arenadata.local --secure --port 9440 --user default
Вывод на экран после выполнения этой команды подтверждает подключение через защищенный порт 9440
:
ClickHouse client version 24.8.8.17. Connecting to adqm-host-1.arenadata.local:9440 as user default. Connected to ClickHouse server version 24.8.8.
Обратите внимание, опция Client certificate verification mode в секции SSL Configuration конфигурации сервиса ADQMDB должна быть выключена (значение none
), так как в этом примере для подключения к ADQM не используется аутентификация пользователя по SSL-сертификату.
Проверка межсерверных подключений
Выполните распределенный запрос, например, который создает нового пользователя ADQM на каждом хосте:
CREATE USER test_user ON CLUSTER default_cluster IDENTIFIED WITH sha256_password BY 'qwerty';
В выводе результата выполнения запроса видно, что взаимодействие между хостами ADQM также осуществляется через порт 9440
:
┌─host────────────────────────┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐ 1. │ adqm-host-4.arenadata.local │ 9440 │ 0 │ │ 3 │ 0 │ 2. │ adqm-host-1.arenadata.local │ 9440 │ 0 │ │ 2 │ 0 │ 3. │ adqm-host-2.arenadata.local │ 9440 │ 0 │ │ 1 │ 0 │ 4. │ adqm-host-3.arenadata.local │ 9440 │ 0 │ │ 0 │ 0 │ └─────────────────────────────┴──────┴────────┴───────┴─────────────────────┴──────────────────┘
Подключение по HTTPS
Для тестирования соединения с ADQM по протоколу HTTPS можно выполнить следующую команду на хосте кластера:
$ echo 'SHOW TABLES' | curl 'https://adqm-host-1.arenadata.local:8443/?query=' --data-binary @- --cacert arenadata_ca.crt
Если соединение успешно установлено, в результате выполнения запроса вернется список таблиц базы данных default
на хосте adqm-host-1.arenadata.local.