TLS 설정
TLS 설정 (Configuring TLS)
ClickHouse가 OpenSSL 인증서를 사용해 연결을 검증하도록 구성하는 간단하고 최소한의 설정을 안내하는 가이드예요. 데모를 위해 자체 서명 CA(인증 기관) 인증서와 키, 노드 인증서를 만들어 적절한 설정으로 연결을 구성합니다.
출처: 문서
본문
이 페이지는 ClickHouse Cloud에는 적용되지 않아요. 여기서 설명하는 절차는 ClickHouse Cloud 서비스에서 자동화되어 있습니다.
이 가이드는 ClickHouse가 OpenSSL 인증서를 사용해 연결을 검증하도록 구성하는 간단하고 최소한의 설정을 제공합니다. 이 데모에서는 자체 서명 CA(인증 기관) 인증서와 키를 노드 인증서와 함께 만들어 적절한 설정으로 연결합니다.
TLS 구현은 복잡하며 완전히 안전하고 견고한 배포를 보장하려면 고려해야 할 옵션이 많습니다. 이는 기본 TLS 구성 예시가 있는 기초 튜토리얼입니다. 조직에 맞는 올바른 인증서를 생성하려면 PKI/보안 팀과 상의하세요. 소개 개요로 인증서 사용에 대한 기초 튜토리얼을 검토하세요.
1
ClickHouse 배포 만들기
이 가이드는 Ubuntu 20.04와 DEB 패키지(apt 사용)로 다음 호스트에 설치된 ClickHouse를 기준으로 작성되었습니다. 도메인은 marsnet.local입니다:
| 호스트 | IP 주소 |
|---|---|
chnode1 |
192.168.1.221 |
chnode2 |
192.168.1.222 |
chnode3 |
192.168.1.223 |
ClickHouse 설치 방법 자세한 내용은 Quick Start를 참고하세요.
2
TLS 인증서 만들기
자체 서명 인증서는 데모 목적으로만 사용되며 프로덕션에서 사용해서는 안 됩니다. 인증서 요청은 조직이 서명하고 설정에서 구성될 CA 체인으로 검증되어야 합니다. 다만 이 단계들을 사용해 설정을 구성하고 테스트한 다음, 사용할 실제 인증서로 교체할 수 있습니다.
-
새 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 인증서를 클러스터에 없는 안전한 위치에 백업하세요. 노드 인증서를 생성한 후에는 키를 클러스터 노드에서 삭제해야 합니다.
-
새 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
3
인증서와 키를 저장할 디렉터리 만들고 구성하기
이 작업은 각 노드에서 수행해야 합니다. 각 호스트에서 적절한 인증서와 키를 사용하세요.
-
각 노드의 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
4
ClickHouse Keeper를 사용한 기본 클러스터로 환경 구성하기
이 배포 환경에서는 각 노드에서 다음 ClickHouse Keeper 설정이 사용됩니다. 각 서버는 자체 <server_id>를 가집니다. (예: chnode1 노드는 <server_id>1</server_id> 등)
ClickHouse Keeper에 권장되는 포트는 9281입니다. 다만 포트는 구성 가능하며 이미 다른 애플리케이션이 환경에서 사용 중이라면 설정할 수 있습니다. 모든 옵션에 대한 전체 설명은 https://clickhouse.com/docs/operations/clickhouse-keeper/를 방문하세요.
- ClickHouse 서버
config.xml의<clickhouse>태그 안에 다음을 추가합니다
프로덕션 환경에서는 config.d 디렉터리에 별도의 .xml 구성 파일을 사용하는 것이 좋습니다. 자세한 내용은 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는 ClickHouse 노드에서 TLS 인터페이스 구성의 OpenSSL 섹션에 정의된 서버의 OpenSSL 구성을 사용합니다. ClickHouse Keeper를 독립 실행 프로세스로 실행한다면, 같은 CA 인증서와 노드 인증서/키 설정으로 Keeper 구성 파일에 <openSSL> 섹션을 추가해야 합니다. 자세한 내용은 아래 독립 실행 ClickHouse Keeper용 OpenSSL 구성을 참고하세요.
-
모든 노드에서 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 쿼럼(quorum)에 사용됩니다.
이 구성에서는 하나의 예시 클러스터만 구성됩니다. 테스트 샘플 클러스터는 제거하거나 주석 처리해야 하며, 테스트 중인 기존 클러스터가 있다면 포트를 업데이트하고 <secure> 옵션을 추가해야 합니다. 설치 시나 users.xml 파일에서 default 사용자가 처음에 비밀번호로 구성되었다면 <user와 <password>를 설정해야 합니다.
다음은 두 서버에 하나의 샤드 복제본이 있는 클러스터를 만듭니다(각 노드에 하나씩).
<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 테이블을 만들 수 있도록 macros 값을 정의합니다.
chnode1에서:<macros> <shard>1</shard> <replica>replica_1</replica> </macros>chnode2에서:<macros> <shard>1</shard> <replica>replica_2</replica> </macros>
5
ClickHouse 노드에서 TLS 인터페이스 구성하기
아래 설정은 ClickHouse 서버 config.xml에서 구성됩니다.
-
배포의 표시 이름을 설정합니다(선택):
<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>*/} -
각 노드에서 ClickHouse Native 보안 TCP 포트를 구성하고 기본 비보안 포트를 비활성화합니다:
<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을 구성합니다
각 파일 이름과 경로는 구성 중인 노드와 일치하도록 업데이트해야 합니다. 예를 들어 chnode2 호스트에서 구성할 때 <certificateFile> 항목을 chnode2.crt로 업데이트하세요.
<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>
자세한 내용은 이 페이지를 방문하세요.
-
모든 노드에서 gRPC용 TLS를 구성합니다:
<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/를 방문하세요.
-
적어도 하나의 노드에서 자체
config.xml파일(기본적으로/etc/clickhouse-client/)에서 ClickHouse 클라이언트가 연결에 TLS를 사용하도록 구성합니다:<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*/}
6
테스트하기
-
모든 노드를 하나씩 시작합니다:
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 interserver https 포트 9281 ClickHouse Keeper 보안 포트 9440 보안 Native TCP 프로토콜 9444 ClickHouse Keeper Raft 포트 -
ClickHouse Keeper 상태 확인 일반적인 4자리 단어(4lW) 명령은 TLS 없이
echo로는 작동하지 않습니다.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
...
- OpenSSL 세션에서 4LW 명령 보내기
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
-
--secure플래그와 TLS 포트를 사용해 ClickHouse 클라이언트를 시작합니다: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 :) -
https://chnode1.marsnet.local:8443/play의https인터페이스로 Play UI에 로그인합니다.
워크스테이션에서 접근하고 인증서가 클라이언트 머신의 루트 CA 저장소에 없기 때문에 브라우저는 신뢰할 수 없는 인증서를 표시합니다. 공개 인증 기관이나 엔터프라이즈 CA에서 발급한 인증서를 사용할 때는 신뢰할 수 있는 것으로 표시되어야 합니다.
-
복제 테이블을 만듭니다:
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 │ └────┴────────────┴─────────┘
독립 실행 ClickHouse Keeper용 OpenSSL 구성 (Configure OpenSSL for standalone ClickHouse Keeper)
ClickHouse Keeper를 (ClickHouse 서버에 임베드하는 대신) 독립 실행 프로세스로 실행할 때는 OpenSSL 인증서와 설정을 Keeper 구성 파일에 별도로 구성해야 합니다. 이렇게 하지 않으면 Keeper는 클라이언트 통신(tcp_port_secure)이나 Keeper 노드 간 Raft 복제를 위한 보안 연결을 수립할 수 없습니다.
각 노드의 독립 실행 ClickHouse Keeper 구성 파일에 다음 <openSSL> 섹션을 추가합니다:
각 파일 이름은 구성 중인 노드와 일치하도록 업데이트해야 합니다. 예를 들어 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> 섹션은 Raft 복제 중 Keeper 노드 간 나가는 연결에 사용됩니다.
위 인증서 경로는 독립 실행 Keeper 설치의 일반적인 경로인 /etc/clickhouse-keeper/certs/를 사용합니다. Keeper를 다른 경로로 설치했다면 그에 맞게 조정하세요. 인증서 자체는 2단계에서 만든 것과 동일합니다.
OpenSSL 검증 모드와 인증서 핸들러 (OpenSSL verification modes and certificate handlers)
<openSSL> 구성은 ClickHouse가 TLS 인증서를 검증하는 방법을 제어하는 <verificationMode>와 <invalidCertificateHandler>에 대한 여러 옵션을 지원합니다. 이러한 설정은 clickhouse-server, clickhouse-client, 독립 실행 ClickHouse Keeper에 적용됩니다.
검증 모드 (Verification modes)
<openSSL>의 <server> 또는 <client> 섹션 안에 <verificationMode>를 설정합니다:
| 모드 | 설명 |
|---|---|
none |
인증서 검증 없음. 연결이 암호화되지만 피어의 신원은 확인되지 않습니다. 테스트용으로만 사용하세요. |
relaxed |
피어 인증서가 제시되면 검증하지만, 인증서가 제공되지 않아도 실패하지 않습니다. |
once |
서버 측에서 초기 핸드셰이크에서만 클라이언트 인증서를 검증하고 재협상을 건너뜁니다. 클라이언트 측에서는 relaxed와 동일하게 동작합니다. |
strict |
피어 인증서를 요구하고 완전히 검증합니다. 인증서가 없거나, 만료되었거나, 신뢰할 수 있는 CA가 서명하지 않으면 연결이 실패합니다. 프로덕션에 권장됩니다. |
유효하지 않은 인증서 핸들러 (Invalid certificate handlers)
<openSSL>의 <server> 또는 <client> 섹션 안에 <invalidCertificateHandler>를 설정합니다. 이 핸들러는 인증서 검증이 실패할 때 무슨 일이 일어나는지 결정합니다. 서버 측에서는 유효하지 않은 클라이언트 인증서에 대한 응답을 제어합니다. 클라이언트 측에서는 유효하지 않은 서버 인증서에 대한 응답을 제어합니다.
| 핸들러 | 설명 |
|---|---|
RejectCertificateHandler |
인증서가 유효하지 않으면 연결을 거부합니다. 기본이며 권장되는 설정입니다. |
AcceptCertificateHandler |
인증서가 유효하지 않아도 연결을 수락합니다. 테스트용으로만 사용하세요. |
인증서 검증 비활성화 예시 (Example: disabling certificate verification)
인증서 검증을 비활성화하면 TLS 신원 확인이 제거되어 연결이 중간자 공격에 노출됩니다. 이 구성은 격리된 개발 또는 테스트 환경에서만 사용하세요.
인증서 검증을 완전히 건너뛰려면(예: 테스트 환경에서 자체 서명 인증서 사용 시) verificationMode를 none으로 설정하고 AcceptCertificateHandler를 사용하세요.
clickhouse-client의 경우 두 설정을 자동으로 적용하는 --accept-invalid-certificate CLI 플래그도 사용할 수 있습니다.
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>
재시작 없이 인증서와 CA 인증서 순환하기 (Rotating certificates and CA certificates without a restart)
ClickHouse 서버와 ClickHouse Keeper는 openSSL.server와 openSSL.client 섹션(그리고 구성 가능한 프로토콜의 protocols.*)에서 certificateFile, privateKeyFile, caConfig가 참조하는 파일들을 감시합니다. caConfig가 디렉터리라면 그 디렉터리의 파일들을 감시합니다. 이 파일 중 하나가 변경되거나, SYSTEM RELOAD CONFIG가 실행되면 인증서가 다시 로드되어 HTTPS, 보안 네이티브 프로토콜, interserver 연결, Keeper 연결, Keeper 노드 간 Raft 연결을 포함한 모든 새 TLS 연결에 사용됩니다. 기존 연결은 열릴 때 사용한 인증서를 계속 사용합니다.
가동 중단 없이 CA를 순환하려면, 먼저 caConfig 파일을 이전 CA와 새 CA 인증서를 모두 포함한 번들로 교체하고, 그 다음 노드와 클라이언트 인증서를 새 CA가 발급한 것으로 전환하고, 마지막으로 번들을 새 CA 인증서만 있는 것으로 교체합니다.
요약 (Summary)
이 문서는 ClickHouse 환경을 TLS로 구성하는 데 초점을 맞췄습니다. 프로덕션 환경의 다른 요구 사항(예: 인증서 검증 수준, 프로토콜, 암호화 등)에 따라 설정이 달라질 것입니다. 하지만 이제 보안 연결을 구성하고 구현하는 데 관련된 단계를 잘 이해하게 되었을 것입니다.