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 제공 확장.