CDP Private Cloud Base 7.3.1 의 Knox 기본 PAM 인증을 AD/LDAP 인증으로 바꾸는 절차와, 설정 과정에서 실제로 부딪힌 오류(바인드 DN 형식, Alias 미등록, ${ALIAS=...} 의 $ 누락) 를 정리한다. Knox 는 인증만 담당하고 인가는 Ranger 가 하므로 LDAP 인증을 붙인 뒤에도 Ranger UserSync 와 Knox 정책이 있어야 서비스에 접근할 수 있다. Knox IDBroker 는 클라우드 스토리지 자격증명 위임용이라 온프레미스 LDAP 인증과는 무관하다.
Cloudera Manager → Knox → Configuration 에 두 개의 Provider 가 있고 둘 다 고쳐야 한다. 한쪽만 고치면 metadata 토폴로지 등에서 Illegal principal name 이 계속 난다.
| Provider | 영향 토폴로지 |
|---|---|
| Knox SSO Authentication Provider | knoxsso, manager, homepage, cdp-proxy |
| Knox API Authentication Provider | admin, metadata, cdp-proxy-api |
두 Provider 의 내용은 같다. userSearchAttributeName 은 AD 가 sAMAccountName, OpenLDAP 이 uid 다.
role=authentication
authentication.name=ShiroProvider
authentication.param.sessionTimeout=30
authentication.param.redirectToUrl=/${GATEWAY_PATH}/knoxsso/knoxauth/login.html
authentication.param.restrictedCookies=rememberme,WWW-Authenticate
authentication.param.urls./**=authcBasic
authentication.param.main.ldapRealm=org.apache.knox.gateway.shirorealm.KnoxLdapRealm
authentication.param.main.ldapContextFactory=org.apache.knox.gateway.shirorealm.KnoxLdapContextFactory
authentication.param.main.ldapRealm.contextFactory=$ldapContextFactory
authentication.param.main.ldapRealm.contextFactory.authenticationMechanism=simple
authentication.param.main.ldapRealm.contextFactory.url=ldap://<LDAP_HOST>:389
authentication.param.main.ldapRealm.contextFactory.systemUsername=CN=<bind-user>,OU=Service account,OU=Users,DC=example,DC=com
authentication.param.main.ldapRealm.contextFactory.systemPassword=${ALIAS=knoxLdapSystemPassword}
authentication.param.main.ldapRealm.userSearchBase=DC=example,DC=com
authentication.param.main.ldapRealm.userSearchAttributeName=sAMAccountName
authentication.param.main.ldapRealm.userObjectClass=user
authentication.param.main.ldapRealm.groupSearchBase=DC=example,DC=com
authentication.param.main.ldapRealm.groupObjectClass=group
authentication.param.remove=main.pamRealm
authentication.param.remove=main.pamRealm.service
API Provider 에는 redirectToUrl 과 restrictedCookies 줄이 없다.
바인드 계정 비밀번호는 평문이 아니라 Knox Alias 로 저장하고 ${ALIAS=이름} 으로 참조한다. Cloudera Manager 에서는 Knox → Configuration 의 save_alias_command_input_password 에 토폴로지.alias명=비밀번호 형식으로 넣은 뒤 Actions → Save Alias - Knox Gateway 를 실행한다. 여러 토폴로지는 : 로 잇고, 전체에 한 번에 넣으려면 __gateway 를 쓴다.
knoxsso:cdp-proxy:cdp-proxy-api:admin:metadata.knoxLdapSystemPassword=${PASSWORD}
__gateway.knoxLdapSystemPassword=${PASSWORD}
Save Alias 는 Knox CLI 를 원격 실행해 즉시 반영되므로 재기동은 필요 없다. CLI 로 직접 할 수도 있다.
cd /opt/cloudera/parcels/CDH/lib/knox
bin/knoxcli.sh create-alias knoxLdapSystemPassword --cluster knoxsso # 프롬프트에서 비밀번호 입력
bin/knoxcli.sh list-alias --cluster knoxsso
bin/knoxcli.sh list-alias --cluster __gateway
bin/knoxcli.sh delete-alias knoxLdapSystemPassword --cluster __gateway
Knox 는 Alias 이름을 소문자로 저장한다(knoxldapsystempassword). 설정에서 참조하는 이름도 소문자로 맞추는 것이 안전하다.
설정 변경은 Save Changes → Refresh Cluster 로 토폴로지가 재배포된다. Alias 를 새로 저장했을 때는 Knox Gateway 재시작도 한다. knoxcli.sh 는 CM 에 저장만 한 값이 아니라 실제 배포된 토폴로지 파일을 읽으므로 Refresh 전에는 옛 설정으로 테스트된다.
export KNOX_GATEWAY_DATA_DIR=/var/lib/knox/gateway/data
export KNOX_GATEWAY_CONF_DIR=/var/lib/knox/gateway/conf
cd /opt/cloudera/parcels/CDH/lib/knox
bin/knoxcli.sh user-auth-test --cluster knoxsso --g --d # --p 는 히스토리에 남으니 프롬프트 입력
bin/knoxcli.sh user-auth-test --cluster metadata --g --d
# 배포된 값 확인
grep -i "systemPassword\|systemUsername" /var/lib/knox/gateway/data/topologies/knoxsso.xml
grep -i "systemPassword\|systemUsername" /var/lib/knox/gateway/data/deployments/knoxsso*/knoxsso.xml
# Knox 서버에서 AD 바인드 자체 확인
ldapsearch -x -H ldap://<LDAP_HOST>:389 \
-D "CN=<bind-user>,OU=Service account,OU=Users,DC=example,DC=com" -W \
-b "DC=example,DC=com" "(sAMAccountName=<테스트계정>)"
| 메시지 | 원인 · 조치 |
|---|---|
Illegal principal name: clouderabind / LDAP Simple authentication requires both a principal and credentials |
systemUsername 이 Full DN 이 아니다. CN=...,OU=...,DC=... 로 적는다 |
Value not found for cluster:metadata, alias: knoxLdapSystemPassword |
그 토폴로지에 Alias 가 없다. __gateway 또는 토폴로지별로 저장한다 |
Unable to set property 'contextFactory.systemPassword' with value [S{ALIAS=...}] |
$ 가 빠졌다. CM 필드에 ${ALIAS=...} 로 입력했는데도 배포 파일에 S{ALIAS=...} 로 남으면 CM 이 $ 를 변수로 처리한 것이다 |
LDAP 계정으로 로그인은 되어도 Ranger 정책이 없으면 서비스 접근이 거부된다. Ranger UserSync(SYNC_LDAP_URL, SYNC_LDAP_BIND_DN, SYNC_LDAP_USER_SEARCH_BASE, SYNC_LDAP_GROUP_SEARCH_BASE) 로 LDAP 그룹을 동기화하고, Ranger 의 Knox 서비스에 토폴로지별 정책(Allow Conditions 에 사용자/그룹) 을 만든 뒤 HDFS · Hive 등 각 서비스 정책을 준다.
배포된 토폴로지 XML 에는 ${ALIAS=knoxldapsystempassword} 가 정상 기록되고 Alias 도 __gateway 와 각 토폴로지에 저장됐지만, knoxcli.sh user-auth-test 는 여전히 S{ALIAS=...} 를 보고했고 브라우저 로그인도 실패한 채 대화가 끝났다. 마지막 제안은 /var/lib/knox/gateway/data/topologies/knoxsso.xml 소스 파일을 직접 고치거나 CM 필드에 $${ALIAS=...} 로 이스케이프해 보는 것이었다.