LDAP authentication
LDAP authentication (LDAP 인증)
외부 LDAP 서비스로 사용자 이름과 비밀번호를 검증해 클라이언트를 인증하도록 Trino를 구성하는 방법이에요. 현재는 사용자 이름·비밀번호를 이용한 단순 LDAP 인증 메커니즘만 지원돼요.
출처: 문서
본문
Trino는 Trino CLI나 JDBC·ODBC 드라이버 같은 클라이언트에 대해 HTTPS를 통한 프런트엔드 LDAP 인증을 활성화하도록 구성할 수 있어요. 현재는 사용자 이름과 비밀번호를 포함하는 단순 LDAP 인증 메커니즘만 지원돼요. Trino 클라이언트가 코디네이터에 사용자 이름과 비밀번호를 보내고, 코디네이터는 외부 LDAP 서비스를 사용해 이 자격 증명을 검증해요.
Trino에서 LDAP 인증을 활성화하려면 LDAP 관련 구성 변경을 Trino 코디네이터에 하면 돼요.
LDAP 인증에는 TLS 사용과 구성된 공유 시크릿(shared secret)이 필요해요.
Trino 서버 구성 (Trino server configuration)
Trino 코디네이터 노드 구성 (Trino coordinator node configuration)
Trino 코디네이터에 대한 접근은 TLS and HTTPS에 설명된 대로 구성된 HTTPS를 통해서여야 해요.
Trino 구성 파일도 변경해야 해요. LDAP 인증은 코디네이터에서 두 부분으로 구성돼요. 첫 번째는 코디네이터의 config.properties 파일에서 HTTPS 지원과 비밀번호 인증을 활성화하는 것이에요. 두 번째는 LDAP를 비밀번호 인증기 플러그인으로 구성하는 것이에요.
서버 구성 속성 (Server config properties)
다음은 코디네이터의 config.properties 파일에 추가해야 하는 필수 속성의 예시예요:
http-server.authentication.type=PASSWORD
http-server.https.enabled=true
http-server.https.port=8443
http-server.https.keystore.path=/etc/trino/keystore.jks
http-server.https.keystore.key=keystore_password
사용 가능한 속성에 대한 자세한 설명은 HTTP server properties와 다음 표에서 확인할 수 있어요:
| Property | Description |
|---|---|
http-server.authentication.password.user-mapping.pattern |
사용자와 대조할 정규식. 일치하면 사용자가 첫 번째 정규식 그룹으로 대체되고, 일치하지 않으면 인증이 거부돼요. 기본값은 (.*). |
http-server.authentication.password.user-mapping.file |
사용자 매핑 규칙을 담은 파일. 자세한 내용은 User mapping 참고. |
비밀번호 인증기 구성 (Password authenticator configuration)
비밀번호 인증이 LDAP을 사용하도록 구성되어야 해요. 코디네이터에 etc/password-authenticator.properties 파일을 만드세요. 예:
password-authenticator.name=ldap
ldap.url=ldaps://ldap-server:636
ldap.ssl.truststore.path=/path/to/ldap_server.pem
ldap.user-bind-pattern=<pattern>
| Property | Description |
|---|---|
ldap.url |
LDAP 서버의 URL. URL 스킴은 ldap:// 또는 ldaps://이어야 해요. TLS가 활성화되지 않은 LDAP 서버에 연결하려면 ldap.allow-insecure=true가 필요해요. |
ldap.allow-insecure |
TLS로 보호되지 않은 LDAP 연결 사용 허용. |
ldap.ssl.keystore.path |
PEM 또는 JKS keystore 파일 경로. |
ldap.ssl.keystore.password |
키 저장소 비밀번호. |
ldap.ssl.truststore.path |
PEM 또는 JKS truststore 파일 경로. |
ldap.ssl.truststore.password |
트러스트 저장소 비밀번호. |
ldap.user-bind-pattern |
비밀번호 인증을 위한 LDAP 사용자 바인드 문자열을 지정하는 속성. 이 속성은 비밀번호 인증 중 실제 사용자 이름으로 대체되는 ${USER} 패턴을 포함해야 해요. 콜론으로 구분된 여러 패턴을 포함할 수 있어요. 로그인이 성공하거나 모두 실패할 때까지 각 패턴을 순서대로 확인해요. 예: ${USER}@corp.example.com:${USER}@corp.example.co.uk |
ldap.ignore-referrals |
검색 쿼리 수행 시 다른 LDAP 서버로의 referrals 무시. 기본값은 false. |
ldap.cache-ttl |
LDAP 캐시 기간. 기본값은 1h. |
ldap.timeout.connect |
LDAP 연결 수립 시간 제한. 기본값은 1m. |
ldap.timeout.read |
LDAP 연결에서 데이터를 읽는 시간 제한. 기본값은 1m. |
LDAP 서버 구현 유형에 따라 ldap.user-bind-pattern 속성을 아래처럼 사용할 수 있어요.
Active Directory
ldap.user-bind-pattern=${USER}@<domain>
예:
ldap.user-bind-pattern=${USER}@corp.example.com
OpenLDAP
ldap.user-bind-pattern=uid=${USER},<base-dn>
예:
ldap.user-bind-pattern=uid=${USER},OU=America,DC=corp,DC=example,DC=com
LDAP 그룹 멤버십 기반 인가 (Authorization based on LDAP group membership)
기본 LDAP 인증 속성에 선택적인 ldap.group-auth-pattern과 ldap.user-base-dn 속성을 추가하면 그룹 멤버십을 기준으로 Trino 코디네이터에 연결할 수 있는 사용자 집합을 더 제한할 수 있어요.
| Property | Description |
|---|---|
ldap.user-base-dn |
서버에 연결하려는 사용자의 기본 LDAP distinguished name. 예: OU=America,DC=corp,DC=example,DC=com |
ldap.group-auth-pattern |
LDAP 그룹 멤버십 인가를 위한 LDAP 쿼리를 지정하는 속성. 이 쿼리는 LDAP 서버에 대해 실행되며 성공하면 사용자가 인가돼요. 이 속성은 그룹 인가 검색 쿼리에서 실제 사용자 이름으로 대체되는 ${USER} 패턴을 포함해야 해요. 예시 섹션에서 자세히 확인하세요. |
Trino LDAP 서비스 사용자를 사용한 인가 (Authorization using Trino LDAP service user)
Trino 서버는 사용자 그룹 멤버십 쿼리에 전용 LDAP 서비스 사용자를 사용할 수 있어요. 이 경우 Trino는 먼저 인증해야 할 Trino 사용자에 대한 그룹 멤버십 쿼리를 실행해요. 그룹 멤버십 쿼리 결과에서 사용자 distinguished name을 추출해요. 그런 다음 Trino는 사용자 distinguished name과 사용자 비밀번호로 LDAP 컨텍스트를 만들어 사용자 비밀번호를 검증해요. 이 메커니즘을 사용하려면 ldap.bind-dn, ldap.bind-password, ldap.group-auth-pattern 속성을 정의해야 해요.
| Property | Description |
|---|---|
ldap.bind-dn |
Trino가 그룹 멤버십 쿼리를 실행할 때 사용하는 바인드 distinguished name. 예: CN=admin,OU=CITY_OU,OU=STATE_OU,DC=domain |
ldap.bind-password |
Trino가 그룹 멤버십 쿼리를 실행할 때 사용하는 바인드 비밀번호. 예: password1234 |
ldap.group-auth-pattern |
LDAP 그룹 멤버십 인가를 위한 LDAP 쿼리를 지정하는 속성. 이 쿼리는 로그인 중 LDAP 서버에 대해 실행되어 사용자가 지정한 그룹에 속하는지 확인해요. 성공하면 쿼리 결과에서 사용자 distinguished name을 추출해요. Trino는 사용자의 distinguished name과 비밀번호로 LDAP 컨텍스트를 만들어 사용자와 비밀번호를 검증해요. 이 속성은 그룹 인가 검색 쿼리에서 실제 사용자 이름으로 대체되는 ${USER} 패턴을 포함해야 해요. 예시 섹션에서 자세히 확인하세요. |
LDAP 그룹 인가 예시 (LDAP group authorization examples)
Active Directory에서는 다음 구문을 사용할 수 있어요:
ldap.group-auth-pattern=(&(objectClass=<objectClass>)(sAMAccountName=${USER})(memberof=<group>))
예:
ldap.group-auth-pattern=(&(objectClass=person)(sAMAccountName=${USER})(memberof=CN=AuthorizedGroup,OU=Asia,DC=corp,DC=example,DC=com))
OpenLDAP에서는 다음 구문을 사용할 수 있어요:
ldap.group-auth-pattern=(&(objectClass=<objectClass>)(uid=${USER})(memberof=<group>))
예:
ldap.group-auth-pattern=(&(objectClass=inetOrgPerson)(uid=${USER})(memberof=CN=AuthorizedGroup,OU=Asia,DC=corp,DC=example,DC=com))
OpenLDAP에서 이 쿼리가 동작하려면 memberOf overlay를 활성화해야 해요.
복잡한 그룹 인가 검색 쿼리를 기반으로 사용자를 인가하려는 시나리오에 이 속성을 사용할 수 있어요. 예를 들어 (OpenLDAP에서) 여러 그룹 중 하나에 속한 사용자를 인가하려면 이 속성을 다음과 같이 설정할 수 있어요:
ldap.group-auth-pattern=(&(|(memberOf=CN=normal_group,DC=corp,DC=com)(memberOf=CN=another_group,DC=com))(objectClass=inetOrgPerson)(uid=${USER}))
Trino CLI
환경 구성 (Environment configuration)
TLS 구성 (TLS configuration)
LDAP 인증을 사용할 때 Trino 코디네이터에 대한 접근은 TLS/HTTPS를 통해서여야 해요.
Trino CLI 실행 (Trino CLI execution)
LDAP 인증이 필요하지 않은 Trino 코디네이터에 연결할 때 필요한 옵션에 더해, LDAP 지원이 활성화된 CLI를 실행하려면 몇 가지 추가 명령줄 옵션이 필요해요. --keystore-* 또는 --truststore-* 속성을 사용해 TLS 연결을 보호할 수 있어요. CLI를 호출하는 가장 간단한 방법은 래퍼 스크립트를 사용하는 것이에요.
#!/bin/bash
./trino \
--server https://trino-coordinator.example.com:8443 \
--keystore-path /tmp/trino.jks \
--keystore-password password \
--truststore-path /tmp/trino_truststore.jks \
--truststore-password password \
--catalog <catalog> \
--schema <schema> \
--user <user> \
--password
TLS/HTTPS와 Username and password authentication에서 사용된 옵션에 대한 자세한 내용을 확인할 수 있어요.
문제 해결 (Troubleshooting)
Java keystore 파일 검증 (Java keystore file verification)
keystore 파일의 비밀번호를 검증하고 내용을 보려면 Inspect and validate keystore를 사용하세요.
Trino-LDAP 서버 이슈 디버깅 (Debug Trino to LDAP server issues)
Trino가 LDAP 서버와 통신하는 데 문제가 있다면 LDAP 인증기의 로그 수준을 변경할 수 있어요:
io.trino.plugin.password=DEBUG
Trino CLI용 TLS 디버깅 (TLS debugging for Trino CLI)
Trino CLI를 실행할 때 TLS 관련 오류가 발생하면 -Djavax.net.debug=ssl 파라미터로 CLI를 실행해 디버깅할 수 있어요. Trino CLI 실행 가능 JAR를 사용해 이 기능을 활성화하세요. 예:
java -Djavax.net.debug=ssl \
-jar \
trino-cli-<version>-executable.jar \
--server https://coordinator:8443 \
일반적인 TLS/SSL 오류 (Common TLS/SSL errors)
java.security.cert.CertificateException: No subject alternative names present
이 오류는 Trino 코디네이터의 인증서가 유효하지 않고 CLI의 --server 인자에 제공한 IP를 가지지 못할 때 나타나요. 적절한 SAN을 추가해 코디네이터의 TLS 인증서를 다시 생성해야 해요.
URL에서 코디네이터 인증서에 들어 있는 도메인 대신 IP 주소를 사용하는 https://인 경우, 그리고 인증서에 일치하는 IP 주소를 대체 속성으로 가진 SAN 파라미터가 없으면 이 인증서에 SAN을 추가해야 해요.
JDK 업그레이드 시 인증 또는 TLS 오류 (Authentication or TLS errors with JDK upgrade)
JDK 8u181 릴리스부터 LDAPS(보안 LDAP over TLS) 연결의 견고성을 높이기 위해 엔드포인트 식별 알고리즘이 기본으로 활성화됐어요. Oracle의 릴리스 노트를 참고하세요. JDK 버전 ≥ 8u181에서 실행되는 Trino 코디네이터의 같은 LDAP 서버 인증서가, 이전에는 LDAPS 서버에 성공적으로 연결할 수 있었는데, 이제 다음 오류로 실패할 수 있어요:
javax.naming.CommunicationException: simple bind failed: ldapserver:636
[Root exception is javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No subject alternative DNS name matching ldapserver found.]
엔드포인트 식별을 임시로 비활성화하려면 Trino의 jvm.config 파일에 -Dcom.sun.jndi.ldap.object.disableEndpointIdentification=true 속성을 추가할 수 있어요. 하지만 프로덕션 환경에서는 인증서 SAN 또는 인증서 주체 이름이 LDAP 서버와 일치하도록 LDAP 서버 인증서를 다시 생성해 문제를 고치는 것을 권장해요.
더 알아보기 (Learn more)
LDAP 인증도 비밀번호 기반이라 Password file authentication과 기본 원리는 비슷해요. TLS 구성은 TLS and HTTPS를 참고해 보세요.