database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
ㆍLDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
LDAP Q&A 2167 게시물 읽기
No. 2167
[답변:1082] AD 사용자 패스워드 속성에 관하여
작성자
김호범(trueccie)
작성일
2005-04-30 04:06ⓒ
2005-04-30 04:13ⓜ
조회수
10,487

술먹고 들어와서 상준님이 메신져를 보고 제가 중대한 실수를 했음을 알았습니다. 실수로 User-Class가 아닌 Person 클래스의 속성을 잘못 알려드려서 수정합니다. (상준님 감사합니다. 저도 예전 짠 코드를 보니 unicodepwd를 사용했더군요. ^^;)
AD의 Proprietry 클래스인 User Class에서 패스워드를 저장할때 사용하는 속성(attribute Name)은 "Unicode-Pwd" 입니다. 실제 개발하실때는 unicodePwd 라는 ldap display name을 사용하시면 됩니다. 지은 죄가 있어서 좀더 정보를 보충하여 올립니다.

 

상준님이 언급하신데로 UTF-8 format으로 저장되고 참고하실것은 write-only attribute라는 것을 주의하십시요. 또한 저장된 내용도 실제 패스워드가 아닌 NT OWF 방식으로 저장되는 값입니다. (MS에서는 굳이 어려운 말로 "NT OWF"라고 부르는 이 값은 NT One Way Fromat의 약자로 unicode화되고 BASE-64 (BER encode) encode되고 이들이 다시 MD4 16byte hashing 되어 저장됩니다.)

Hash equation은 수학적으로 irreversible 함수로 증명되어있는건 다 아시지요. ^^; hash를 통해 패스워드 일치는 확인할수 있으나 패스워드 자체가 무엇인지는 알수 없습니다. (해커들은 dictionary attack을 통해 알아낼수도 있지만 너무 피곤한 방법이고 사전에 없으면 알수 없습니다. )

좀더 기술적인 용어를 써서 도식화하면

Unicode(password) with BASE64 encoded
|
MD4 Hashing
|
16Byte NT OWF (실제 저장된 값)

 

거의 모든 LDAP서버가 패스워드를 저장하는 방식은 동일한 방식이라고 알고 있습니다. (맞나? 아마 맞을겁니다. 그래야만 Sync같은것을 만들 수 있으니까요.)


개발에 필요한 기타 정보는

CN : Unicode-Pwd
Ldap-Display-Name : unicodePwd
Update Privilege : Domain administrator or account owner만 가능
Attribute-Id : 1.2.840.113556.1.4.90
System-Id-Guid : bf9679e1-0de6-11d0-a285-00aa003049e2


등을 알고 계시면 프로그래밍하시는데는 문제가 없을것입니다. 나머지 내용은 상준님의 커멘트를 참조하시고, 그래서 어차피 이 속성을 읽어보아야 할일이 별로 없습니다. 다만 패스워드 변경을 해야할 경우는 역시 유니코드 변경과 hash을 해서 입력을 해야합니다. 더욱 중요한 것은 접근 APP가 웹인 경우는 적절한 impersonation을 하셔야 한다는 것을 잊으시면 안됩니다.

 

요약하면 AD상에 저장된 password 자체를 뽑아내는 것은 불가능합니다. 그러나 설정은 가능합니다. 이때 주의하실것은 이 코드를 AD 자체에서 돌리지 않고 UNIX에서 이 로직을 돌릴경우 반드시 AD와 SSL을 통해서 실행되어져야 합니다. (LDAP over SSL, LDAP-SSL 연결포트는 636/tcp 이나 3269/tcp (Global Catalog SSL) 사용하셔야 됩니다.)

 

불행하게도 잘알려져있는 JSSE와 JNDI 로는 잘동작하지 않는듯 합니다.
이 경우 Netscape Java Directory SDK를 사용하시면 이러한 요구사항에 부합한 API를 제공해줍니다. 아니면 python이나 Perl도 강력하기때문에 이러한 목적에 유용하게 쓰일수 있습니다.

펄인 경우,
use Net::LDAP;
use Net::LDAP::Entry;
use Net::LDAPS;
use MIME::Base64;

이들을 사용하시면 될겁니다.

ASP나 ASP.NET을 사용하실경우는 이러한 제약이 없이 바로 사용하셔도 무방합니다.

일반적으로 LDIF를 통해서는 패스워드 업데이트가 불가능하다고 알려져있으나 다음과 같은 방법을 사용하면 가능합니다.

만약 trueccie라는 사용자의 패스워드를 password라는 값으로 변경하고자 하면 아래처럼 만들어 주셔야 합니다. 다만 주의할것은 password 만 unicode변경하고 BASE-64 encodig해서 집어넣어야 한다는 것인데. 이때도 이러한 인코딩시 반드시 " " 라는 quote문자까지 같이 인코딩하셔야 한다는 것을 간과하시면 안됩니다.
아래 예제에서 "password" -> IgBwAGEAcwBzAHcAbwByAGQAIgA= 변환된 것입니다.

 

dn: CN=trueccie,OU=DEV,DC=test,DC=com
changetype: modify
replace: unicodePwd
unicodePwd::IgBwAGEAcwBzAHcAbwByAGQAIgA=

이런 식으로 만드시면 되고, 당연한 패스워드 값은 간단한 프로그램을 짜거나 유틸을 이용해서 만드셔야 하는 번거로움이 있습니다. ^^;

 

부디 도움이 되셨기를....

이 글에 대한 댓글이 총 2건 있습니다.

가져올 수 없다는 것은 알게 되었는데...그렇군요..

한달만에 들어왔는데... 이런 좋은 정보를 올려주시다니..감사 드립니다.

 

초보(haha001)님이 2005-06-09 14:58에 작성한 댓글입니다.

- 2003에 추가된 inetOrgPerson 객체는 userPassword attribute에 저장합니다.
- 기존 user객체의 password는 디폴트로 unicodePwd attribute에 저장됩니다.
김호범님이 2005-06-14 14:59에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
2170kerberos SSO
야옹이
2005-05-05
7828
2169ldap 세미나 [1]
김용환
2005-05-04
8148
2168버클리 DB에 대한 문의점 [1]
재혁
2005-05-03
7696
2167[답변:1082] AD 사용자 패스워드 속성에 관하여 [2]
김호범
2005-04-30
10487
2166LDAP과 DB 사이의 실시간 동기화...... 어떻게 하면 될까요? [3]
송상준
2005-04-29
8597
2165Active Directory에서 사용자 패스워드 attribute명이 뭔지 궁금합니다. [1]
초보
2005-04-28
8280
2162openLDAP과 Kerberos연동 질문이요 [5]
야옹이
2005-04-13
9747
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2023 DSN, All rights reserved.
작업시간: 0.047초, 이곳 서비스는
	PostgreSQL v16.1로 자료를 관리합니다