ACME를 통한 자동 TLS 프로비저닝 구성하기
ACME를 통한 자동 TLS 프로비저닝 구성하기 (Configuring automatic TLS provisioning via ACME)
ClickHouse가 ACME 프로토콜(RFC8555로 정의됨)을 사용하도록 구성하는 방법을 설명해요. ACME 지원으로 Let's Encrypt나 ZeroSSL 같은 제공업체에서 인증서를 자동으로 발급받고 갱신할 수 있습니다.
출처: 문서
본문
이 페이지는 ClickHouse Cloud에는 적용되지 않아요. 여기서 설명하는 절차는 ClickHouse Cloud 서비스에서 자동화되어 있습니다.
이 가이드는 ClickHouse가 ACME(RFC8555에서 정의) 프로토콜을 사용하도록 구성하는 방법을 설명합니다. ACME 지원으로 ClickHouse는 Let's Encrypt나 ZeroSSL 같은 제공업체에서 인증서를 자동으로 획득하고 갱신할 수 있어요.
TLS 암호화는 클라이언트와 ClickHouse 서버 사이의 전송 중 데이터를 보호해 민감한 쿼리와 결과에 대한 도청을 방지합니다.
개요 (Overview)
ACME 프로토콜은 Let's Encrypt나 ZeroSSL 같은 서비스와 함께 인증서 자동 갱신 과정을 정의합니다. 간단히 말해, 인증서를 요청하는 쪽인 ClickHouse는 인증서를 받기 위해 미리 정의된 챌린지 타입을 통해 도메인 소유권을 확인해야 합니다.
ACME를 활성화하려면 HTTP, HTTPS 포트와 함께 acme 블록을 구성합니다:
<http_port>80</http_port>
<https_port>443</https_port>
<acme>
<email>[email protected]</email>
<terms_of_service_agreed>true</terms_of_service_agreed>
<domains>
<domain>example.com</domain>
</domains>
</acme>
HTTP 포트는 도메인 검증 중에 ACME HTTP-01 챌린지(챌린지 타입에 대해 자세히) 요청을 처리합니다. 검증이 완료되고 인증서가 발급되면, HTTPS 포트는 획득한 인증서로 암호화된 트래픽을 제공합니다.
HTTP 포트가 서버 자체에서 80일 필요는 없습니다. nftables나 유사한 도구로 다시 매핑할 수 있어요. HTTP-01 챌린지에 허용되는 포트는 ACME 제공업체 문서를 확인하세요.
acme 블록에서 계정 생성을 위한 email을 정의하고, ACME 서비스의 서비스 약관을 수락합니다. 그 후 필요한 것은 도메인 목록뿐입니다.
현재 제한 사항 (Current limitations)
HTTP-01챌린지 타입만 지원됩니다.RSA 2048키만 지원됩니다.- 속도 제한(rate limiting)은 처리되지 않습니다.
구성 파라미터 (Configuration parameters)
acme 섹션에서 사용할 수 있는 구성 옵션:
| 파라미터 | 기본값 | 설명 |
|---|---|---|
zookeeper_path |
/clickhouse/acme |
ACME 계정 데이터, 인증서, ClickHouse 노드 간 조정 상태를 저장하는 데 사용되는 ZooKeeper 경로. |
directory_url |
https://acme-v02.api.letsencrypt.org/directory |
인증서 발급에 사용되는 ACME 디렉터리 엔드포인트. 기본값은 Let's Encrypt 프로덕션 서버. |
email |
ACME 계정을 만들고 관리하는 데 사용되는 이메일 주소. ACME 제공업체는 만료 알림과 중요 업데이트에 이를 사용할 수 있습니다. | |
terms_of_service_agreed |
false |
ACME 제공업체의 서비스 약관 수락 여부를 나타냅니다. ACME를 활성화하려면 true로 설정해야 합니다. |
domains |
TLS 인증서가 발급되어야 하는 도메인 이름 목록. 각 도메인은 <domain> 항목으로 지정됩니다. |
|
refresh_certificates_before |
2592000 (한 달, 초 단위) |
인증서 만료 전에 ClickHouse가 인증서 갱신을 시도할 시점. |
refresh_certificates_task_interval |
3600 (한 시간, 초 단위) |
ClickHouse가 인증서 갱신 필요 여부를 확인하는 간격. |
구성은 기본적으로 Let's Encrypt 프로덕션 디렉터리를 사용한다는 점을 기억하세요. 잘못된 구성으로 인한 요청 할당량 초과를 피하려면 먼저 staging 디렉터리로 인증서 발급 과정을 테스트하는 것이 좋습니다.
관리 (Administration)
초기 배포 (Initial deployment)
여러 복제본이 있는 클러스터에서 ACME 클라이언트를 활성화할 때는 초기 인증서 발급 동안 추가적인 주의가 필요합니다.
ACME가 활성화된 첫 번째 복제본이 시작하면 즉시 ACME 주문을 만들고 HTTP-01 챌린지 검증을 수행하려고 시도합니다. 그때 일부 복제본만 트래픽을 제공하고 있다면, 다른 복제본이 검증 요청에 응답하지 못하므로 챌린지가 실패할 가능성이 높습니다.
가능하다면 트래픽을 단일 복제본으로 일시적으로 라우팅하고(예: DNS 레코드 조정) 초기 인증서 발급을 완료하도록 하는 것이 좋습니다. 인증서가 성공적으로 발급되어 Keeper에 저장되면 나머지 복제본에서 ACME를 활성화할 수 있어요. 그들은 기존 인증서를 자동으로 재사용하고 향후 갱신에 참여합니다.
트래픽을 단일 복제본으로 라우팅하는 것이 불가능하다면, 대안으로 ACME 클라이언트를 활성화하기 전에 기존 인증서와 개인 키를 Keeper에 수동으로 업로드하는 방법이 있습니다. 이렇게 하면 초기 검증 단계를 피하고 모든 복제본이 유효한 인증서를 이미 가진 상태로 시작할 수 있습니다.
초기 인증서가 발급되거나 가져온 후에는 모든 복제본이 이미 ACME 클라이언트를 실행하고 Keeper를 통해 상태를 공유하므로 인증서 갱신에 특별한 처리가 필요하지 않습니다.
Keeper 데이터 구조 (Keeper data structure)
/clickhouse/acme
└── <acme-directory-host>
├── account_private_key # ACME account private key (PEM)
├── challenges # Active HTTP-01 challenge state
└── domains
└── <domain-name>
├── certificate # Issued TLS certificate (PEM)
└── private_key # Domain private key (PEM)
다른 ACME 클라이언트에서 마이그레이션 (Migrating from other ACME clients)
더 쉬운 마이그레이션을 위해 현재 TLS 인증서와 키를 Keeper로 옮기는 것이 가능합니다. 현재 서버는 RSA 2048 키만 지원합니다.
certbot에서 마이그레이션하고 /etc/letsencrypt/live 디렉터리를 사용한다고 가정하면, 다음 명령 세트를 사용할 수 있습니다:
DOMAIN=example.com
CERT_DIR=/etc/letsencrypt/live/$DOMAIN
ZK_BASE=/clickhouse/acme/acme-v02.api.letsencrypt.org/domains/$DOMAIN
clickhouse keeper-client -q "create '/clickhouse' ''"
clickhouse keeper-client -q "create '/clickhouse/acme' ''"
clickhouse keeper-client -q "create '/clickhouse/acme/acme-v02.api.letsencrypt.org' ''"
clickhouse keeper-client -q "create '/clickhouse/acme/acme-v02.api.letsencrypt.org/domains' ''"
clickhouse keeper-client -q "create '$ZK_BASE' ''"
clickhouse keeper-client -q "create '$ZK_BASE/certificate' \"$(cat $CERT_DIR/fullchain.pem)\""
clickhouse keeper-client -q "set '$ZK_BASE/certificate' \"$(cat $CERT_DIR/fullchain.pem)\""
clickhouse keeper-client -q "create '$ZK_BASE/private_key' \"$(cat $CERT_DIR/privkey.pem)\""
clickhouse keeper-client -q "set '$ZK_BASE/private_key' \"$(cat $CERT_DIR/privkey.pem)\""