이 페이지는 ClickHouse Cloud에는 해당되지 않습니다. 여기에서 설명하는 절차는 ClickHouse Cloud 서비스에서 자동으로 처리됩니다.
TLS 구현은 복잡하며, 완전히 안전하고 견고한 배포를 위해 고려해야 할 옵션이 많습니다. 이 문서는 기본 TLS 구성 예시를 다루는 기초 튜토리얼입니다. 조직 환경에 맞는 올바른 인증서를 생성하려면 PKI/보안 팀과 상의하십시오.입문용 개요는 인증서 사용에 관한 기본 튜토리얼을 참조하십시오.
1
ClickHouse 배포 생성
이 가이드는 Ubuntu 20.04 환경에서 DEB 패키지(apt 사용)를 사용해 다음 호스트에 ClickHouse를 설치한 기준으로 작성되었습니다. 도메인은marsnet.local입니다:ClickHouse 설치 방법에 대한 자세한 내용은 Quick Start를 참조하세요.
2
TLS 인증서 생성
자체 서명 인증서는 데모 용도로만 사용해야 하며 운영(production) 환경에서는 사용해서는 안 됩니다. 인증서 요청은 조직에서 서명할 수 있도록 생성해야 하며, 설정에서 구성할 CA 체인을 사용해 검증해야 합니다. 다만 아래 단계는 설정을 구성하고 테스트하는 데 사용할 수 있으며, 이후 실제로 사용할 인증서로 대체할 수 있습니다.
-
새 CA에 사용할 키를 생성합니다:
-
새 자체 서명 CA 인증서를 생성합니다. 다음 명령은 CA 키를 사용해 다른 인증서에 서명할 때 사용할 새 인증서를 생성합니다:
키와 CA 인증서는 클러스터 외부의 안전한 위치에 백업하십시오. 노드 인증서를 생성한 후에는 클러스터 노드에서 해당 키를 삭제해야 합니다.
-
새 CA 인증서의 내용을 확인합니다:
-
각 노드에 대해 인증서 요청(CSR)을 생성하고 키를 만듭니다:
-
CSR과 CA를 사용해 새 인증서 및 키 쌍을 생성합니다:
-
subject와 issuer를 기준으로 인증서를 확인합니다:
-
새 인증서가 CA 인증서를 기준으로 검증되는지 확인합니다:
3
인증서와 키를 저장할 디렉터리를 생성하고 구성합니다.
이 작업은 각 노드에서 수행해야 합니다. 각 호스트에는 해당 호스트에 맞는 인증서와 키를 사용하십시오.
-
각 노드에서 ClickHouse가 접근할 수 있는 디렉터리에 폴더를 생성합니다. 기본 구성 디렉터리(예:
/etc/clickhouse-server)를 사용하는 것을 권장합니다. -
CA 인증서, 노드 인증서, 그리고 각 노드에 해당하는 키를 새
certs디렉터리로 복사합니다. -
ClickHouse가 인증서를 읽을 수 있도록 소유자와 권한을 변경합니다.
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/를 참조하십시오.ClickHouse Keeper가 ClickHouse 서버에 내장된 경우(위에 표시된 대로), Keeper는 ClickHouse 노드에서 TLS 인터페이스 구성의 OpenSSL 섹션에 정의된 서버의 OpenSSL 구성을 사용합니다. ClickHouse Keeper를 독립형 프로세스로 실행하는 경우에는 동일한 CA 인증서와 노드 인증서/키 설정을 사용하도록 Keeper 설정 파일에
<openSSL> 섹션을 추가해야 합니다. 자세한 내용은 아래의 독립형 ClickHouse Keeper용 OpenSSL 구성을 참조하십시오.-
모든 노드에서 Keeper 설정의 주석 처리를 해제하고 값을 수정한 뒤
<secure>플래그를 1로 설정하세요: -
다음 클러스터 설정을
chnode1및chnode2에 추가하고 업데이트하십시오.chnode3은 ClickHouse Keeper 쿼럼에 사용됩니다.
이 구성에서는 예시 클러스터 1개만 설정됩니다. 테스트용 예시 클러스터는 제거하거나 주석 처리해야 합니다. 또는 테스트 중인 기존 클러스터가 있다면 포트를 업데이트하고
<secure> 옵션을 추가해야 합니다. 설치 시 또는 users.xml 파일에서 default 사용자가 처음부터 비밀번호를 사용하도록 구성된 경우에는 <user 및 <password>를 설정해야 합니다.-
테스트용 ReplicatedMergeTree 테이블을 생성할 수 있게 매크로 값을 정의합니다.
chnode1에서:chnode2에서:
5
ClickHouse 노드에서 TLS 인터페이스 구성
아래 설정은 ClickHouse 서버의config.xml에서 구성합니다.-
배포의 표시 이름을 설정합니다(선택 사항):
-
ClickHouse가 외부 포트에서 수신하도록 설정합니다:
-
각 노드에서
https포트를 구성하고http포트를 비활성화합니다: -
각 노드에서 ClickHouse 네이티브 보안 TCP 포트를 구성하고 기본 비보안 포트를 비활성화합니다:
-
각 노드에서
interserver https포트를 구성하고 기본 비보안 포트를 비활성화합니다: - 인증서와 경로를 사용하도록 OpenSSL을 구성합니다
각 파일 이름과 경로는 설정을 적용하는 노드에 맞게 업데이트해야 합니다.
예를 들어,
chnode2 호스트에서 구성할 때는 <certificateFile> 항목을 chnode2.crt로 업데이트합니다.-
모든 노드에서 gRPC에 TLS를 구성합니다:
자세한 내용은 https://clickhouse.com/docs/interfaces/grpc/ 를 참조하십시오.
-
최소 하나의 노드에서 ClickHouse client가 연결에 TLS를 사용하도록 해당 노드의
config.xml파일(기본 경로:/etc/clickhouse-client/)에서 구성합니다: -
MySQL 및 PostgreSQL의 기본 에뮬레이션 포트를 비활성화합니다:
6
테스트
-
모든 노드를 하나씩 시작하십시오:
-
보안 포트가 열려 있고 수신 대기 상태인지 확인하십시오. 각 노드에서 다음 예시와 비슷하게 표시되어야 합니다:
-
ClickHouse Keeper 상태 확인
일반적인 4 letter word (4lW) 명령은 TLS 없이
echo로는 작동하지 않습니다. 아래는openssl을 사용해 해당 명령을 실행하는 방법입니다.openssl을 실행해 대화형 세션을 시작합니다
-
OpenSSL 세션에서 4LW 명령을 입력합니다
-
--secure플래그와 TLS 포트를 사용해 clickhouse client를 시작하십시오: -
https인터페이스를 통해https://chnode1.marsnet.local:8443/play의 Play UI에 로그인하세요.
브라우저는 워크스테이션에서 접속하고 있으며 인증서가 클라이언트 머신의 루트 CA 저장소에 없기 때문에 신뢰되지 않는 인증서로 표시합니다.
공개 인증 기관 또는 엔터프라이즈 CA에서 발급한 인증서를 사용하는 경우 신뢰되는 것으로 표시되어야 합니다.
-
복제된 테이블(Replicated Table)을 생성하세요:
-
chnode1에 두어 개의 행을 추가하세요: -
chnode2에서 행을 확인하여 복제가 제대로 되었는지 확인합니다:
독립 실행형 ClickHouse Keeper용 OpenSSL 구성
tcp_port_secure)이나 Keeper 노드 간 Raft 복제를 위한 보안 연결을 설정할 수 없습니다.
각 노드의 독립 실행형 ClickHouse Keeper 설정 파일에 다음 <openSSL> 섹션을 추가하십시오:
각 파일명은 현재 구성 중인 노드에 맞게 수정해야 합니다.
예를 들어,
chnode2 호스트에서 구성하는 경우 <certificateFile> 항목을 chnode2.crt로 수정하십시오.<server> 섹션은 보안 Keeper 포트(tcp_port_secure)로 들어오는 클라이언트 연결에 사용됩니다. <client> 섹션은 Raft 복제 중 Keeper 노드 간에 이루어지는 아웃바운드 연결에 사용됩니다.
위 인증서 경로는 독립형 Keeper 설치에서 일반적으로 사용하는
/etc/clickhouse-keeper/certs/를 기준으로 합니다. Keeper를 다른 경로에 설치한 경우에는 그에 맞게 조정하십시오. 인증서 자체는 2단계에서 생성한 것과 동일합니다.OpenSSL 검증 모드 및 인증서 핸들러
<openSSL> 구성은 ClickHouse가 TLS 인증서를 검증하는 방식을 제어하는 <verificationMode> 및 <invalidCertificateHandler>에 대해 여러 옵션을 지원합니다. 이러한 설정은 clickhouse-server, clickhouse-client 및 독립 실행형 ClickHouse Keeper에 적용됩니다.
검증 모드
<openSSL>의 <server> 또는 <client> 섹션에서 <verificationMode>를 설정합니다:
유효하지 않은 인증서 핸들러
<openSSL>의 <server> 또는 <client> 섹션 내에 <invalidCertificateHandler>를 설정합니다. 이 핸들러는 인증서 검증에 실패했을 때 어떻게 처리할지를 결정합니다. server 측에서는 유효하지 않은 클라이언트 인증서에 대한 응답을 제어합니다. client 측에서는 유효하지 않은 server 인증서에 대한 응답을 제어합니다.
예시: 인증서 검증 비활성화
verificationMode를 none으로 설정하고 AcceptCertificateHandler를 사용하십시오.
clickhouse-client에서는 --accept-invalid-certificate CLI 플래그를 사용할 수도 있으며, 이 경우 두 설정이 모두 자동으로 적용됩니다.
clickhouse-client (/etc/clickhouse-client/config.xml):
config.xml 또는 config.d/의 파일). 서버가 클라이언트의 인증서를 검증하지 않더라도 자체 인증서를 클라이언트에 제시해야 하므로, <server> 섹션에는 여전히 인증서와 개인 키 경로가 필요합니다: