Перейти к основному содержимому
Перейти к основному содержимому

Настройка TLS

Not supported in ClickHouse Cloud
Примечание

Эта страница не относится к ClickHouse Cloud. Описанная здесь процедура выполняется автоматически в сервисах ClickHouse Cloud.

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

Примечание

Реализация TLS — сложная задача, и существует множество вариантов, которые необходимо учитывать для обеспечения полностью безопасного и надежного развертывания. Это базовое руководство с простыми примерами конфигурации TLS. Обратитесь к вашей команде по PKI/безопасности, чтобы сгенерировать корректные сертификаты для вашей организации.

Ознакомьтесь с этим базовым руководством по использованию сертификатов для вводного обзора.

Создайте развертывание ClickHouse

Это руководство было написано с использованием Ubuntu 20.04 и ClickHouse, установленного на следующих хостах из DEB-пакета (с помощью apt). Домен — marsnet.local:

HostIP Address
chnode1192.168.1.221
chnode2192.168.1.222
chnode3192.168.1.223
Примечание

См. руководство Quick Start, чтобы получить более подробную информацию об установке ClickHouse.

Создайте TLS-сертификаты

Примечание

Самоподписанные сертификаты используются только в демонстрационных целях и не должны использоваться в production-среде. Запросы на сертификаты должны создаваться для подписи организацией и проверяться с использованием цепочки CA, которая будет настроена в параметрах. Однако эти шаги можно использовать для настройки и тестирования параметров, а затем заменить сертификаты на фактические, которые будут использоваться.

  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
    
    Примечание

    Сохраните резервные копии ключа и сертификата CA в безопасном месте вне кластера. После генерации сертификатов узлов ключ следует удалить с узлов кластера.

  3. Проверьте содержимое нового сертификата CA:

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

    openssl x509 -in chnode1.crt -text -noout
    
  7. Убедитесь, что новые сертификаты успешно проверяются по сертификату 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 и так далее.)

Примечание

Рекомендуемый порт для ClickHouse Keeper — 9281. Однако порт настраиваемый и может быть изменён, если в этой среде он уже используется другим приложением.

Полное описание всех параметров см. по адресу https://clickhouse.com/docs/operations/clickhouse-keeper/

  1. Добавьте следующее внутрь тега <clickhouse> в config.xml сервера ClickHouse

    Примечание

    Для production-сред рекомендуется использовать отдельный файл конфигурации .xml в каталоге config.d. Дополнительные сведения см. по адресу https://clickhouse.com/docs/operations/configuration-files/

    <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>
    
    Примечание

    Когда ClickHouse Keeper встроен в сервер ClickHouse (как показано выше), Keeper использует конфигурацию OpenSSL сервера, определённую в разделе OpenSSL статьи Configure TLS interfaces on ClickHouse nodes. Если вы запускаете ClickHouse Keeper как автономный процесс, необходимо добавить раздел <openSSL> в файл конфигурации Keeper с теми же настройками сертификата CA и сертификата/ключа узла. Подробности см. в разделе Configure OpenSSL for standalone ClickHouse Keeper ниже.

  2. Раскомментируйте и обновите настройки 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>
    
  3. Обновите и добавьте следующие настройки кластера на chnode1 и chnode2. chnode3 будет использоваться для кворума ClickHouse Keeper.

    Примечание

    В этой конфигурации настраивается только один пример кластера. Тестовые примерные кластеры необходимо либо удалить, либо закомментировать, либо, если тестируется существующий кластер, следует обновить порт и добавить параметр <secure>. Параметры <user и <password> должны быть заданы, если для пользователя default пароль был изначально настроен во время установки или в файле users.xml.

    Следующий пример создаёт кластер с одним шардом-репликой на двух серверах (по одному на каждом узле).

    <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>
    
  4. Задайте значения macros, чтобы можно было создать таблицу 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 и отключите стандартный незащищённый порт на каждом узле:

    <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 с сертификатами и путями

    Примечание

    Имя каждого файла и путь должны быть обновлены в соответствии с узлом, на котором выполняется настройка. Например, обновите запись <certificateFile>, указав chnode2.crt при настройке на хосте chnode2.

    <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>
    

    дополнительные сведения см. по адресу https://clickhouse.com/docs/operations/server-configuration-parameters/settings/#server_configuration_parameters-openssl

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

  8. Настройте клиент 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>
    
  9. Отключите стандартные порты эмуляции 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 PortDescription
    8443интерфейс https
    9010межсерверный порт https
    9281защищённый порт ClickHouse Keeper
    9440защищённый протокол Native TCP
    9444порт Raft ClickHouse Keeper
  3. Проверьте состояние ClickHouse Keeper The typical 4 letter word (4lW) commands won't work using echo without TLS, here is how to use the commands with 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
    # highlight-next-line
    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
    # highlight-next-line
    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
    # highlight-next-line
    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 UI через интерфейс https по адресу https://chnode1.marsnet.local:8443/play.

    Настройка TLS
    Примечание

    браузер покажет недоверенный сертификат, поскольку доступ к нему выполняется с рабочей станции, а сертификаты отсутствуют в хранилищах корневых CA на клиентской машине. При использовании сертификатов, выпущенных публичным центром сертификации или корпоративным CA, он должен отображаться как доверенный.

  3. Создайте реплицируемую таблицу:

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

    INSERT INTO repl_table
    (id, column1, column2)
    VALUES
    (1,'2022-04-01','abc'),
    (2,'2022-04-02','def');
    
  5. Проверьте репликацию, просмотрев строки на chnode2:

    SELECT * FROM repl_table
    
    ┌─id─┬────column1─┬─column2─┐
    │  1 │ 2022-04-01 │ abc     │
    │  2 │ 2022-04-02 │ def     │
    └────┴────────────┴─────────┘
    

Настройка OpenSSL для автономного ClickHouse Keeper

При запуске ClickHouse Keeper как автономного процесса (а не встроенного в сервер ClickHouse) сертификаты и параметры OpenSSL необходимо настраивать отдельно в файле конфигурации Keeper. Без этого Keeper не сможет устанавливать защищенные соединения ни для взаимодействия с клиентами (tcp_port_secure), ни для Raft-репликации между узлами Keeper.

Добавьте следующий раздел <openSSL> в файл конфигурации автономного ClickHouse Keeper на каждом узле:

Примечание

Имя каждого файла необходимо изменить в соответствии с узлом, на котором выполняется настройка. Например, при настройке на хосте chnode2 укажите в записи <certificateFile> значение chnode2.crt.

<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.

Примечание

В приведённых выше путях к сертификатам используется /etc/clickhouse-keeper/certs/ — это типичный путь для автономных установок Keeper. Если вы установили Keeper в другой каталог, внесите соответствующие изменения. Сами сертификаты — те же, что были созданы на шаге 2.

Итоги

В этой статье основное внимание было уделено настройке среды ClickHouse с использованием TLS. Параметры будут отличаться в зависимости от требований в продуктивных средах, например уровни проверки сертификатов, протоколы, шифры и т. д. Теперь у вас должно быть хорошее понимание последовательности шагов по настройке и использованию защищённых соединений.