1. 程式人生 > >LDAP基礎:8:ldap使用者密碼確認和修改

LDAP基礎:8:ldap使用者密碼確認和修改

ldap使用者密碼的修改可以使用ldappasswd命令,也可以使用萬能的ldapmodify結合ldif檔案來實現,但所修改的都是普通的使用者,cn=admin的管理員使用者的修改一般可以通過slappasswd來進行,由於本系列使用了openldap的docker映象,此項功能已被封裝,通過設定環境變數即可輕易實現。

修改密碼的常用方式

  • ldappasswd命令
  • ldapmodify命令結合ldif檔案
  • slappasswd命令

管理員密碼的設定

管理員密碼的設定可以通過slappasswd,由於本系列文章的示例使用了osixia的openldap映象,cn=admin的密碼設定,只需要對環境變數LDAP_ADMIN_PASSWORD進行設定即可。

Option介紹

ldapmodify常用Option

ldapmodify常用的Option的資訊和用途整理如下:

Option 說明
-H ldapuri,格式為ldap://機器名或者IP:埠號,不能與-h和-p同時使用
-h LDAP伺服器IP或者可解析的hostname,與-p可結合使用,不能與-H同時使用
-p LDAP伺服器埠號,與-h可結合使用,不能與-H同時使用
-x 使用簡單認證方式
-D 所繫結的伺服器的DN
-w 繫結DN的密碼,與-W二者選一
-W 不輸入密碼,會互動式的提示使用者輸入密碼,與-w二者選一
-c 出錯後忽略當前錯誤繼續執行,預設情況下遇到錯誤即終止
-n 模擬操作但並不實際執行,用於驗證,常與-v一同使用進行問題定位
-v 顯示詳細資訊
-d 顯示debug資訊,可設定級別
-e 設定客戶端證書
-E 設定客戶端私鑰

ldappasswd常用Option

ldappasswd常用的Option的資訊和用途整理如下:

Option 說明
-H ldapuri,格式為ldap://機器名或者IP:埠號,不能與-h和-p同時使用
-h LDAP伺服器IP或者可解析的hostname,與-p可結合使用,不能與-H同時使用
-p LDAP伺服器埠號,與-h可結合使用,不能與-H同時使用
-x 使用簡單認證方式
-D 所繫結的伺服器的DN
-w 繫結DN的密碼,與-W二者選一
-W 不輸入密碼,會互動式的提示使用者輸入密碼,與-w二者選一
-n 模擬操作但並不實際執行,用於驗證,常與-v一同使用進行問題定位
-v 顯示詳細資訊
-d 顯示debug資訊,可設定級別
-S 互動式進行密碼的提示和輸入以及Re-enter,與-s二者選一
-s 將指定內容設為密碼,與-S二者選一

事前準備

  • 使用ldif方式建立barbara使用者的資訊
liumiaocn:openldap liumiao$ cat barbara.ldif 
dn: cn=Barbara Jensen,dc=example,dc=org
changetype: add
objectClass: inetOrgPerson
cn: Barbara Jensen
cn: Babs Jensen
sn: Jensen
title: the world's most famous mythical manager
mail: [email protected]
uid: bjensen
liumiaocn:openldap liumiao$ 
  • 使用者新增
liumiaocn:openldap liumiao$ ldapadd -H ldap://192.168.31.242:389 -D "cn=admin,dc=example,dc=org" -w admin -f barbara.ldif
adding new entry "cn=Barbara Jensen,dc=example,dc=org"

liumiaocn:openldap liumiao$
  • 結果確認
liumiaocn:openldap liumiao$ ldapsearch -x -h 192.168.31.242 -p 389 -b "dc=example,dc=org" -D "cn=admin,dc=example,dc=org" -w admin "uid=bjensen"
# extended LDIF
#
# LDAPv3
# base <dc=example,dc=org> with scope subtree
# filter: uid=bjensen
# requesting: ALL
#

# Barbara Jensen, example.org
dn: cn=Barbara Jensen,dc=example,dc=org
objectClass: inetOrgPerson
cn: Barbara Jensen
cn: Babs Jensen
sn: Jensen
title: the world's most famous mythical manager
mail: [email protected]
uid: bjensen

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1
liumiaocn:openldap liumiao$

修改密碼

方式1: ldappasswd不指定密碼

不指定密碼的情況下,ldappasswd會給你生成一個密碼。ldap的使用者密碼是通過userPassword來儲存的,但是在使用ldif的時候沒有這個欄位,所以可以使用前文中提到的方式使用ldapmodify來進行新增,也可使用如下方式:

liumiaocn:openldap liumiao$ ldappasswd -x -h 192.168.31.242 -p 389 -D "cn=admin,dc=example,dc=org" -w admin  "cn=Barbara Jensen,dc=example,dc=org"
New password: VSzhfbwA
liumiaocn:openldap liumiao$

可以看到自動建立了一個密碼串VSzhfbwA給指定的Barbara使用者,然後來重新對此使用者進行確認,可以看到加密後的userPassword資訊已經出現在LDIF中了。

liumiaocn:openldap liumiao$ ldapsearch -x -h 192.168.31.242 -p 389 -b "dc=example,dc=org" -D "cn=admin,dc=example,dc=org" -w admin "uid=bjensen"
# extended LDIF
#
# LDAPv3
# base <dc=example,dc=org> with scope subtree
# filter: uid=bjensen
# requesting: ALL
#

