ldapsearch 는 조회 전용이다. 이름 때문에 "검색 조건으로 값을 바꾼다" 고 오해하기 쉽지만 쓰기 동작이 없다. 변경은 ldappasswd 또는 ldapmodify 로 한다.
| 목적 | 명령 |
|---|---|
| 조회 | ldapsearch |
| 패스워드 변경 | ldappasswd |
| 속성 직접 수정 | ldapmodify |
가장 안전한 방법이다. 서버의 Password Modify 확장 연산을 쓰므로 해시 방식은 서버가 알아서 정한다.
ldappasswd -x -D "cn=admin,dc=example,dc=com" -W \
-S "uid=john,ou=users,dc=example,dc=com"
| 옵션 | 뜻 |
|---|---|
-x |
SASL 이 아닌 simple 인증 |
-D |
바인드할 DN(대개 관리자) |
-W |
바인드 패스워드를 프롬프트로 입력 |
-S |
새 패스워드를 프롬프트로 두 번 입력 |
| 마지막 인자 | 패스워드를 바꿀 대상 DN. 생략하면 바인드한 자기 자신 |
-w 와 -s 는 값을 명령행에 그대로 적는 형태다. 셸 히스토리와 ps 출력에 평문이 남으므로 대화형 작업에서는 대문자 -W · -S 를 쓴다. 스크립트에서 불가피하면 파일에서 읽는 -y 와 -T 를 쓴다.
ldappasswd -x -D "cn=admin,dc=example,dc=com" -y /root/.ldap_bind_pw \
-T /root/.new_pw "uid=john,ou=users,dc=example,dc=com"
dn: uid=john,ou=users,dc=example,dc=com
changetype: modify
replace: userPassword
userPassword: {SSHA}...해시값...
ldapmodify -x -D "cn=admin,dc=example,dc=com" -W -f change-password.ldif
여기서 평문을 그대로 넣으면 대부분의 구성에서 평문이 그대로 저장되거나 거부된다. 해시를 먼저 만들어 넣는다.
slappasswd -s "${NEW_PASSWORD}"
# {SSHA}...
패스워드 정책 오버레이(ppolicy)를 쓰고 있다면 ldapmodify 로 직접 바꾸는 방식은 정책 검사와 이력 갱신을 건너뛴다. 정책이 걸린 환경에서는 ldappasswd 를 쓴다.
OpenLDAP 관리자 자격증명은 두 갈래로 나뉘고, 어느 쪽인지에 따라 절차가 다르다.
ps -ef | grep slapd
-F /etc/openldap/slapd.d 가 보이면 cn=config 동적 설정 방식-f /etc/openldap/slapd.conf 가 보이면 정적 설정 방식olcRootPW 를 고친다. 로컬 루트 권한으로 ldapi:/// 를 통해 접속한다.
dn: olcDatabase={1}mdb,cn=config
changetype: modify
replace: olcRootPW
olcRootPW: {SSHA}...해시값...
ldapmodify -Y EXTERNAL -H ldapi:/// -f change-admin-password.ldif
데이터베이스 인덱스는 환경마다 다르므로 먼저 확인한다. {0}config 는 설정 데이터베이스 자신의 관리자이고, 실제 디렉터리의 관리자는 대개 {1}mdb 다.
ldapsearch -Y EXTERNAL -H ldapi:/// -b cn=config "(olcRootDN=*)" dn olcRootDN
vi /etc/openldap/slapd.conf
# rootpw {SSHA}...해시값...
systemctl restart slapd
cn=admin,dc=example,dc=com 이 실제 엔트리로 존재하고 userPassword 를 가지고 있다면 일반 사용자와 같은 방법으로 바꾼다.
ldappasswd -x -D "cn=admin,dc=example,dc=com" -W -S "cn=admin,dc=example,dc=com"
olcRootPW 와 엔트리의 userPassword 는 별개다. 둘 다 있는 구성에서 한쪽만 바꾸면 예전 패스워드로도 바인드가 되어 "바꿨는데 옛 값이 먹는다" 는 상태가 된다. 어느 쪽으로 인증되고 있는지 확인하고 필요하면 양쪽을 맞춘다.
일반 사용자가 자기 패스워드를 바꾸려면 ACL 에서 userPassword 에 대한 쓰기 권한이 있어야 한다.
access to attrs=userPassword
by self write
by anonymous auth
by * none
by self write 가 없으면 관리자만 바꿀 수 있고, by anonymous auth 가 없으면 로그인 자체가 되지 않는다.