Kerberos authentication

Kerberos authentication (Kerberos 인증)

Kerberos를 사용해 클라이언트를 인증하도록 Trino를 구성하는 방법이에요. Trino CLI나 JDBC·ODBC 드라이버 같은 클라이언트에 대해 HTTPS 기반 Kerberos 인증을 활성화할 수 있어요.

출처: 문서

본문

Trino는 Trino CLI나 JDBC·ODBC 드라이버 같은 클라이언트에 대해 HTTPS를 통한 Kerberos 인증을 활성화하도록 구성할 수 있어요.

Trino에서 Kerberos 인증을 활성화하려면 Kerberos 관련 구성 변경을 Trino 코디네이터에 하면 돼요.

Kerberos 인증에는 TLS 사용과 구성된 공유 시크릿(shared secret)이 필요해요.

환경 구성 (Environment configuration)

Kerberos 서비스 (Kerberos services)

Trino 코디네이터가 네트워크로 도달할 수 있는 노드에서 실행 중인 Kerberos KDC가 필요해요. KDC는 프린시펄(principal)을 인증하고 Kerberos 지원 서비스에서 사용할 수 있는 세션 키를 발급하는 역할을 해요. KDC는 보통 Kerberos용 IANA 지정 포트인 88번 포트에서 실행돼요.

MIT Kerberos 구성 (MIT Kerberos configuration)

Kerberos는 Trino 코디네이터에 구성되어야 해요. 최소한 /etc/krb5.conf 파일의 [realms] 섹션에 kdc 항목이 있어야 해요. admin_server 항목도 포함하고 Trino 코디네이터가 749번 포트의 Kerberos admin 서버에 도달할 수 있는지 확인하고 싶을 수 있어요.

[realms]
  TRINO.EXAMPLE.COM = {
    kdc = kdc.example.com
    admin_server = kdc.example.com
  }

[domain_realm]
  .trino.example.com = TRINO.EXAMPLE.COM
  trino.example.com = TRINO.EXAMPLE.COM

krb5.conf의 전체 문서는 MIT Kerberos Project가 호스팅해요. Kerberos 프로토콜의 다른 구현을 사용한다면 구성을 환경에 맞게 조정해야 해요.

Kerberos 프린시펄과 keytab 파일 (Kerberos principals and keytab files)

Trino 코디네이터는 Kerberos 프린시펄이 필요하며, Trino 코디네이터에 연결할 사용자도 필요해요. kadmin을 사용해 Kerberos에 이 사용자들을 만들어야 해요.

추가로 Trino 코디네이터는 keytab 파일이 필요해요. 프린시펄을 만든 뒤 kadmin으로 keytab 파일을 만들 수 있어요:

kadmin
> addprinc -randkey [email protected]
> addprinc -randkey trino/[email protected]
> ktadd -k /etc/trino/trino.keytab [email protected]
> ktadd -k /etc/trino/trino.keytab trino/[email protected]
Note

ktadd는 프린시펄의 키를 무작위화해요. 방금 프린시펄을 만들었다면 문제없어요. 프린시펄이 이미 존재하고 기존 사용자나 서비스가 비밀번호 또는 keytab으로 인증하는 데 의존한다면 ktadd-norandkey 옵션을 사용하세요.

TLS 구성 (Configuration for TLS)

Kerberos 인증을 사용할 때 Trino 코디네이터에 대한 접근은 TLS와 HTTPS를 통해서여야 해요.

시스템 접근 제어 플러그인 (System access control plugin)

Kerberos가 활성화된 Trino 코디네이터는 원하는 수준의 보안을 달성하기 위해 시스템 접근 제어 플러그인이 필요할 수 있어요.

Trino 코디네이터 노드 구성 (Trino coordinator node configuration)

Trino 코디네이터가 Kerberos 인증과 HTTPS를 사용하도록 구성하기 전에 위 환경 변경을 먼저 해야 해요. 환경 변경 후 Trino 구성 파일을 변경할 수 있어요.

  • TLS and HTTPS
  • Kerberos services
  • MIT Kerberos configuration
  • Kerberos principals and keytab files
  • System Access Control Plugin

config.properties

Kerberos 인증은 코디네이터 노드의 config.properties 파일에 구성돼요. 추가해야 할 항목은 아래에 나열돼 있어요.

http-server.authentication.type=KERBEROS

http-server.authentication.krb5.service-name=trino
http-server.authentication.krb5.principal-hostname=trino.example.com
http-server.authentication.krb5.keytab=/etc/trino/trino.keytab
http.authentication.krb5.config=/etc/krb5.conf

http-server.https.enabled=true
http-server.https.port=7778

http-server.https.keystore.path=/etc/trino/keystore.jks
http-server.https.keystore.key=keystore_password

