LDAP 인증 구성
LDAP 인증 구성 (Configure LDAP authentication)
Lightweight Directory Access Protocol(LDAP)을 사용해 Apache Druid에 대한 접근을 보호하는 방법을 설명하는 문서예요. 인증·권한 설정, LDAP 그룹을 Druid 역할로 매핑, 그리고 TLS를 통한 LDAP(LDAPS) 활성화까지 다루어요.
출처: 문서
본문
Lightweight Directory Access Protocol(LDAP)을 사용해 Apache Druid에 대한 접근을 보호할 수 있어요. 이 문서는 LDAP와 LDAP over TLS(LDAPS)로 Druid 인증 및 권한 부여를 설정하는 방법을 설명해요. 이 페이지의 예시는 Active Directory LDAP 시스템에 대한 구성을 보여줘요.
첫 단계는 Druid에 대한 LDAP 인증과 권한 부여를 활성화하는 것이에요. 그런 다음 LDAP 그룹을 Druid 역할에 매핑하고 그 역할에 권한을 할당해요. 이 구성을 완료한 후 선택적으로 LDAPS를 활성화해 LDAP 트래픽을 기밀로 안전하게 만들 수 있어요.
전제 조건 (Prerequisites)
Druid용 LDAP 구성을 시작하기 전에 LDAP 연결을 테스트하고 샘플 검색을 수행하세요.
LDAP 연결 확인 (Check your LDAP connection)
사용자 자격 증명으로 LDAP 연결이 동작하는지 테스트하세요. 나중에 이 사용자를 bindUser로 하여 Druid를 LDAP 인증용으로 구성하게 돼요.
다음 예시 명령은 사용자 [email protected]에 대한 연결을 테스트해요. LDAP 서버 IP 주소를 넣고, LDAP 인스턴스가 389가 아닌 포트에서 수신한다면 포트 번호를 수정하세요.
ldapwhoami -vv -H ldap://ip_address:389 -D "[email protected]" -W
프롬프트가 뜨면 사용자 비밀번호를 입력하고 명령이 성공했는지 확인하세요. 실패했다면 다음을 확인해 보세요.
- LDAP 인스턴스에 올바른 포트를 사용하고 있는지 확인하세요.
- 네트워크 방화벽이 LDAP 포트로의 연결을 막고 있지 않은지 확인하세요.
- LDAP 구현 세부 사항을 검토해 LDAP 서버에서 LDAP 클라이언트를 특별히 허용해야 하는지 확인하세요. 그렇다면 Druid Coordinator 서버를 허용 목록에 추가하세요.
LDAP 검색 테스트 (Test your LDAP search)
LDAP 연결이 동작하면 사용자를 검색하세요. 예를 들어 다음 명령은 Active Directory 시스템에서 사용자 myuser를 검색해요. sAMAccountName 속성은 Active Directory에 특화된 속성으로, 인증된 사용자 신원을 담고 있어요.
ldapsearch -x -W -H ldap://ip_address:389 -D "cn=admin,dc=example,dc=com" -b "dc=example,dc=com" "(sAMAccountName=myuser)" +
결과의 memberOf 속성은 사용자가 속한 그룹을 보여줘요. 예를 들어 다음 응답은 사용자가 mygroup 그룹의 구성원임을 보여줘요.
memberOf: cn=mygroup,ou=groups,dc=example,dc=com
이 정보를 사용해 나중 단계에서 LDAP 그룹을 Druid 역할에 매핑해요.
info: Druid는
memberOf속성을 사용해 LDAP로 그룹 구성원을 결정해요. LDAP 서버 구현에 이 속성이 포함되어 있지 않다면, LDAP 그룹을 Druid 역할로 매핑할 때 몇 가지 추가 단계를 완료해야 해요.
Druid를 LDAP 인증용으로 구성 (Configure Druid for LDAP authentication)
Druid가 LDAP 인증을 사용하도록 구성하려면 다음 단계를 따르세요. 구성 파일의 위치는 Configuration reference 문서를 참고하세요.
- LDAP 시스템에 내부 통신용이자 LDAP 초기 관리자 사용자로 사용할 사용자를 만드세요. 보안 개요 문서에서 자세한 내용을 확인할 수 있어요. 아래 예시에서 LDAP 사용자는
[email protected]이에요. common.runtime.properties파일에서druid-basic-security익스텐션을 활성화하세요.common.runtime.properties파일에 LDAP 프로퍼티용 다음 줄을 추가하고 값을 자신의 것으로 바꾸세요. 이 프로퍼티에 대한 자세한 내용은 Druid basic security 문서를 참고하세요.
druid.auth.authenticatorChain=["ldap"]
druid.auth.authenticator.ldap.type=basic
druid.auth.authenticator.ldap.enableCacheNotifications=true
druid.auth.authenticator.ldap.credentialsValidator.type=ldap
druid.auth.authenticator.ldap.credentialsValidator.url=ldap://ip_address:port
druid.auth.authenticator.ldap.credentialsValidator.bindUser=administrator@example.com
druid.auth.authenticator.ldap.credentialsValidator.bindPassword=adminpassword
druid.auth.authenticator.ldap.credentialsValidator.baseDn=dc=example,dc=com
druid.auth.authenticator.ldap.credentialsValidator.userSearch=(&(sAMAccountName=%s)(objectClass=user))
druid.auth.authenticator.ldap.credentialsValidator.userAttribute=sAMAccountName
druid.auth.authenticator.ldap.authorizerName=ldapauth
druid.escalator.type=basic
[email protected]
druid.escalator.internalClientPassword=internaluserpassword
druid.escalator.authorizerName=ldapauth
druid.auth.authorizers=["ldapauth"]
druid.auth.authorizer.ldapauth.type=basic
druid.auth.authorizer.ldapauth.initialAdminUser=internal@example.com
druid.auth.authorizer.ldapauth.initialAdminRole=admin
druid.auth.authorizer.ldapauth.roleProvider.type=ldap
다음을 참고하세요.
bindUser: LDAP에 연결하기 위한 사용자. LDAP 검색을 테스트할 때 사용한 것과 같은 사용자여야 해요.userSearch: LDAP 검색 구문.userAttribute: 사용자 검색 속성.[email protected]은 1단계에서 만든 LDAP 사용자예요. 예시에서 내부 클라이언트 사용자와 초기 관리자 사용자 역할을 겸해요.
info: 위 예시에서 Druid escalator와 LDAP 초기 관리자 사용자는 같은 사용자(
[email protected])로 설정되어 있어요. escalator가 다른 사용자로 설정되어 있다면, 나머지 클러스터가 동작하기 전에 4단계와 5단계를 따라 그룹 매핑을 만들고 초기 역할을 할당해야 해요.
- 그룹 매핑을 JSON 파일로 저장하세요. 예시 파일
groupmap.json은 다음과 같아요.
{
"name": "mygroupmap",
"groupPattern": "CN=mygroup,CN=Users,DC=example,DC=com",
"roles": [
"readRole"
]
}
예시에서 LDAP 그룹 mygroup은 Druid 역할 readRole에 매핑되고, 매핑 이름은 mygroupmap이에요.
- Druid API를 사용해 JSON 파일에 따라 그룹 매핑을 만들고 초기 역할을 할당하세요. 다음 예시는 curl을 사용해
groupmap.json에 정의된 매핑을 LDAP 그룹mygroup에 대해 생성해요.
curl -i -v -H "Content-Type: application/json" -u internal -X POST -d @groupmap.json http://localhost:8081/druid-ext/basic-security/authorization/db/ldapauth/groupMappings/mygroupmap
- 그룹 매핑이 성공적으로 생성되었는지 확인하세요. 다음 요청은 모든 그룹 매핑을 나열해요.
curl -i -v -H "Content-Type: application/json" -u internal -X GET http://localhost:8081/druid-ext/basic-security/authorization/db/ldapauth/groupMappings
LDAP 그룹을 Druid 역할로 매핑 (Map LDAP groups to Druid roles)
초기 설정과 매핑을 완료하면 더 많은 LDAP 그룹을 Druid 역할에 매핑할 수 있어요. LDAP 그룹의 구성원은 그에 대응하는 Druid 역할의 권한에 접근할 수 있어요.
Druid 역할 생성 (Create a Druid role)
Druid 역할을 만들려면 Druid REST API를 사용해 Coordinator 프로세스에 POST 요청을 보내거나 Druid 콘솔을 사용할 수 있어요.
아래 예시는 Coordinator 호스트로 localhost, 포트로 8081을 사용해요. 배포 세부 사항에 따라 이 값을 수정하세요.
readRole이라는 역할을 생성하는 요청 예시:
curl -i -v -H "Content-Type: application/json" -u internal -X POST http://localhost:8081/druid-ext/basic-security/authorization/db/ldapauth/roles/readRole
Druid가 역할을 성공적으로 생성했는지 확인하세요. 모든 역할을 나열하는 요청 예시:
curl -i -v -H "Content-Type: application/json" -u internal -X GET http://localhost:8081/druid-ext/basic-security/authorization/db/ldapauth/roles
Druid 역할에 권한 추가 (Add permissions to the Druid role)
Druid 역할이 있으면 권한을 추가할 수 있어요. 다음 예시는 wikipedia 데이터 소스에 읽기 전용 접근을 추가해요.
perm.json이라는 파일에 다음 JSON이 있다고 해 보아요.
[
{ "resource": { "name": "wikipedia", "type": "DATASOURCE" }, "action": "READ" },
{ "resource": { "name": ".*", "type": "STATE" }, "action": "READ" },
{ "resource": {"name": ".*", "type": "CONFIG"}, "action": "READ"}
]
다음 요청은 JSON 파일의 권한을 readRole 역할과 연결해요.
curl -i -v -H "Content-Type: application/json" -u internal -X POST [email protected] http://localhost:8081/druid-ext/basic-security/authorization/db/ldapauth/roles/readRole/permissions
Druid 사용자는 Druid 콘솔에서 데이터 소스를 보려면 STATE와 CONFIG 권한이 필요해요. 쿼리 권한만 할당하려면 perm.json 파일의 첫 줄만으로 READ 권한을 적용할 수 있어요.
데이터 소스 이름을 정규 표현식 형태로도 제공할 수 있어요. 예를 들어 wiki로 시작하는 모든 데이터 소스에 접근을 주려면 데이터 소스 이름을 { "name": "wiki.*" }로 지정하면 돼요.
그룹 매핑 생성 (Create the group mapping)
이제 LDAP 그룹을 Druid 역할에 매핑할 수 있어요. 다음 요청 예시는 이름이 mygroupmap인 매핑을 생성해요. 디렉터리에 mygroup이라는 그룹이 존재한다고 가정해요.
{
"name": "mygroupmap",
"groupPattern": "CN=mygroup,CN=Users,DC=example,DC=com",
"roles": [
"readRole"
]
}
다음 요청 예시는 매핑을 구성해요. 역할 매핑은 groupmap.json 파일에 있고, 예시 파일의 내용은 Druid를 LDAP 인증용으로 구성하는 문서를 참고하세요.
curl -i -v -H "Content-Type: application/json" -u internal -X POST -d @groupmap.json http://localhost:8081/druid-ext/basic-security/authorization/db/ldapauth/groupMappings/mygroupmap
그룹 매핑이 성공적으로 생성되었는지 확인하기 위해 다음 요청이 모든 그룹 매핑을 나열해요.
curl -i -v -H "Content-Type: application/json" -u internal -X GET http://localhost:8081/druid-ext/basic-security/authorization/db/ldapauth/groupMappings
다음 요청 예시는 mygroupmap 그룹의 세부 정보를 반환해요.
curl -i -v -H "Content-Type: application/json" -u internal -X GET http://localhost:8081/druid-ext/basic-security/authorization/db/ldapauth/groupMappings/mygroupmap
다음 요청 예시는 mygroupmap 매핑에 queryRole 역할을 추가해요.
curl -i -v -H "Content-Type: application/json" -u internal -X POST http://localhost:8081/druid-ext/basic-security/authorization/db/ldapauth/groupMappings/mygroup/roles/queryrole
LDAP 사용자를 Druid에 추가하고 역할 할당 (Add an LDAP user to Druid and assign a role)
이 단계는 다음 경우에만 완료하면 돼요.
- LDAP 사용자가 어떤 LDAP 그룹에도 속하지 않은 경우, 또는
- 사용자가 속한 LDAP 그룹에 매핑되지 않은 추가 Druid 역할로 사용자를 구성하려는 경우.
LDAP 사용자 myuser를 Druid에 추가하는 요청 예시:
curl -i -v -H "Content-Type: application/json" -u internal -X POST http://localhost:8081/druid-ext/basic-security/authorization/db/ldapauth/users/myuser
myuser 사용자를 queryRole 역할에 할당하는 요청 예시:
curl -i -v -H "Content-Type: application/json" -u internal -X POST http://localhost:8081/druid-ext/basic-security/authorization/db/ldapauth/users/myuser/roles/queryRole
TLS를 통한 LDAP(LDAPS) 활성화 (Enable LDAP over TLS (LDAPS))
Druid에서 LDAP 인증을 구성한 후, TLS(이전의 SSL) 기술을 사용해 LDAP 트래픽을 기밀로 안전하게 만들 수 있어요.
LDAPS를 구성하면 Druid와 LDAP 서버 사이에 신뢰가 확립돼요.
전제 조건 (Prerequisites)
Druid에서 LDAPS를 설정하기 전에 Druid를 LDAP 인증용으로 구성해야 해요. 또한 다음이 필요해요.
- 공개 인증 기관(CA)이 발급한 인증서 또는 내부 CA가 발급한 자체 서명 인증서.
- LDAP 서버의 인증서에 서명한 CA의 루트 인증서. 일반적인 공개 CA를 사용한다면 인증서가 이미 Java 트러스트스토어에 있을 수 있어요. 그렇지 않으면 CA 인증서를 가져와야 해요.
Druid를 LDAPS용으로 구성 (Configure Druid for LDAPS)
Druid용 LDAPS를 설정하려면 다음 단계를 완료하세요. 구성 파일의 위치는 Configuration reference 문서를 참고하세요.
- LDAP 서버의 CA 또는 자체 서명 인증서를 새로 만든 LDAP 트러스트 스토어나
common.runtime.properties파일의druid.client.https.trustStorePath프로퍼티가 지정하는 트러스트 스토어에 가져오세요.
아래 예시는 HTTPS 클라이언트와 LDAP 클라이언트 모두에 하나의 키 스토어를 사용하는 옵션을 보여주지만, 원한다면 LDAP 전용 별도 트러스트 스토어를 사용할 수도 있어요.
keytool -import -trustcacerts -keystore path/to/cacerts -storepass truststorepassword -alias aliasName -file path/to/certificate.cer
path/to/cacerts를 트러스트스토어 경로로, truststorepassword를 트러스트스토어 비밀번호로, aliasName을 키스토어 별칭 이름으로, path/to/certificate.cer을 인증서 위치와 이름으로 바꾸세요. 예를 들어:
keytool -import -trustcacerts -keystore /Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home/jre/lib/security/cacerts -storepass mypassword -alias myAlias -file /etc/ssl/certs/my-certificate.cer
- CA의 루트 인증서가 Java 트러스트스토어에 아직 없다면 가져오세요.
keytool -importcert -keystore path/to/cacerts -storepass truststorepassword -alias aliasName -file path/to/certificate.cer
path/to/cacerts를 트러스트스토어 경로로, truststorepassword를 트러스트스토어 비밀번호로, aliasName을 키스토어 별칭 이름으로, path/to/certificate.cer을 인증서 위치와 이름으로 바꾸세요. 예를 들어:
keytool -importcert -keystore /Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home/jre/lib/security/cacerts -storepass mypassword -alias myAlias -file /etc/ssl/certs/my-certificate.cer
common.runtime.properties파일의 LDAP 구성 섹션에 다음 줄을 추가하고 자신의 트러스트 스토어 경로와 비밀번호를 넣으세요. 트러스트 스토어를 가리키는 프로퍼티는druid.client.https.trustStorePath가 아니라druid.auth.basic.ssl.trustStorePath라는 점에 유의하세요. HTTPS 클라이언트와 LDAP에 같은 트러스트 스토어를 사용하든 별도 LDAP 트러스트 스토어를 사용하든, LDAP 인증서를 가져온 트러스트 스토어를 올바른 프로퍼티가 가리키도록 하세요.
druid.auth.basic.ssl.trustStorePath=/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home/jre/lib/security/cacerts
druid.auth.basic.ssl.protocol=TLS
druid.auth.basic.ssl.trustStorePassword=xxxxxx
이 프로퍼티에 대한 자세한 내용은 Druid basic security 문서를 참고하세요.
- 선택적으로
common.runtime.properties파일에 추가 LDAPS 프로퍼티를 구성할 수 있어요. 자세한 내용은 Druid basic security 문서를 참고하세요. - Druid를 다시 시작하세요.
문제 해결 팁 (Troubleshooting tips)
다음은 LDAP와 LDAPS 문제를 해결하는 데 도움이 되는 몇 가지 아이디어예요.
Coordinator 로그 확인 (Check the coordinator logs)
LDAP 연결이 동작하지 않으면 coordinator 로그를 확인하세요. 자세한 내용은 Logging 문서를 참고하세요.
Druid escalator 구성 확인 (Check the Druid escalator configuration)
coordinator가 동작하는데 나머지 클러스터가 동작하지 않는다면 escalator 구성을 확인하세요. 자세한 내용은 Configuration reference 문서를 참고하세요. 다른 서비스 로그를 확인해 서비스가 coordinator에서 권한 부여 세부 정보를 가져오지 못하는 이유를 볼 수도 있어요.
LDAP 서버 응답 시간 확인 (Check your LDAP server response time)
사용자는 Druid 콘솔에 로그인할 수 있는데 랜딩 페이지에서 401 오류가 표시된다면 LDAP 서버 응답 시간을 확인하세요. LDAP 사용자가 많은 대규모 조직에서는 LDAP 응답이 느려서 연결 타임아웃이 발생할 수 있어요.
더 알아보기 (Learn more)
- 인증과 권한 문서에서 Authenticator 체인과 Authorizer 라우팅을 살펴보세요.
- druid-basic-security 익스텐션 문서에서 LDAP 인증 프로퍼티를 자세히 확인해 보세요.
- 보안 개요 문서에서 내부 시스템 사용자와 초기 관리자 사용자 개념을 이해해 보아요.