-
ldap을 통해 사용자 비밀번호 변경하기Active Directory/ldap 2021. 1. 22. 20:01
우선 나는 LDAPJS를 사용하여 AD와 통신을 하였으며 Apache Directory Studio 툴을 사용하여 테스트를 진행하였다.
엔트리의 속성값 중 userPassword가 사용자의 비밀번호일 것이라 가정하며 프로젝트를 얼추 마무리 하던 중, 난관에 봉착하였다. Active Directory에서는 userPassword가 아닌 unicodePwd 속성에 사용자 비밀번호가 암호화 되어 저장된다는 것이었다. 심지어 unicodePwd는 일반적인 방법으로는 바뀌지 않아 정말 많은 Microsoft 문서들을 참고했던 것 같다.
unicodePwd 변경(change)
- ldaps://${IP}:636 : unicodePwd의 수정을 위해선 SSL 인증을 거친 636포트를 통해 ldaps://의 형식으로 client를 접속해야 한다.
- modify에서 'replace' 동작은 허용하지 않으며 'del'과 'add'를 동시에 수행하여야 한다. add가 추가된 del 동작이 서버로 들어가면 서버는 이를 수정의 동작으로 인식한다. 그러므로 기존 암호를 알고 있어야 한다.
- unicodePwd는 따옴표로 묶인 암호를 포함하는 유니코드 문자열로 암호 값을 지정해야한다. ex) "newPassword"
- 위의 조건을 만족하여도 안된다면 제어판 -> 시스템 및 보안 -> 관리 도구 -> 그룹 정책 관리로 이동하여 왼쪽 사이드 메뉴에서 컴퓨터 구성 -> 정책 -> Windows 설정 -> 보안 설정 -> 암호 정책 -> 최소 암호 사용 기간을 0일로 설정해준다.
client.modify(userDN, [ new ldap.Change({ operation: 'delete', modification: { unicodePwd: encodeuniPwd(userPassword) } }), new ldap.Change({ operation: 'add', modification: { unicodePwd: encodeuniPwd(newPassword) } }) ], function(err) { if (err) { console.log(err.code); console.log(err.name); console.log(err.message); client.unbind(); } else { console.log('Password changed!'); client.modify(userDN, [ new ldap.Change({ operation: 'replace', modification: { userPassword: newPassword } }) ] , function(err) { if(err){ console.log('Error in update '+err); } else{ console.log('Second Update successfully!'); } }); callbackFunc(1); } });
(밑 부분의 client.modify 부분은 현재 비밀번호를 모르는 상태에서의 초기화 기능을 위한 코드이므로 단순히 변경을 원하는 입장에서는 무시해도 좋다.)
마무리
이번 프로젝트를 진행하면서 Active Directory와 LDAP을 처음 접했던 점, 그리고 네트워크와 보안 관련해서 깊히 공부를 하지 않았던 탓에 굉장히 애를 먹었던 것 같다.
학과 프로젝트를 진행할 때는 단순히 요구되는 기능을 구현해 내는 것에 초점을 맞추었던 터라 이번처럼 개념과 플로우를 확실히 잡고 나서 진행하는 것에 대해 굉장히 낯설게 느껴졌으며 그만큼 힘들었다.
이때까지 진행해왔던 방식에 대해 회의감이 들었으나 이번 경험을 계기로 업무를 해나가는 데에 있어서 접근 방식을 바꾸게 되는 전환점이 될 것 같다.
'Active Directory > ldap' 카테고리의 다른 글
LDAPJS (0) 2021.01.18 LDAP 프로토콜 (0) 2021.01.18