python-ldap Windows Active Directory unicodePwd userAccountControl DSID-031A120C
최근에 파이썬으로 (python-ldap) 윈도우 Active Directory 사용자 및 그룹을 관리하기 위해 개발하고 있는데, 잘 진행되다가 막혀서 오랜 시간 고생한 내용이라 정리해둔다.
일단 사용자를 생성하는건 잘 되었다. 그런데 생성을 하면 기본 Disabled 된 상태로 생성되었고, 패스워드 변경 또한 되지 않았다. 에러 메시지는 다음과 같았다.
ldap.UNWILLING_TO_PERFORM: {'desc': 'Server is unwilling to perform', 'info': '0000001F: SvcErr: DSID-031A120C, problem 5003 (WILL_NOT_PERFORM), data 0\n'}
검색해보니 LDAP으로 AD를 컨트롤 할 때 패스워드 변경은 SSL(TLS)을 사용한다는 것이다.
해결은 아래 옵션을 추가하고 ldaps:// 으로 연결하여 해결되었다.
위 옵션은 인증서 확인을 하지 않겠다는 뜻이다. 인증서 에러 메시지는 다음과 같다.
ldap.SERVER_DOWN: {'desc': "Can't contact LDAP server", 'info': 'error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed (unable to get local issuer certificate)'}
참고로 패스워드는 쌍따옴표로 묶은 유니코드로 문자열로 생성 후 UTF-16으로 인코딩 해줘야 한다. Python3 기준으로 아래와 같이 처리하였다.
패스워드는 'unicodePwd' 속성으로 변경하면 되고, 계정 Enable 상태로는 'userAccountControl' 속성을 [b'512'] 값으로 처리하면 된다. 아래 샘플 참조.
※ 2018-12-21 추가
아래 메시지가 나오는 경우는 TLS가 설정되지 않은 경우이다. DC에서 TCP 636 포트를 리스닝은 하고 있지만 실제로는 아래와 같은 메시지가 나온다.
ldap.SERVER_DOWN: {'desc': "Can't contact LDAP server", 'errno': 104, 'info': 'Connection reset by peer'}
TLS를 활성화 하려면 "Active Directory 인증서 서비스" 역할을 추가해야 한다.
추가 후 바로 시도해보면 여전히 실패를 할 것이다. gpupdate /force 를 한번 해주면 정상적으로 TLS 연결이 된다.
'프로그래밍 > 기타' 카테고리의 다른 글
[Python3][2020카카오공채] 문자열 압축 (0) | 2019.10.03 |
---|---|
[Python] json.dumps 한글 유니코드 (0) | 2019.04.05 |
하노이의 탑 (1) | 2019.02.13 |
[Python3] 카카오 코드 페스티벌 2018 예선 - 인형들 (0) | 2019.01.18 |
티스토리 블로그 SSL(TLS) www <-> non-www 상호 전환 Javascript (7) | 2018.09.08 |
[Python3] Permutation (순열) (2) | 2018.08.04 |
[Python3] QuickSort (퀵 정렬) (0) | 2018.08.03 |
[카카오][Python3] 리틀 프렌즈 사천성 (1) | 2018.08.02 |
최근에 달린 댓글 최근에 달린 댓글