SSL 사용자 인증서로 인증 구성하기
SSL 사용자 인증서로 인증 구성하기 (Configuring SSL user certificate for authentication)
SSL 사용자 인증서로 인증을 구성하는 간단하고 최소한의 설정을 안내하는 가이드예요. Configuring TLS 사용자 가이드를 기반으로 진행합니다.
출처: 문서
본문
이 페이지는 ClickHouse Cloud에는 적용되지 않아요. 여기서 설명하는 기능은 ClickHouse Cloud 서비스에서는 사용할 수 없습니다.
ClickHouse Cloud Compatibility 가이드를 함께 참고해 주세요.
이 가이드는 SSL 사용자 인증서로 인증을 구성하기 위한 간단하고 최소한의 설정을 제공합니다. 튜토리얼은 Configuring TLS 사용자 가이드를 기반으로 합니다.
SSL 사용자 인증은 https, native, mysql, postgresql 인터페이스에서 지원됩니다. ClickHouse 노드는 보안 인증을 위해 <verificationMode>strict</verificationMode>로 설정되어야 합니다(테스트 목적으로는 relaxed도 동작하지만요). MySQL 인터페이스에서 AWS NLB를 사용한다면, AWS 지원팀에 문서화되지 않은 옵션을 활성화해 달라고 요청해야 합니다:
다음과 같이 NLB proxy protocol v2를 구성할 수 있게 해 주세요
proxy_protocol_v2.client_to_server.header_placement,Value=on_first_ack.
1
SSL 사용자 인증서 만들기
이 예시는 자체 서명 CA(self-signed CA)를 사용한 자체 서명 인증서를 사용합니다. 프로덕션 환경에서는 CSR을 생성해 PKI 팀이나 인증서 제공업체에 제출해 적절한 인증서를 받으세요.
-
인증서 서명 요청(CSR)과 키를 생성합니다. 기본 형식은 다음과 같습니다:
openssl req -newkey rsa:2048 -nodes -subj "/CN=<my_host>:<my_user>" -keyout <my_cert_name>.key -out <my_cert_name>.csr이 예시에서는 이 샘플 환경에 사용될 도메인과 사용자에 대해 다음을 사용합니다:
openssl req -newkey rsa:2048 -nodes -subj "/CN=chnode1.marsnet.local:cert_user" -keyout chnode1_cert_user.key -out chnode1_cert_user.csr
CN은 임의적이며 어떤 문자열이든 인증서의 식별자로 사용될 수 있습니다. 이 값은 다음 단계에서 사용자를 만들 때 사용됩니다.
-
인증에 사용될 새 사용자 인증서를 생성하고 서명합니다. 기본 형식은 다음과 같습니다:
openssl x509 -req -in <my_cert_name>.csr -out <my_cert_name>.crt -CA <my_ca_cert>.crt -CAkey <my_ca_cert>.key -days 365이 예시에서는 이 샘플 환경에 사용될 도메인과 사용자에 대해 다음을 사용합니다:
openssl x509 -req -in chnode1_cert_user.csr -out chnode1_cert_user.crt -CA marsnet_ca.crt -CAkey marsnet_ca.key -days 365
2
SQL 사용자를 만들고 권한을 부여하기
SQL 사용자 활성화와 역할 설정에 대한 자세한 내용은 Defining SQL Users and Roles 사용자 가이드를 참고하세요.
-
인증서 인증을 사용하도록 정의된 SQL 사용자를 만듭니다:
CREATE USER cert_user IDENTIFIED WITH ssl_certificate CN 'chnode1.marsnet.local:cert_user'; -
새 인증서 사용자에게 권한을 부여합니다:
GRANT ALL ON *.* TO cert_user WITH GRANT OPTION;
이 예시에서는 데모 목적으로 사용자에게 전체 관리 권한을 부여합니다. 권한 설정에 대해서는 ClickHouse RBAC 문서를 참고하세요.
사용자와 역할을 정의할 때는 SQL을 사용할 것을 권장합니다. 다만 현재 구성 파일에서 사용자와 역할을 정의하고 있다면 사용자는 다음과 같이 보일 것입니다:
<users>
<cert_user>
<ssl_certificates>
<common_name>chnode1.marsnet.local:cert_user</common_name>
</ssl_certificates>
<networks>
<ip>::/0</ip>
</networks>
<profile>default</profile>
<access_management>1</access_management>
{/* additional options*/}
</cert_user>
</users>
3
테스트하기
-
사용자 인증서, 사용자 키, CA 인증서를 원격 노드에 복사합니다.
-
ClickHouse 클라이언트 설정에서 OpenSSL을 인증서와 경로로 구성합니다.
<openSSL> <client> <certificateFile>my_cert_name.crt</certificateFile> <privateKeyFile>my_cert_name.key</privateKeyFile> <caConfig>my_ca_cert.crt</caConfig> </client> </openSSL> -
clickhouse-client를 실행합니다.clickhouse-client --user <my_user> --query 'SHOW TABLES'
설정에 인증서가 지정되면 clickhouse-client에 전달된 비밀번호는 무시된다는 점을 기억하세요.
4
HTTP 테스트하기
-
사용자 인증서, 사용자 키, CA 인증서를 원격 노드에 복사합니다.
-
curl로 샘플 SQL 명령을 테스트합니다. 기본 형식은 다음과 같습니다:echo 'SHOW TABLES' | curl 'https://<clickhouse_node>:8443' --cert <my_cert_name>.crt --key <my_cert_name>.key --cacert <my_ca_cert>.crt -H "X-ClickHouse-SSL-Certificate-Auth: on" -H "X-ClickHouse-User: <my_user>" --data-binary @-예를 들어:
echo 'SHOW TABLES' | curl 'https://chnode1:8443' --cert chnode1_cert_user.crt --key chnode1_cert_user.key --cacert marsnet_ca.crt -H "X-ClickHouse-SSL-Certificate-Auth: on" -H "X-ClickHouse-User: cert_user" --data-binary @-출력은 다음과 비슷할 것입니다:
INFORMATION_SCHEMA default information_schema system
비밀번호가 지정되지 않은 것을 주목하세요. 인증서가 비밀번호 대신 사용되며, 이렇게 해서 ClickHouse가 사용자를 인증하는 방식입니다.
요약 (Summary)
이 문서는 SSL 인증서 인증을 위한 사용자를 만들고 구성하는 기본적인 내용을 보여줍니다. 이 방법은 clickhouse-client나 https 인터페이스를 지원하고 HTTP 헤더를 설정할 수 있는 모든 클라이언트에서 사용할 수 있어요. 생성된 인증서와 키는 ClickHouse 데이터베이스에서 작업을 수행할 수 있도록 사용자를 인증하고 권한을 부여하는 데 사용되므로, 비공개로 유지하고 접근을 제한해야 합니다. 인증서와 키를 비밀번호처럼 취급하세요.