최근에 파이썬으로 (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.set_option(ldap.OPT_X_TLS_REQUIRE_CERT, 0)


위 옵션은 인증서 확인을 하지 않겠다는 뜻이다. 인증서 에러 메시지는 다음과 같다.


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 기준으로 아래와 같이 처리하였다.


new_password = '"초기패스워드"'
encoded_new_password = new_password.encode('utf-16-le')


패스워드는 'unicodePwd' 속성으로 변경하면 되고, 계정 Enable 상태로는 'userAccountControl' 속성을 [b'512'] 값으로 처리하면 된다. 아래 샘플 참조.


attrs = {
'unicodePwd': [encoded_new_password], # UTF-16-LE
'userAccountControl': [b'512'], # 계정 Enable
'pwdLastSet': [b'0'], # 다음 로그인시 패스워드 변경
}



※ 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 인증서 서비스" 역할을 추가해야 한다.


https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/dd941846(v=ws.10)


추가 후 바로 시도해보면 여전히 실패를 할 것이다. gpupdate /force 를 한번 해주면 정상적으로 TLS 연결이 된다.