Шифрование 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.

  1. Сгенерируйте закрытый ключ:

    $ openssl genrsa -out arenadata_ca.key 2048

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

  2. Создайте самоподписанный корневой сертификат CA:

    $ openssl req \
      -x509 \
      -subj "/CN=arenadata.local CA" \
      -nodes \
      -key arenadata_ca.key \
      -days 1095 \
      -out arenadata_ca.crt
  3. Для каждого сервера кластера сгенерируйте ключ и создайте запрос на подпись сертификата (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), для которого создается сертификат. Иначе сертификат нельзя будет проверить.

  4. Для каждого сервера кластера создайте и подпишите сертификат, используя закрытый ключ и корневой сертификат 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
  5. На каждый хост кластера 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.

    Файлы /etc/clickhouse-server/server.crt и /etc/clickhouse-server/server.key по умолчанию указаны в параметрах Server certificate file и Server private key file сервиса ADQMDB соответственно. Если на хостах ADQM файлы сертификата и ключа имеют другие названия и/или расположены в другой директории, соответствующие пути нужно указать в этих параметрах.

    Самоподписанный корневой сертификат необходимо указать одним из следующих способов:

    • Передать путь и название файла корневого сертификата в параметр Certificate authority file конфигурации сервиса ADQMDB (см. пример ниже), который по умолчанию имеет пустое значение.

    • Добавить корневой сертификат в доверенные сертификаты. Например, на CentOS это выполняется следующими командами:

      $ sudo cp ./arenadata_ca.crt /etc/pki/ca-trust/source/anchors/
      $ sudo update-ca-trust

Конфигурирование ADQM для включения SSL

Включить SSL-шифрование соединений в ADQM можно через интерфейс ADCM, который предоставляет для этого следующие функциональные возможности:

  • Действие Manage SSL на уровне кластера — можно включить SSL сразу для нескольких сервисов ADQM, а также отключить порты для незащищенных соединений.

  • Параметры SSL в конфигурациях сервисов ADQM — можно настроить SSL для каждого сервиса отдельно (например, изменить пути к файлам сертификатов и ключей по умолчанию, включить проверку клиентских сертификатов, указать корневой сертификат центра сертификации и др.).

Действие Manage SSL

  1. На странице Clusters в строке кластера ADQM нажмите иконку actions default dark actions default light, чтобы открыть список действий для работы с кластером, и выберите Manage SSL.

    Запуск действия Manage SSL
    Запуск действия "Manage SSL"

    Откроется диалоговое окно, где при активированном переключателе Enable SSL становятся доступны параметры, с помощью которых можно указать какие сервисы ADQM должны использовать безопасные соединения.

    Параметры для включения SSL в окне конфигурации действия Manage SSL
    Параметры для включения SSL в окне конфигурации действия "Manage SSL"
  2. Заполните необходимые параметры в окне конфигурации действия 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 — чтобы указать, нужно ли запустить проверку работоспособности и доступности кластера после применения настроек.

  3. Нажмите Next, а затем — Run в окне подтверждения запуска действия.

Во время выполнения действия Manage SSL ADCM последовательно останавливает все сервисы, перенастраивает их для включения или выключения SSL-шифрования, затем запускает сервисы и производит их проверку.

Результат действия и процесс его выполнения можно посмотреть на странице Jobs, где отображаются детали выполнения всех внутренних этапов действий, включая подробный stdout/stderr вывод Ansible.

Параметры SSL в сервисных конфигурациях

Альтернативный способ настроить защищенные соединения в ADQM — сконфигурировать параметры SSL для каждого сервиса отдельно.

  1. Перейдите на вкладку Services кластера ADQM и выберите сервис, для которого нужно включить SSL-шифрование — ADQMDB, Zookeeper или Chproxy.

  2. На вкладке 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 для проверки 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-подключений через gRPC
    Конфигурационные параметры сервиса ADQMDB для SSL-подключений через gRPC
    ADQMDB: 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 для соединений по SSL
    Конфигурационные параметры сервиса Zookeeper для соединений по SSL
    Chproxy: 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
    Конфигурационные параметры сервиса Chproxy для соединений по SSL
  3. После указания всех необходимых параметров для конфигурации SSL-соединений нажмите Save и выполните Reconfig and restart для сервиса, чтобы применить изменения.

Пример

  1. В параметре Certificate authority file конфигурации сервиса ADQMDB укажите путь к файлу самоподписанного корневого сертификата — /etc/clickhouse-server/ca.crt.

    Параметры SSL для сервиса ADQMDB
    Параметры SSL для сервиса ADQMDB

    Нажмите Save.

  2. Запустите кластерное действие Manage SSL. В окне с настройками активируйте Enable SSL, а также включите опцию Secure intra-cluster communication для шифрования внутреннего трафика между серверами ClickHouse.

    Включение SSL в ADQM через кластерное действие Manage SSL
    Включение 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.

Отключение SSL

Для отключения SSL запустите действие Manage SSL с деактивированной группой Enable SSL или выключите опцию Enable SSL в конфигурации нужного сервиса.

Отключение SSL действием Manage SSL
Отключение SSL действием "Manage SSL"
Нашли ошибку? Выделите текст и нажмите Ctrl+Enter чтобы сообщить о ней