В этом руководстве приведены простые минимальные настройки для конфигурации ClickHouse с использованием сертификатов OpenSSL для проверки соединений. В этом примере создаются самоподписанные сертификат и ключ центра сертификации (CA), а также сертификаты узлов, чтобы установить соединения с нужными параметрами.
Создайте развертывание ClickHouse
Это руководство написано для Ubuntu 20.04; ClickHouse на указанных ниже хостах устанавливается из DEB-пакета (через apt). Домен: marsnet.local:
| Узел | IP-адрес |
|---|---|
chnode1 |
192.168.1.221 |
chnode2 |
192.168.1.222 |
chnode3 |
192.168.1.223 |
Создание TLS-сертификатов
-
Сгенерируйте ключ, который будет использоваться для нового CA:
openssl genrsa -out marsnet_ca.key 2048 -
Сгенерируйте новый самоподписанный CA‑сертификат. Следующая команда создаст новый сертификат, который будет использоваться для подписи других сертификатов с помощью ключа CA:
openssl req -x509 -subj "/CN=marsnet.local CA" -nodes -key marsnet_ca.key -days 1095 -out marsnet_ca.crt
-
Проверьте содержимое нового CA‑сертификата:
openssl x509 -in marsnet_ca.crt -text -
Создайте запрос на сертификат (CSR) и сгенерируйте ключ для каждого узла:
openssl req -newkey rsa:2048 -nodes -subj "/CN=chnode1" -addext "subjectAltName = DNS:chnode1.marsnet.local,IP:192.168.1.221" -keyout chnode1.key -out chnode1.csr openssl req -newkey rsa:2048 -nodes -subj "/CN=chnode2" -addext "subjectAltName = DNS:chnode2.marsnet.local,IP:192.168.1.222" -keyout chnode2.key -out chnode2.csr openssl req -newkey rsa:2048 -nodes -subj "/CN=chnode3" -addext "subjectAltName = DNS:chnode3.marsnet.local,IP:192.168.1.223" -keyout chnode3.key -out chnode3.csr -
Используя CSR и CA, создайте новые пары сертификатов и ключей:
openssl x509 -req -in chnode1.csr -out chnode1.crt -CA marsnet_ca.crt -CAkey marsnet_ca.key -days 365 -copy_extensions copy openssl x509 -req -in chnode2.csr -out chnode2.crt -CA marsnet_ca.crt -CAkey marsnet_ca.key -days 365 -copy_extensions copy openssl x509 -req -in chnode3.csr -out chnode3.crt -CA marsnet_ca.crt -CAkey marsnet_ca.key -days 365 -copy_extensions copy -
Проверьте сертификаты на наличие полей subject и issuer:
openssl x509 -in chnode1.crt -text -noout -
Убедитесь, что новые сертификаты проходят проверку по CA‑сертификату:
openssl verify -CAfile marsnet_ca.crt chnode1.crt chnode1.crt: OK
Создайте и настройте каталог для хранения сертификатов и ключей.
-
Создайте папку в каталоге, доступном для ClickHouse, на каждом узле. Мы рекомендуем использовать каталог конфигурации по умолчанию (например,
/etc/clickhouse-server):mkdir /etc/clickhouse-server/certs -
Скопируйте CA‑сертификат, сертификат узла и соответствующий ему ключ в новый каталог
certsна каждом узле. -
Измените владельца и права доступа, чтобы ClickHouse мог читать сертификаты:
chown clickhouse:clickhouse -R /etc/clickhouse-server/certs chmod 600 /etc/clickhouse-server/certs/* chmod 755 /etc/clickhouse-server/certs ll /etc/clickhouse-server/certstotal 20 drw-r--r-- 2 clickhouse clickhouse 4096 Apr 12 20:23 ./ drwx------ 5 clickhouse clickhouse 4096 Apr 12 20:23 ../ -rw------- 1 clickhouse clickhouse 997 Apr 12 20:22 chnode1.crt -rw------- 1 clickhouse clickhouse 1708 Apr 12 20:22 chnode1.key -rw------- 1 clickhouse clickhouse 1131 Apr 12 20:23 marsnet_ca.crt
Настройка среды с базовыми кластерами на основе ClickHouse Keeper
Для данной среды развёртывания на каждом узле используются следующие настройки ClickHouse Keeper. У каждого сервера будет собственный <server_id>. (Например, <server_id>1</server_id> для узла chnode1 и т. д.)
- Добавьте следующий код внутрь тега
<clickhouse>в файлеconfig.xmlсервера ClickHouse
<keeper_server>
<tcp_port_secure>9281</tcp_port_secure>
<server_id>1</server_id>
<log_storage_path>/var/lib/clickhouse/coordination/log</log_storage_path>
<snapshot_storage_path>/var/lib/clickhouse/coordination/snapshots</snapshot_storage_path>
<coordination_settings>
<operation_timeout_ms>10000</operation_timeout_ms>
<session_timeout_ms>30000</session_timeout_ms>
<raft_logs_level>trace</raft_logs_level>
</coordination_settings>
<raft_configuration>
<secure>true</secure>
<server>
<id>1</id>
<hostname>chnode1.marsnet.local</hostname>
<port>9444</port>
</server>
<server>
<id>2</id>
<hostname>chnode2.marsnet.local</hostname>
<port>9444</port>
</server>
<server>
<id>3</id>
<hostname>chnode3.marsnet.local</hostname>
<port>9444</port>
</server>
</raft_configuration>
</keeper_server>-
Раскомментируйте и обновите параметры Keeper на всех узлах, установив флаг
<secure>равным 1:<zookeeper> <node> <host>chnode1.marsnet.local</host> <port>9281</port> <secure>1</secure> </node> <node> <host>chnode2.marsnet.local</host> <port>9281</port> <secure>1</secure> </node> <node> <host>chnode3.marsnet.local</host> <port>9281</port> <secure>1</secure> </node> </zookeeper> -
Обновите и добавьте следующие настройки кластера на
chnode1иchnode2.chnode3будет использоваться для кворума ClickHouse Keeper.
Следующая конфигурация создаёт кластер с одним сегментом и двумя репликами на двух серверах (по одному на каждом узле).
<remote_servers>
<cluster_1S_2R>
<shard>
<replica>
<host>chnode1.marsnet.local</host>
<port>9440</port>
<user>default</user>
<password>ClickHouse123!</password>
<secure>1</secure>
</replica>
<replica>
<host>chnode2.marsnet.local</host>
<port>9440</port>
<user>default</user>
<password>ClickHouse123!</password>
<secure>1</secure>
</replica>
</shard>
</cluster_1S_2R>
</remote_servers>-
Задайте значения макросов, чтобы создать таблицу ReplicatedMergeTree для тестирования. На
chnode1:<macros> <shard>1</shard> <replica>replica_1</replica> </macros>На
chnode2:<macros> <shard>1</shard> <replica>replica_2</replica> </macros>
Настройте TLS-интерфейсы на узлах ClickHouse
Приведенные ниже параметры настраиваются в config.xml сервера ClickHouse
-
Задайте отображаемое имя для развертывания (необязательно):
<display_name>clickhouse</display_name> -
Настройте ClickHouse на прослушивание внешних портов:
<listen_host>0.0.0.0</listen_host> -
Настройте порт
httpsи отключите портhttpна каждом узле:<https_port>8443</https_port> {/*<http_port>8123</http_port>*/} -
Настройте защищенный TCP-порт ClickHouse Native и отключите стандартный незащищенный порт на каждом узле:
<tcp_port_secure>9440</tcp_port_secure> {/*<tcp_port>9000</tcp_port>*/} -
Настройте порт
interserver httpsи отключите стандартный незащищенный порт на каждом узле:<interserver_https_port>9010</interserver_https_port> {/*<interserver_http_port>9009</interserver_http_port>*/} -
Настройте OpenSSL, указав сертификаты и пути
<openSSL>
<server>
<certificateFile>/etc/clickhouse-server/certs/chnode1.crt</certificateFile>
<privateKeyFile>/etc/clickhouse-server/certs/chnode1.key</privateKeyFile>
<verificationMode>relaxed</verificationMode>
<caConfig>/etc/clickhouse-server/certs/marsnet_ca.crt</caConfig>
<cacheSessions>true</cacheSessions>
<disableProtocols>sslv2,sslv3</disableProtocols>
<preferServerCiphers>true</preferServerCiphers>
</server>
<client>
<loadDefaultCAFile>false</loadDefaultCAFile>
<caConfig>/etc/clickhouse-server/certs/marsnet_ca.crt</caConfig>
<cacheSessions>true</cacheSessions>
<disableProtocols>sslv2,sslv3</disableProtocols>
<preferServerCiphers>true</preferServerCiphers>
<verificationMode>relaxed</verificationMode>
<invalidCertificateHandler>
<name>RejectCertificateHandler</name>
</invalidCertificateHandler>
</client>
</openSSL>Дополнительные сведения см. на этой странице
-
Настройте TLS для gRPC на каждом узле:
<grpc> <enable_ssl>1</enable_ssl> <ssl_cert_file>/etc/clickhouse-server/certs/chnode1.crt</ssl_cert_file> <ssl_key_file>/etc/clickhouse-server/certs/chnode1.key</ssl_key_file> <ssl_require_client_auth>true</ssl_require_client_auth> <ssl_ca_cert_file>/etc/clickhouse-server/certs/marsnet_ca.crt</ssl_ca_cert_file> <transport_compression_type>none</transport_compression_type> <transport_compression_level>0</transport_compression_level> <max_send_message_size>-1</max_send_message_size> <max_receive_message_size>-1</max_receive_message_size> <verbose_logs>false</verbose_logs> </grpc>Дополнительные сведения см. по адресу https://clickhouse.com/docs/interfaces/grpc/
-
Настройте клиент ClickHouse как минимум на одном из узлов для использования TLS-соединений в его собственном файле
config.xml(по умолчанию — в/etc/clickhouse-client/):<openSSL> <client> <loadDefaultCAFile>false</loadDefaultCAFile> <caConfig>/etc/clickhouse-server/certs/marsnet_ca.crt</caConfig> <cacheSessions>true</cacheSessions> <disableProtocols>sslv2,sslv3</disableProtocols> <preferServerCiphers>true</preferServerCiphers> <invalidCertificateHandler> <name>RejectCertificateHandler</name> </invalidCertificateHandler> </client> </openSSL> -
Отключите порты эмуляции MySQL и PostgreSQL, используемые по умолчанию:
{/*mysql_port>9004</mysql_port*/} {/*postgresql_port>9005</postgresql_port*/}
Тестирование
-
Запустите все узлы по очереди:
service clickhouse-server start -
Убедитесь, что защищённые порты открыты и прослушиваются; на каждом узле это должно выглядеть примерно так:
root@chnode1:/etc/clickhouse-server# netstat -ano | grep tcptcp 0 0 0.0.0.0:9010 0.0.0.0:* LISTEN off (0.00/0/0) tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN off (0.00/0/0) tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN off (0.00/0/0) tcp 0 0 0.0.0.0:8443 0.0.0.0:* LISTEN off (0.00/0/0) tcp 0 0 0.0.0.0:9440 0.0.0.0:* LISTEN off (0.00/0/0) tcp 0 0 0.0.0.0:9281 0.0.0.0:* LISTEN off (0.00/0/0) tcp 0 0 192.168.1.221:33046 192.168.1.222:9444 ESTABLISHED off (0.00/0/0) tcp 0 0 192.168.1.221:42730 192.168.1.223:9444 ESTABLISHED off (0.00/0/0) tcp 0 0 192.168.1.221:51952 192.168.1.222:9281 ESTABLISHED off (0.00/0/0) tcp 0 0 192.168.1.221:22 192.168.1.210:49801 ESTABLISHED keepalive (6618.05/0/0) tcp 0 64 192.168.1.221:22 192.168.1.210:59195 ESTABLISHED on (0.24/0/0) tcp6 0 0 :::22 :::* LISTEN off (0.00/0/0) tcp6 0 0 :::9444 :::* LISTEN off (0.00/0/0) tcp6 0 0 192.168.1.221:9444 192.168.1.222:59046 ESTABLISHED off (0.00/0/0) tcp6 0 0 192.168.1.221:9444 192.168.1.223:41976 ESTABLISHED off (0.00/0/0)Порт ClickHouse Описание 8443 интерфейс HTTPS 9010 межсерверный HTTPS-порт 9281 защищённый порт ClickHouse Keeper 9440 защищённый нативный TCP-протокол 9444 порт Raft для ClickHouse Keeper -
Проверьте состояние ClickHouse Keeper Обычные команды из 4 букв (4lW) не работают через
echoбез TLS; вот как использовать эти команды сopenssl.- Запустите интерактивный сеанс в
openssl
- Запустите интерактивный сеанс в
openssl s_client -connect chnode1.marsnet.local:9281CONNECTED(00000003)
depth=0 CN = chnode1
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 CN = chnode1
verify error:num=21:unable to verify the first certificate
verify return:1
---
Certificate chain
0 s:CN = chnode1
i:CN = marsnet.local CA
---
Server certificate
-----BEGIN CERTIFICATE-----
MIICtDCCAZwCFD321grxU3G5pf6hjitf2u7vkusYMA0GCSqGSIb3DQEBCwUAMBsx
...-
Введите команды 4LW в сеансе OpenSSL
mntr--- Post-Handshake New Session Ticket arrived: SSL-Session: Protocol : TLSv1.3 ... read R BLOCK zk_version v22.7.3.5-stable-e140b8b5f3a5b660b6b576747063fd040f583cf3 zk_avg_latency 0 zk_max_latency 4087 zk_min_latency 0 zk_packets_received 4565774 zk_packets_sent 4565773 zk_num_alive_connections 2 zk_outstanding_requests 0 zk_server_state leader zk_znode_count 1087 zk_watch_count 26 zk_ephemerals_count 12 zk_approximate_data_size 426062 zk_key_arena_size 258048 zk_latest_snapshot_size 0 zk_open_file_descriptor_count 187 zk_max_file_descriptor_count 18446744073709551615 zk_followers 2 zk_synced_followers 1 closed
-
Запустите клиент ClickHouse, указав флаг
--secureи порт TLS:root@chnode1:/etc/clickhouse-server# clickhouse-client --user default --password ClickHouse123! --port 9440 --secure --host chnode1.marsnet.local ClickHouse client version 22.3.3.44 (official build). Connecting to chnode1.marsnet.local:9440 as user default. Connected to ClickHouse server version 22.3.3 revision 54455. clickhouse :) -
Войдите в интерфейс Play через
https-интерфейс по адресуhttps://chnode1.marsnet.local:8443/play.
-
Создайте реплицируемую таблицу:
clickhouse :) CREATE TABLE repl_table ON CLUSTER cluster_1S_2R ( id UInt64, column1 Date, column2 String ) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/default/repl_table', '{replica}' ) ORDER BY (id);┌─host──────────────────┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐ │ chnode2.marsnet.local │ 9440 │ 0 │ │ 1 │ 0 │ │ chnode1.marsnet.local │ 9440 │ 0 │ │ 0 │ 0 │ └───────────────────────┴──────┴────────┴───────┴─────────────────────┴──────────────────┘ -
Добавьте несколько строк на
chnode1:INSERT INTO repl_table (id, column1, column2) VALUES (1,'2022-04-01','abc'), (2,'2022-04-02','def'); -
Проверьте репликацию, просмотрев строки на
chnode2:SELECT * FROM repl_table┌─id─┬────column1─┬─column2─┐ │ 1 │ 2022-04-01 │ abc │ │ 2 │ 2022-04-02 │ def │ └────┴────────────┴─────────┘
Настройка OpenSSL для автономного ClickHouse Keeper
Если ClickHouse Keeper запускается как автономный процесс (а не в составе ClickHouse server), сертификаты и параметры OpenSSL нужно настраивать отдельно в файле конфигурации Keeper. Без этого Keeper не сможет устанавливать защищённые соединения для связи с клиентами (tcp_port_secure) и для Raft-репликации между узлами Keeper.
Добавьте следующий раздел <openSSL> в файл конфигурации автономного ClickHouse Keeper на каждом узле:
<openSSL>
<server>
<certificateFile>/etc/clickhouse-keeper/certs/chnode1.crt</certificateFile>
<privateKeyFile>/etc/clickhouse-keeper/certs/chnode1.key</privateKeyFile>
<verificationMode>relaxed</verificationMode>
<caConfig>/etc/clickhouse-keeper/certs/marsnet_ca.crt</caConfig>
<cacheSessions>true</cacheSessions>
<disableProtocols>sslv2,sslv3</disableProtocols>
<preferServerCiphers>true</preferServerCiphers>
</server>
<client>
<loadDefaultCAFile>false</loadDefaultCAFile>
<caConfig>/etc/clickhouse-keeper/certs/marsnet_ca.crt</caConfig>
<cacheSessions>true</cacheSessions>
<disableProtocols>sslv2,sslv3</disableProtocols>
<preferServerCiphers>true</preferServerCiphers>
<verificationMode>relaxed</verificationMode>
<invalidCertificateHandler>
<name>RejectCertificateHandler</name>
</invalidCertificateHandler>
</client>
</openSSL>Раздел <server> используется для входящих клиентских подключений на защищённом порту Keeper (tcp_port_secure). Раздел <client> используется для исходящих подключений между узлами Keeper во время репликации Raft.
Режимы проверки OpenSSL и обработчики сертификатов
Конфигурация <openSSL> поддерживает несколько вариантов для <verificationMode> и <invalidCertificateHandler>, которые определяют, как ClickHouse проверяет TLS-сертификаты. Эти настройки применяются к clickhouse-server, clickhouse-client и автономному ClickHouse Keeper.
Режимы проверки
Задайте <verificationMode> в разделе <server> или <client> элемента <openSSL>:
| Режим | Описание |
|---|---|
none |
Проверка сертификата не выполняется. Соединение шифруется, но подлинность узла peer не проверяется. Используйте этот режим только для тестирования. |
relaxed |
Проверяет сертификат узла peer, если он предоставлен, но не завершает соединение с ошибкой, если сертификат отсутствует. |
once |
На стороне сервера проверяет сертификат клиента только при первоначальном рукопожатии и пропускает повторное согласование. На стороне клиента работает так же, как relaxed. |
strict |
Требует сертификат узла peer и полностью проверяет его. Соединение завершается с ошибкой, если сертификат отсутствует, просрочен или не подписан доверенным CA. Рекомендуется для продакшна. |
Обработчики недействительных сертификатов
Задайте <invalidCertificateHandler> в разделе <server> или <client> внутри <openSSL>. Этот обработчик определяет, что происходит при сбое проверки сертификата. На стороне сервера он управляет реакцией на недействительные клиентские сертификаты. На стороне клиента он управляет реакцией на недействительные сертификаты сервера.
| Обработчик | Описание |
|---|---|
RejectCertificateHandler |
Отклоняет соединение, если сертификат недействителен. Это значение по умолчанию и рекомендуемая настройка. |
AcceptCertificateHandler |
Принимает соединение, даже если сертификат недействителен. Используйте это только для тестирования. |
Пример: отключение проверки сертификата
Чтобы полностью отключить проверку сертификата (например, при использовании самоподписанных сертификатов в тестовой среде), задайте для verificationMode значение none и используйте AcceptCertificateHandler.
Для clickhouse-client также можно использовать флаг командной строки --accept-invalid-certificate, который автоматически применяет оба параметра.
clickhouse-client (/etc/clickhouse-client/config.xml):
<openSSL>
<client>
<loadDefaultCAFile>false</loadDefaultCAFile>
<cacheSessions>true</cacheSessions>
<disableProtocols>sslv2,sslv3</disableProtocols>
<preferServerCiphers>true</preferServerCiphers>
<verificationMode>none</verificationMode>
<invalidCertificateHandler>
<name>AcceptCertificateHandler</name>
</invalidCertificateHandler>
</client>
</openSSL>clickhouse-server (config.xml или файл в config.d/). В разделе <server> по-прежнему нужно указать пути к сертификату и ключу, поскольку сервер должен предъявлять клиентам собственный сертификат, даже если он не проверяет их сертификаты:
<openSSL>
<server>
<certificateFile>/etc/clickhouse-server/certs/server.crt</certificateFile>
<privateKeyFile>/etc/clickhouse-server/certs/server.key</privateKeyFile>
<verificationMode>none</verificationMode>
<caConfig>/etc/clickhouse-server/certs/ca.crt</caConfig>
<cacheSessions>true</cacheSessions>
<disableProtocols>sslv2,sslv3</disableProtocols>
<preferServerCiphers>true</preferServerCiphers>
</server>
<client>
<loadDefaultCAFile>false</loadDefaultCAFile>
<cacheSessions>true</cacheSessions>
<disableProtocols>sslv2,sslv3</disableProtocols>
<preferServerCiphers>true</preferServerCiphers>
<verificationMode>none</verificationMode>
<invalidCertificateHandler>
<name>AcceptCertificateHandler</name>
</invalidCertificateHandler>
</client>
</openSSL>Автономный ClickHouse Keeper (файл конфигурации Keeper):
<openSSL>
<server>
<certificateFile>/etc/clickhouse-keeper/certs/keeper.crt</certificateFile>
<privateKeyFile>/etc/clickhouse-keeper/certs/keeper.key</privateKeyFile>
<verificationMode>none</verificationMode>
<caConfig>/etc/clickhouse-keeper/certs/ca.crt</caConfig>
<cacheSessions>true</cacheSessions>
<disableProtocols>sslv2,sslv3</disableProtocols>
<preferServerCiphers>true</preferServerCiphers>
</server>
<client>
<loadDefaultCAFile>false</loadDefaultCAFile>
<cacheSessions>true</cacheSessions>
<disableProtocols>sslv2,sslv3</disableProtocols>
<preferServerCiphers>true</preferServerCiphers>
<verificationMode>none</verificationMode>
<invalidCertificateHandler>
<name>AcceptCertificateHandler</name>
</invalidCertificateHandler>
</client>
</openSSL>Краткое резюме
В этой статье мы рассмотрели настройку среды ClickHouse с использованием TLS. Параметры в продакшн-среде будут отличаться в зависимости от требований; например, уровни проверки сертификатов, протоколы, шифры и т. д. Но теперь вы должны лучше понимать, какие шаги нужны для настройки и внедрения защищённых соединений.