node.internal-address-source=FQDN
Property Description
http-server.authentication.type Trino 코디네이터의 인증 타입. KERBEROS로 설정해야 해요.
http-server.authentication.krb5.service-name Trino 코디네이터의 Kerberos 서비스 이름. Kerberos 프린시펄과 일치해야 해요.
http-server.authentication.krb5.principal-hostname Trino 코디네이터의 Kerberos 호스트 이름. Kerberos 프린시펄과 일치해야 해요. 이 파라미터는 선택적이에요. 포함하면 Trino는 Kerberos 프린시펄의 호스트 부분에 머신의 호스트 이름 대신 이 값을 사용해요.
http-server.authentication.krb5.keytab Kerberos 프린시펄을 인증하는 데 사용할 수 있는 keytab의 위치.
http.authentication.krb5.config Kerberos 구성 파일의 위치.
http-server.https.enabled Trino 코디네이터의 HTTPS 접근을 활성화. true로 설정해야 해요.
http-server.https.port HTTPS 서버 포트.
http-server.https.keystore.path TLS를 보호하는 데 사용하는 Java Keystore 파일의 위치.
http-server.https.keystore.key keystore의 비밀번호. keystore 생성 시 지정한 비밀번호와 일치해야 해요.
http-server.authentication.krb5.user-mapping.pattern 사용자와 대조할 정규식. 일치하면 사용자가 첫 번째 정규식 그룹으로 대체되고, 일치하지 않으면 인증이 거부돼요. 기본값은 (.*).
http-server.authentication.krb5.user-mapping.file 사용자 매핑 규칙을 담은 파일. 자세한 내용은 User mapping 참고.
node.internal-address-source Kerberos는 보통 DNS 이름에 민감해요. 이 속성을 FQDN으로 설정하면 올바른 동작과 유효한 DNS 호스트 이름 사용을 보장해요.

지원되는 TLS 버전과 암호화 스위트에 대한 논의는 Standards supported를 참고하세요.

access-control.properties

최소한 access-control.properties 파일에는 access-control.name 속성이 포함되어야 해요. 다른 모든 구성은 구성 중인 구현에 따라 달라져요. 자세한 내용은 System access control을 참고하세요.

사용자 매핑 (User mapping)

Kerberos로 인증한 후 Trino 서버는 보통 이메일 주소와 비슷한 사용자의 프린시펄을 받아요. 예를 들어 alice가 로그인하면 Trino는 [email protected]를 받을 수 있어요. 기본적으로 Trino는 전체 Kerberos 프린시펄 이름을 사용하지만, 사용자 매핑 패턴으로 더 짧은 이름에 매핑할 수 있어요. 간단한 매핑 규칙의 경우 http-server.authentication.krb5.user-mapping.pattern 구성 속성을 Java 정규식으로 설정할 수 있고, Trino는 첫 번째 매처 그룹의 값을 사용해요. 정규식이 일치하지 않으면 인증이 거부돼요. 더 복잡한 사용자 매핑 규칙은 User mapping을 참고하세요.

문제 해결 (Troubleshooting)

Kerberos 인증을 동작시키는 것은 어려울 수 있어요. Trino 밖에서 구성 중 일부를 독립적으로 검증하면 문제를 해결할 때 집중 범위를 좁히는 데 도움이 돼요.

Kerberos 검증 (Kerberos verification)

telnet을 사용해 Trino 코디네이터에서 KDC에 연결할 수 있는지 확인하세요:

$ telnet kdc.example.com 88

kinitklist를 사용해 keytab 파일로 티켓을 성공적으로 얻을 수 있는지 확인하세요:

$ kinit -kt /etc/trino/trino.keytab [email protected]
$ klist

Java keystore 파일 검증 (Java keystore file verification)

keystore 파일의 비밀번호를 검증하고 내용을 보려면 Inspect and validate keystore를 사용하세요.

추가 Kerberos 디버깅 정보 (Additional Kerberos debugging information)

Trino jvm.config 파일에 다음 줄을 추가해 Trino 코디네이터 프로세스에 대한 추가 Kerberos 디버깅 정보를 활성화할 수 있어요:

-Dsun.security.krb5.debug=true
-Dlog.enable-console=true

-Dsun.security.krb5.debug=true는 JRE Kerberos 라이브러리의 Kerberos 디버깅 출력을 활성화해요. 디버깅 출력은 stdout으로 가고, Trino는 이를 로깅 시스템으로 리다이렉트해요. -Dlog.enable-console=true는 stdout으로의 출력이 로그에 나타나게 해요.

Kerberos 디버깅 출력이 로그에 보내는 정보의 양과 유용성은 인증이 실패하는 위치에 따라 달라져요. 예외 메시지와 스택 트레이스는 문제의 성격에 대한 유용한 단서를 제공할 수 있어요.

-Djava.security.debug 플래그에 대한 자세한 내용은 Java 문서의 Troubleshooting Security를, Java GSS-API와 Kerberos 이슈에 대한 자세한 내용은 Troubleshooting을 참고하세요.

추가 리소스 (Additional resources)

  • Common Kerberos Error Messages (A-M)
  • Common Kerberos Error Messages (N-Z)
  • MIT Kerberos Documentation: Troubleshooting

더 알아보기 (Learn more)

Kerberos는 사용자 이름이 복잡한 편이라 User mapping을 함께 설정하는 경우가 많아요. TLS 기반 구성은 TLS and HTTPS를 참고해 보세요.