TLS 지원(TLS support)
TLS 지원(TLS support)
Apache Druid는 임베디드 웹 서버로 Jetty를 사용하며, TLS를 활성화하면 클러스터 내외부 통신을 암호화할 수 있어요. 이 문서에서는 Druid의 TLS 관련 구성 속성들을 표로 설명드릴게요.
출처: 문서
본문
일반 구성
| Property | Description | Default |
|---|---|---|
druid.enablePlaintextPort |
HTTP 커넥터 활성화/비활성화. | true |
druid.enableTlsPort |
HTTPS 커넥터 활성화/비활성화. | false |
권장되지는 않지만, HTTP와 HTTPS 커넥터를 동시에 활성화할 수 있어요. 각 포트는 각 프로세스의 druid.plaintextPort와 druid.tlsPort 속성으로 설정할 수 있습니다. 이 포트들의 유효 값과 기본값을 확인하려면 각 프로세스의 Configuration 섹션을 참고하세요.
Jetty 서버 구성
Apache Druid는 임베디드 웹 서버로 Jetty를 사용합니다. TLS/SSL과 키, 인증서 같은 관련 개념에 익숙해지려면 Jetty 문서의 Configuring Secure Protocols를 읽어보세요. Java에서 TLS/SSL 지원에 대한 더 깊이 있는 지식은 Java Secure Socket Extension (JSSE) Reference Guide를 참고하세요. SslContextFactory 클래스 참조 문서는 아래 나열된 TLS/SSL 구성을 이해하는 데 도움이 됩니다. 마지막으로, JDK 17용 Java Cryptography Architecture Standard Algorithm Name Documentation은 아래 구성들의 가능한 모든 값(Java 구현이 제공하는 다른 값들 포함)을 나열합니다.
| Property | Description | Default | Required |
|---|---|---|---|
druid.server.https.keyStorePath |
TLS/SSL 키 저장소(Key store)의 파일 경로 또는 URL. | none | yes |
druid.server.https.keyStoreType |
키 저장소의 타입. | none | yes |
druid.server.https.certAlias |
커넥터용 TLS/SSL 인증서의 별칭(Alias). | none | yes |
druid.server.https.keyStorePassword |
키 저장소용 패스워드 프로바이더 또는 문자열 패스워드. | none | yes |
druid.server.https.reloadSslContext |
Druid 서버가 키 저장소 파일 변경을 감지하고 다시 로드할지 여부. | false | no |
druid.server.https.reloadSslContextSeconds |
Druid 서버가 키 저장소 파일 변경을 스캔하는 빈도. | 60 | yes |
druid.server.https.forceApplyConfig |
기존 SslContextFactory.Server 인스턴스가 바인딩되어 있어도 TLS 서버 구성을 적용할지 여부. |
false | no |
다음 표는 클라이언트 인증서 인증과 관련된 구성 옵션을 포함합니다.
| Property | Description | Default | Required |
|---|---|---|---|
druid.server.https.requireClientCertificate |
true로 설정하면 클라이언트는 TLS 인증서를 제공해 신원을 증명해야 하며, 없으면 연결이 실패합니다. | false | no |
druid.server.https.requestClientCertificate |
true로 설정하면 클라이언트는 TLS 인증서를 제공해 선택적으로 신원을 증명할 수 있습니다. TLS 인증서를 제공하지 않아도 연결은 실패하지 않아요. 이 속성은 requireClientCertificate가 true로 설정되면 무시됩니다. requireClientCertificate와 requestClientCertificate가 모두 false이면 이 표의 나머지 옵션들은 무시됩니다. |
false | no |
druid.server.https.trustStoreType |
클라이언트 인증서 검증에 사용되는 인증서를 포함하는 트러스트 저장소의 타입. requireClientCertificate와 requestClientCertificate가 false면 필요하지 않습니다. |
java.security.KeyStore.getDefaultType() |
no |
druid.server.https.trustStorePath |
클라이언트 인증서 검증에 사용되는 인증서를 포함하는 트러스트 저장소의 파일 경로 또는 URL. requireClientCertificate와 requestClientCertificate가 false면 필요하지 않습니다. |
none | yes, requireClientCertificate가 true일 때만 |
druid.server.https.trustStoreAlgorithm |
TrustManager가 클라이언트 인증서 체인을 검증하는 데 사용하는 알고리즘. requireClientCertificate와 requestClientCertificate가 false면 필요하지 않습니다. |
javax.net.ssl.TrustManagerFactory.getDefaultAlgorithm() |
no |
druid.server.https.trustStorePassword |
트러스트 저장소용 패스워드 프로바이더 또는 문자열 패스워드. requireClientCertificate와 requestClientCertificate가 false면 필요하지 않습니다. |
none | no |
druid.server.https.validateHostnames |
true로 설정하면 클라이언트의 호스트 이름이 클라이언트 인증서의 CN/subjectAltNames와 일치하는지 확인합니다. requireClientCertificate와 requestClientCertificate가 false면 사용되지 않습니다. |
true | no |
druid.server.https.crlPath |
클라이언트 인증서가 폐기되었는지 확인하는 데 사용되는 정적 인증서 폐기 목록(CRL)이 포함된 파일의 경로를 지정합니다. requireClientCertificate와 requestClientCertificate가 false면 사용되지 않습니다. |
null | no |
다음 표는 필수가 아닌 고급 구성 옵션을 포함하며, 주의해서 사용하세요.
| Property | Description | Default | Required |
|---|---|---|---|
druid.server.https.keyManagerFactoryAlgorithm |
KeyManager 생성에 사용할 알고리즘. 자세한 내용은 여기를 참조. | javax.net.ssl.KeyManagerFactory.getDefaultAlgorithm() |
no |
druid.server.https.keyManagerPassword |
Key Manager용 패스워드 프로바이더 또는 문자열 패스워드. | none | no |
druid.server.https.includeCipherSuites |
포함할 암호 스위트(cipher suite) 이름 목록. 정확한 암호 스위트 이름이나 정규 표현식을 사용할 수 있어요. | Jetty의 기본 포함 암호 목록 | no |
druid.server.https.excludeCipherSuites |
제외할 암호 스위트 이름 목록. 정확한 암호 스위트 이름이나 정규 표현식을 사용할 수 있어요. | Jetty의 기본 제외 암호 목록 | no |
druid.server.https.includeProtocols |
포함할 정확한 프로토콜 이름 목록. | Jetty의 기본 포함 프로토콜 목록 | no |
druid.server.https.excludeProtocols |
제외할 정확한 프로토콜 이름 목록. | Jetty의 기본 제외 프로토콜 목록 | no |
TLS를 통한 내부 통신
가능할 때마다 Druid 프로세스들은 서로 통신할 때 HTTPS를 사용합니다. 이 통신을 활성화하려면 Druid의 HttpClient가 서버 인증서를 검증할 수 있는 적절한 SSLContext로 구성되어야 하며, 그렇지 않으면 통신이 실패합니다. SSLContext를 구성하는 방법은 다양하기 때문에, 기본적으로 Druid는 HttpClient를 만들 때 SSLContext Guice 바인딩 인스턴스를 찾습니다. 이 바인딩은 SSLContext 인스턴스를 제공할 수 있는 Druid 확장을 작성해서 이뤄집니다. Druid에는 대부분의 단순한 경우에 충분히 유용한 간단한 확장이 함께 제공되며, 확장 포함 방법은 여기를 참고하세요. 이 확장이 요구 사항을 충족하지 못한다면 확장 구현을 따라 직접 확장을 만드세요.
Druid Coordinator/Overlord가 HTTP와 HTTPS를 모두 활성화한 상태에서 클라이언트가 리더(leader)가 아닌 프로세스에 요청을 보내면, 클라이언트는 항상 리더 프로세스의 HTTPS 엔드포인트로 리다이렉트됩니다. 따라서 먼저 HTTPS로의 리다이렉트를 처리할 수 있도록 클라이언트를 업그레이드해야 합니다. 그런 다음 Druid Overlord/Coordinator를 업그레이드하고 HTTP와 HTTPS 포트를 모두 실행하도록 구성합니다. 그 다음 클라이언트 구성을 HTTPS 엔드포인트를 통해 Druid Coordinator/Overlord를 참조하도록 변경하고, Druid Coordinator/Overlord의 HTTP 포트를 비활성화하면 됩니다.
커스텀 인증서 검사
Druid는 커스텀 인증서 검사(certificate check) 확장을 지원합니다. 구현할 메서드에 대한 자세한 내용은 org.apache.druid.server.security.TLSCertificateChecker 인터페이스를 참고하세요. 커스텀 TLS 인증서 검사기를 사용하려면 다음 속성을 지정하세요:
| Property | Description | Default | Required |
|---|---|---|---|
druid.tls.certificateChecker |
확장이 제공하는 커스텀 TLS 인증서 검사기의 타입 이름. 지정해야 할 타입 이름은 확장 문서를 참고하세요. | "default" | no |
기본 검사기는 표준 트러스트 매니저(trust manager)에 위임하며 추가 작업이나 검사를 수행하지 않습니다. 기본이 아닌 인증서 검사기를 사용한다면, 추가 구성 속성에 대한 확장 문서를 참고하세요.
더 알아보기 (Learn more)
- Security overview: Druid 보안 기능 개요와 TLS 활성화 절차.
- Simple SSLContext Provider Module: 클라이언트 측 TLS용 SSLContext 제공 확장.