애플리케이션을 Active Directory 에 붙일 때 요청해야 하는 것은 대개 두 가지다. 조회에 쓸 바인드 계정과, Kerberos 를 함께 쓴다면 서비스 계정과 keytab 이다. 필요 이상으로 넓은 권한을 요구하면 승인이 늦어지므로 용도별로 나눠 적는 편이 빠르다.
| 포트 | 용도 |
|---|---|
| 389 | LDAP. 평문 또는 StartTLS |
| 636 | LDAPS. 처음부터 TLS |
| 3268 | 글로벌 카탈로그. 평문 |
| 3269 | 글로벌 카탈로그. TLS |
| 88 | Kerberos |
| 464 | 비밀번호 변경(kpasswd) |
도메인 컨트롤러의 389 는 그 도메인 정보만 가지고 있다. 포리스트에 도메인이 여러 개면 다른 도메인의 사용자를 찾을 때 참조(referral)를 돌려주고, 클라이언트가 그것을 따라가지 못하면 조회가 비어 보인다.
글로벌 카탈로그(3268)는 포리스트 전체 객체의 부분 집합을 들고 있어 한 번의 질의로 전체를 검색할 수 있다. 다만 모든 속성이 들어 있지는 않다. GC 에 복제되는 속성만 조회되므로, 특정 속성이 비어 나온다면 389 로 해당 도메인 DC 에 다시 물어야 한다.
애플리케이션 설정에서 base DN 을 포리스트 루트(dc=example,dc=com)로 두고 3268 을 쓰면 다중 도메인 환경의 조회 문제가 대부분 사라진다.
# 기본 연결과 바인드
ldapsearch -x -H ldap://dc1.example.com -D "svc-ldap@example.com" -W \
-b "dc=example,dc=com" "(sAMAccountName=haedong)" dn
# 글로벌 카탈로그
ldapsearch -x -H ldap://dc1.example.com:3268 -D "svc-ldap@example.com" -W \
-b "dc=example,dc=com" "(sAMAccountName=haedong)" dn
# LDAPS
ldapsearch -x -H ldaps://dc1.example.com -D "svc-ldap@example.com" -W \
-b "dc=example,dc=com" "(objectClass=user)" sAMAccountName
# 포트 도달 여부만
nc -vz dc1.example.com 3268
AD 는 바인드 DN 으로 세 가지 표기를 모두 받는다. user@example.com(UPN), EXAMPLE\user, 전체 DN 이다. UPN 이 가장 덜 까다롭다.
Can't contact LDAP server (-1) : 바인드 이전 단계다. 이름 해석 · 포트 · TLS 협상 실패. ldaps:// 인데 인증서를 신뢰하지 못하는 경우도 여기로 떨어진다.80090308: LdapErr: DSID-..., comment: AcceptSecurityContext error, data <코드> : 자격 증명 문제이며 뒤의 data 코드가 진짜 원인이다. 525 사용자 없음, 52e 비밀번호 틀림, 530 로그온 시간 제한, 531 워크스테이션 제한, 532 비밀번호 만료, 533 계정 비활성, 701 계정 만료, 773 비밀번호 변경 필요, 775 계정 잠김.ldap 서버에서 참조를 반환했습니다(referral) : 위에서 설명한 다중 도메인 상황이다. 3268 을 쓰거나, 클라이언트에서 참조를 따라가거나(ldapsearch -C) 무시한다(-M).unable to get CN from peer certificate : LDAPS 인증서의 이름과 접속한 호스트 이름이 다르다. FQDN 으로 접속하고 CA 를 클라이언트에 등록한다.data 코드가 52e 로 반복되면 계정 문제로 보기 전에 바인드 표기 형식을 바꿔 본다. DN 표기가 틀렸을 때도 같은 코드가 나온다.
sAMAccountName · mail · memberOf · objectGUID 등 연동에 쓰는 속성 읽기.쓰기 권한은 애플리케이션이 실제로 계정을 만들거나 그룹을 고칠 때만 요청한다. 대부분의 SSO · 로그인 연동은 읽기만으로 충분하다.
HTTP/host.example.com 처럼 자기 이름으로 티켓을 받으려면 필요하다.ktpass 로 만들며, 실행하면 계정 비밀번호가 바뀌므로 한 계정의 keytab 을 여러 번 만들면 앞서 배포한 것이 무효가 된다.msDS-SupportedEncryptionTypes) 활성화. 이것이 빠지면 암호화 유형 불일치 로 이어진다.# 특정 그룹의 구성원
(memberOf=CN=app_users,OU=Groups,DC=example,DC=com)
# 중첩 그룹까지 (AD 확장 매칭 규칙)
(memberOf:1.2.840.113556.1.4.1941:=CN=app_users,OU=Groups,DC=example,DC=com)
# 비활성 계정 제외
(&(objectClass=user)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))
memberOf 는 기본적으로 직접 구성원만 보여 준다. 중첩 그룹을 쓰는 조직에서 "그룹에 넣었는데 로그인이 안 된다"면 확장 매칭 규칙을 써야 한다. 다만 이 필터는 비용이 크므로 사용자 수가 많으면 조회가 느려진다.