# Barbara Jensen, example.org
dn: cn=Barbara Jensen,dc=example,dc=org
objectClass: inetOrgPerson
cn: Barbara Jensen
cn: Babs Jensen
sn: Jensen
title: the world's most famous mythical manager
mail: [email protected]
uid: bjensen
userPassword:: e1NTSEF9ZDYwU1NNMjJxb05vOTZ6OHg4b1JVMmxuRmpKNmR2SjE=

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1
liumiaocn:openldap liumiao$

結果驗證

驗證方法1: 使用java的JNDI

對修改的密碼進行驗證,可以使用前文中的Java的JNDI做的簡單的程式碼進行驗證:

liumiaocn:~ liumiao$ java LdapDemo 192.168.31.242 "cn=Barbara Jensen,dc=example,dc=org" "VSzhfbwA"
IPAdress: 192.168.31.242
Username: cn=Barbara Jensen,dc=example,dc=org
Password: VSzhfbwA
env setting
login verification begins...
login successfully.
liumiaocn:~ liumiao$

詳細參看:

驗證方法2: 使用ldapsearch等命令

考慮到許可權,只查詢自己的資訊,看看是否能夠正確返回,主要是用於驗證-w的內容

liumiaocn:~ liumiao$ ldapsearch -x -h 192.168.31.242 -p 389 -b "cn=Barbara Jensen,dc=example,dc=org" -D "cn=Barbara Jensen,dc=example,dc=org" -w VSzhfbwA "uid=bjensen"
# extended LDIF
#
# LDAPv3
# base <cn=Barbara Jensen,dc=example,dc=org> with scope subtree
# filter: uid=bjensen
# requesting: ALL
#

# Barbara Jensen, example.org
dn: cn=Barbara Jensen,dc=example,dc=org
objectClass: inetOrgPerson
cn: Barbara Jensen
cn: Babs Jensen
sn: Jensen
title: the world's most famous mythical manager
mail: [email protected]
uid: bjensen
userPassword:: e1NTSEF9ZDYwU1NNMjJxb05vOTZ6OHg4b1JVMmxuRmpKNmR2SjE=

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1
liumiaocn:~ liumiao$

因為錯誤的時候必然會提示:

liumiaocn:~ liumiao$ ldapsearch -x -h 192.168.31.242 -p 389 -b "cn=Barbara Jensen,dc=example,dc=org" -D "cn=Barbara Jensen,dc=example,dc=org" -w VSzhfbwA1 "uid=bjensen"
ldap_bind: Invalid credentials (49)
liumiaocn:~ liumiao$

所以以此類推,很多命令和Option都可以進行利用,比如-n,各種擴充套件方式可自行展開。

ldappasswd使用-s指定修改密碼

前文不指定密碼的方式實際是使用admin對其他使用者的密碼進行重設,使用者自己知道密碼的情況下,進行更新則可以使用這種方式,比如:

liumiaocn:openldap liumiao$ ldappasswd -x -h 192.168.31.242 -p 389 -D "cn=Barbara Jensen,dc=example,dc=org" -w VSzhfbwA -s liumiao123
liumiaocn:openldap liumiao$ echo $?
0
liumiaocn:openldap liumiao$

這樣Barbara就將自己的密碼改成了liumiao123,結果確認發現,密碼能夠正常使用

liumiaocn:~ liumiao$ java LdapDemo 192.168.31.242 "cn=Barbara Jensen,dc=example,dc=org" "liumiao123"
IPAdress: 192.168.31.242
Username: cn=Barbara Jensen,dc=example,dc=org
Password: liumiao123
env setting
login verification begins...
login successfully.
liumiaocn:~ liumiao$ 

結合這兩種方式,常見的密碼重設問題基本都可以解決,比如在不知道密碼的情況下,可以使用方式1先通過admin進行重新生成密碼,再使用方式2重新設定指定密碼,當然ldappasswd還有很多其他有用Option,使用方式可自行探索。

方式3: 使用ldapmodify來進行密碼修改

ldapmodify作為一個萬能命令,除了查詢無法實現之外,增刪改方面有廣泛的應用,對於密碼修改自然也非常方便,其實使用前文介紹的方法就可以,這裡再次示例如下:

  • 準備修改密碼的ldif檔案,在檔案中設定密碼為babspw
liumiaocn:openldap liumiao$ cat modifybarbara.ldif 
dn: cn=Barbara Jensen,dc=example,dc=org
changetype: modify
replace: userPassword
userPassword: babspw
liumiaocn:openldap liumiao$
  • 使用ldapmodify修改密碼
liumiaocn:openldap liumiao$ ldapmodify -a -H ldap://192.168.31.242:389 -D "cn=admin,dc=example,dc=org" -w admin -f modifybarbara.ldif 
modifying entry "cn=Barbara Jensen,dc=example,dc=org"

liumiaocn:openldap liumiao$ 
  • 結果確認
liumiaocn:~ liumiao$ java LdapDemo 192.168.31.242 "cn=Barbara Jensen,dc=example,dc=org" "babspw"
IPAdress: 192.168.31.242
Username: cn=Barbara Jensen,dc=example,dc=org
Password: babspw
env setting
login verification begins...
login successfully.
liumiaocn:~ liumiao$