Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

Настройка TLS

Не поддерживается в ClickHouse Cloud

В этом руководстве приведены простые минимальные настройки для конфигурации 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-сертификатов

  1. Сгенерируйте ключ, который будет использоваться для нового CA:

    openssl genrsa -out marsnet_ca.key 2048
  2. Сгенерируйте новый самоподписанный CA‑сертификат. Следующая команда создаст новый сертификат, который будет использоваться для подписи других сертификатов с помощью ключа CA:

    openssl req -x509 -subj "/CN=marsnet.local CA" -nodes -key marsnet_ca.key -days 1095 -out marsnet_ca.crt
  1. Проверьте содержимое нового CA‑сертификата:

    openssl x509 -in marsnet_ca.crt -text
  2. Создайте запрос на сертификат (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
  3. Используя 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
  4. Проверьте сертификаты на наличие полей subject и issuer:

    openssl x509 -in chnode1.crt -text -noout
  5. Убедитесь, что новые сертификаты проходят проверку по CA‑сертификату:

    openssl verify -CAfile marsnet_ca.crt chnode1.crt
    chnode1.crt: OK

Создайте и настройте каталог для хранения сертификатов и ключей.

  1. Создайте папку в каталоге, доступном для ClickHouse, на каждом узле. Мы рекомендуем использовать каталог конфигурации по умолчанию (например, /etc/clickhouse-server):

    mkdir /etc/clickhouse-server/certs
  2. Скопируйте CA‑сертификат, сертификат узла и соответствующий ему ключ в новый каталог certs на каждом узле.

  3. Измените владельца и права доступа, чтобы 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/certs
    total 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 и т. д.)

  1. Добавьте следующий код внутрь тега <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>
  1. Раскомментируйте и обновите параметры 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>
  2. Обновите и добавьте следующие настройки кластера на 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>
  1. Задайте значения макросов, чтобы создать таблицу 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

  1. Задайте отображаемое имя для развертывания (необязательно):

    <display_name>clickhouse</display_name>
  2. Настройте ClickHouse на прослушивание внешних портов:

    <listen_host>0.0.0.0</listen_host>
  3. Настройте порт https и отключите порт http на каждом узле:

    <https_port>8443</https_port>
    {/*<http_port>8123</http_port>*/}
  4. Настройте защищенный TCP-порт ClickHouse Native и отключите стандартный незащищенный порт на каждом узле:

    <tcp_port_secure>9440</tcp_port_secure>
    {/*<tcp_port>9000</tcp_port>*/}
  5. Настройте порт interserver https и отключите стандартный незащищенный порт на каждом узле:

    <interserver_https_port>9010</interserver_https_port>
    {/*<interserver_http_port>9009</interserver_http_port>*/}
  6. Настройте 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>

Дополнительные сведения см. на этой странице

  1. Настройте 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/

  2. Настройте клиент 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>
  3. Отключите порты эмуляции MySQL и PostgreSQL, используемые по умолчанию:

    {/*mysql_port>9004</mysql_port*/}
    {/*postgresql_port>9005</postgresql_port*/}

Тестирование

  1. Запустите все узлы по очереди:

    service clickhouse-server start
  2. Убедитесь, что защищённые порты открыты и прослушиваются; на каждом узле это должно выглядеть примерно так:

    root@chnode1:/etc/clickhouse-server# netstat -ano | grep tcp
    tcp        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
  3. Проверьте состояние ClickHouse Keeper Обычные команды из 4 букв (4lW) не работают через echo без TLS; вот как использовать эти команды с openssl.

    • Запустите интерактивный сеанс в openssl
openssl s_client -connect chnode1.marsnet.local:9281
CONNECTED(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
  1. Запустите клиент 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 :)
  2. Войдите в интерфейс Play через https-интерфейс по адресу https://chnode1.marsnet.local:8443/play.

    Настройка TLS
  1. Создайте реплицируемую таблицу:

    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 │
    └───────────────────────┴──────┴────────┴───────┴─────────────────────┴──────────────────┘
  2. Добавьте несколько строк на chnode1:

    INSERT INTO repl_table
    (id, column1, column2)
    VALUES
    (1,'2022-04-01','abc'),
    (2,'2022-04-02','def');
  3. Проверьте репликацию, просмотрев строки на 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. Параметры в продакшн-среде будут отличаться в зависимости от требований; например, уровни проверки сертификатов, протоколы, шифры и т. д. Но теперь вы должны лучше понимать, какие шаги нужны для настройки и внедрения защищённых соединений.

Navigation