14.4 管理OpenLDAP
啟動OpenLDAP服務器程序之后,接下來的操作就是通過客戶端程序對目錄進行操作,包括添加、修改、刪除和搜索數據等操作。能對LDAP進行操作的客戶端程序很多,本節簡單介紹在Linux命令方式下進行這些操作的方法。
14.4.1 向目錄數據庫中添加數據
初始狀態下,LDAP是一個空目錄,即沒有任何數據。可通過程序代碼向目錄數據庫中添加數據,也可使用OpenLDAP客戶端工具ldapadd命令來完成添加數據的操作,該命令可將一個LDIF文件中的條目添加到目錄。因此,需要首先創建一個LDIF文件,然后再進行添加操作。
1.LDIF文本條目格式
LDIF用文本格式表示目錄數據庫的信息,以方便用戶創建、閱讀和修改。在LDIF文件中,一個條目的基本格式如下:
# 注釋
dn: 條目名
屬性描述: 值
屬性描述: 值
屬性描述: 值
... ...
dn行類似於關系數據庫中一條記錄的關鍵字,不能與其他dn重復。一個LDIF文件中可以包含多個條目,每個條目之間用一個空行分隔。
例如,以下內容組成一個條目:
1: dn: dc=wyh, dc=com
2: objectclass: top
3: objectclass: dcobject
4: objectclass: organization
5: dc: wyh
6: o: wyh,Inc.
在以上文本中,各行含義如下:
● 第1行的dn定義該條目的標識。
● 第2~4行定義該條目的objectcCass,可以定義多個屬性,如上面代碼中定義了3個objectClass。條目的屬性根據objectClass的不同而不同,有的objectClass有必須設置的屬性。在2~4行的3個objectClass中,top沒有必須定義的屬性,dcobject必須定義屬性dc,用來表示一個域名的部分,而organization必須定義屬性o,用來表示一個組織的名稱。
● 根據objectClass的要求,第5、6行分別定義屬性dc和屬性o的值。
2.了解objectClass
LDAP中,一個條目必須包含一個objectClass屬性,且需要賦予至少一個值。每一個值將用作一條LDAP條目進行數據存儲的模板;模板中包含了一個條目必須被賦值的屬性和可選的屬性。
objectClass有着嚴格的等級之分,最頂層是top和alias。例如,organizationalPerson這個objectClass就隸屬於person,而person又隸屬於top。
objectClass可分為以下3類:
● 結構型(Structural):如person和organizationUnit;
● 輔助型(Auxiliary):如extensibeObject;
● 抽象型(Abstract):如top,抽象型的objectClass不能直接使用。
在OpenLDAP的schema中定義了很多objectClass,下面列出部分常用的objectClass的名稱。
● account
● alias
● dcobject
● domain
● ipHost
● organization
● organizationalRole
● organizationalUnit
● person
● organizationalPerson
● inetOrgPerson
● residentialPerson
● posixAccount
● posixGroup
3.了解Attribute
屬性(Attribute)類似於程序設計中的變量,可以被賦值。在OpenLDAP中聲明了許多常用的Attribute(用戶也可自己定義Attribute)。常見的Attribute含義如下:
1 c:國家。
● cn:common name,指一個對象的名字。如果指人,需要使用其全名。
● dc:domain Component,常用來指一個域名的一部分。
● givenName:指一個人的名字,不能用來指姓。
● l:指一個地名,如一個城市或者其他地理區域的名字。
● mail:電子信箱地址。
● o:organizationName,指一個組織的名字。
● ou:organizationalUnitName,指一個組織單元的名字。
● sn:surname,指一個人的姓。
● telephoneNumber:電話號碼,應該帶有所在的國家的代碼。
● uid:userid,通常指某個用戶的登錄名,與Linux系統中用戶的uid不同。
提示:objectClass是一種特殊的Attribute,它包含其他用到的Attribute以及其自身。
對於不同的objectClass,通常具有一些必設屬性值和一些可選屬性值。例如,可使用person這個objectClass來表示系統中一個用戶的條目,對於系統中用戶通常需要有這樣一些信息:姓名、電話、密碼、描述等。如圖14-6所示,對於person,通過cn和sn設置用戶的名和姓,這是必須設置的,而其他屬性則是可選的。
圖14-6 objectClass屬性
下面列出部分常用objectClass要求必設的屬性。
● account:userid。
● organization:o。
● person:cn和sn。
● organizationalPerson:與person相同。
● organizationalRole:cn。
● organizationUnit:ou。
● posixGroup:cn、gidNumber。
● posixAccount:cn、gidNumber、homeDirectory、uid、uidNumber。
4.創建LDIF文件
對以上內容有一定了解之后,就可以編寫輸入LDIF文件,編輯需要向目錄數據庫添加的條目了。
下面根據如圖14-7所示的結構,創建LDIF文件wyh.com.ldif。
圖14-7 目錄的樹形結構
對圖14-7進行分析,該目錄結構分為3層,有4個結點。根據圖14-7可創建LDIF文件如下:
提示:每個結點可用一個dn表示,對於每個結點,又可繼續添加新的結點。如在根結點中可添加其他部門ou,在ou=managers結點也可繼續添加其他管理人員的信息。
1: dn: dc=wyh, dc=com
2: objectclass: top
3: objectclass: dcobject
4: objectclass: organization
5: dc: wyh
6: o: wyh,Inc.
7:
8: dn: ou=managers, dc=wyh, dc=com
9: ou: managers
10: objectclass: organizationalUnit
11:
12: dn: cn=wyh, ou=managers, dc=wyh, dc=com
13: cn: wyh
14: sn: wuyunhui
15: objectclass: person
16:
17: dn: cn=test, ou=managers, dc=wyh, dc=com
18: cn: test
19: sn: Test User
20: objectclass: person
以上文件中各行的含義如下:
● 第1~6行創建根結點,這部分在前面也有介紹,就不再重復了。
● 第7、11、16行為空行,用來分隔4個dn條目(4個結點)。
● 第8~10行定義cn=managers結點的條目,該條目的objectClass為organizationalUnit,因此需要用ou屬性定義組織名稱。
● 第12~15行定義cn=wyh結點的條目,該條目使用的objectClass為person,因此需設置cn和sn兩個屬性值。
● 第17~20行與第12~15行的意義相同。
● 在以上LDIF文件中,第1、8、12、17行以dn開頭,這部分內容必須唯一,並且在向目錄數據庫添加這些數據時,也要確保這些數據不能與目錄數據庫中已有數據相同,否則,添加操作將中斷。
5.從LDIF文件添加到目錄數據庫
使用OpenLDAP客戶端工具ldapadd命令,可將LDIF文件中的條目添加到目錄數據庫中,該命令的格式如下:
ldappadd 選項 LDIF文件
在ldappadd命令中常用的選項如下:
● -x:進行簡單認證。
● -D:用來綁定服務器的dn。
● -h:目錄服務的地址。
● -w:綁定dn的密碼。
● -f:使用LDIF文件進行條目添加的文件。
【實例14-2】將前面編寫的LDIF文件的條目數據添加到目錄數據庫中。
具體操作步驟如下:
(1)檢查wyh.com.ldif文件中的內容,需要注意的是,每個冒號后面都需要空一格,而每行結束處不能留有空格字符。
(2)使用以下命令將wyh.com.ldif文件中的條目添加到目錄中:
# ldapadd -x -D "cn=Manager, dc=wyh, dc=com" -w secret -f wyh.com.ldif
執行以上命令,如果添加操作正常完成,將顯示如圖14-8所示的提示信息,表示添加了4個條目到目錄數據庫中。
圖14-8 添加初始條目
提示:如果以上命令執行不成功,需要逐個字符檢查wyh.com.ldif文件中的內容,特別注意空格的問題。
14.4.2 查詢
添加到目錄中的條目被保存在目錄數據庫,在Linux命令界面下,可使用OpenLDAP客戶端工具ldapsearch命令來進行查詢。該命令的格式如下:
ldapsearch 選項 過濾 屬性值
常用的選項有以下幾個。
● -x:進行簡單認證。
● -D:用來綁定服務器的dn。
● -w:綁定dn的密碼。
● -b:指定要查詢的根節點。
● -H:制定要查詢的服務器。
使用ldapsearch命令查詢“dc=wyh, dc=com”下的所有條目,可使用以下命令:
# ldapsearch -x -b "dc=wyh,dc=com"
執行結果如圖14-9所示。
圖14-9 查詢所有條目
而如果使用以下命令,將查詢顯示sn中以字符wu開頭的條目,將得到如圖14-10所示的查詢結果,只找到一個條目。
# ldapsearch -x -b 'dc=wyh,dc=com' 'sn=wu*'
圖14-10 查詢單個條目
14.4.3 修改條目
使用OpenLDAP客戶端工具ldapmodify命令可對目錄數據庫中的條目進行修改。該命令的格式如下:
ldapmodify 選項
該命令的選項也很多,常用選項與ldapadd類似,這里就不再列出了。
提示:使用ldapmodify命令不能修改條目的dn,但可以修改其他屬性值。
使用ldapmodify命令修改條目信息可以有兩種方式:一種是交互式進行修改,另一種是通過文件進行修改。
1.交互式修改
修改前面創建的條目“cn=test, ou=managers, dc=wyh, dc=com”,將其sn屬性修改為“Test User Modify”,並添加一個description屬性,設置其值為“add Attribute”。
首先輸入以下命令,進行修改狀態:
# ldapmodify -x -D "cn=Manager,dc=wyh,dc=com" -w secret
執行以上命令后,終端將等候用戶輸入需要修改條目的dn,輸入以下內容:
dn: cn=test, ou=managers, dc=wyh, dc=com
changetype: modify
replace: sn
sn: Test User Modify
-
add: description
description : add Attribute
以上輸入內容中,第1行查找需要修改的條目,第2行設置修改模式,第3行設置需要替換的屬性sn,第4行給屬性sn重新設置一個值,替換該屬性原有的值,第5行用一個短橫線分隔,第6行添加一個屬性description,第7行設置新添加屬性description的值。
輸入完以上內容之后再按Enter鍵,程序將按以上設置更新數據,然后按Ctrl+C鍵退出修改命令。執行過程如圖14-11所示。
圖14-11 修改條目
使用以上命令修改條目的數據之后,可使用以下命令查看是否修改成功:
# ldapsearch -x -b 'dc=wyh,dc=com' 'sn=test'
執行以上命令查看test條目的數據如圖14-12所示,可以看到sn屬性被修改了,同時添加了一個description屬性。
圖14-12 查看修改部分
2.通過文件修改
通過前面的方式對條目進行修改時,很不方便,如果在交互方式時輸錯了某個字符,只能中斷命令后重新進行修改。因此,更好的修改方法是首先將修改時輸入的文字保存到一個文件中,然后以該文件作為輸入進行修改。用這種方式進行操作,首先需要創建一個臨時文件,用來保存需要進行的修改操作,下面演示這種方式的修改過程。
【實例14-3】 通過修改命令將前面LDAP數據庫中的信息還原,即將sn屬性由“Test User Modify”修改為“Test User”,並將description屬性刪除。
具體操作步驟如下:
(1)使用vi編輯器創建一個文件modify,在其中輸入以下內容:
dn: cn=test,ou=managers,dc=wyh,dc=com
changetype: modify
replace: sn
sn: Test User
-
delete: description
-
從以上輸入內容可看到,與在交互式時輸入的內容完全相同。
技巧:使用文件方式修改條目,可方便修改和檢查,若某個地方有輸入錯誤,可修改后再調用ldapmodify進行修改,減少輸入量。
(2)使用以下命令調用modify的內容進行修改:
# ldapmodify -x -D "cn=Manager,dc=wyh,dc=com" -w secret -f modify
執行結果如圖14-13所示。
圖14-13 用文件修改條目
14.4.4 刪除條目
對於目錄數據庫中不用的條目,也可使用ldapdelete命令將其刪除。該命令的格式如下:
ldapdelete 選項 刪除條目
該命令使用的選項與ldapadd類似,就不再列出來了。
刪除目錄數據庫中的“cn=test, ou=managers, dc=wyh, dc=com”條目,具體命令如下:
# ldapdelete -x -D "cn=Manager,dc=wyh,dc=com" -w secret /
> "cn=test,ou=managers,dc=wyh,dc=com"
順利執行以上命令后,終端上將不會有任何信息輸出,表示完成了刪除操作。
使用ldapdelete命令只能刪除樹形結構中的葉結點條目,如果刪除非葉結點條目,將出現錯誤提示。例如,執行以下命令刪除根結點“dc=wyh,dc=com”,由於根結點下面還有結點,將顯示如圖14-14所示的錯誤提示信息:
圖14-14 刪除非葉結點
# ldapdelete -x -D "cn=Manager,dc=wyh,dc=com" -w secret /
> "dc=wyh,dc=com"
14.4.5 數據導出
通過ldapadd命令可向目錄數據庫中添加數據,在某些情況下,可能還需要進行反向操作,即將目錄數據庫中的數據導出。
使用ldapsearch命令對目錄數據庫進行搜索,然后通過重定向將搜索結果保存到一個文件中,可達到導出數據的目的。另外,導出數據更常用的是slapcat命令,該命令的格式如下:
slapcat 選項
最常用的選項就是-l,表示導出為LDIF文件格式。
如將本章前面例子中創建的目錄數據庫導出為export.ldif文件,可使用以下命令:
# slapcat -l export.ldif
執行以上命令將在當前工作目錄得到文件export.ldif,打開文件可看到以下所示內容:
dn: dc=wyh,dc=com
objectClass: top
objectClass: dcObject
objectClass: organization
dc: wyh
o: wyh,Inc.
structuralObjectClass: organization
entryUUID: 5213bf36-4851-102e-8dc0-856b03ac5474
creatorsName: cn=Manager,dc=wyh,dc=com
createTimestamp: 20091008122451Z
entryCSN: 20091008122451Z#000000#00#000000
modifiersName: cn=Manager,dc=wyh,dc=com
modifyTimestamp: 20091008122451Z
dn: ou=managers,dc=wyh,dc=com
ou: managers
objectClass: organizationalUnit
structuralObjectClass: organizationalUnit
entryUUID: 52148fc4-4851-102e-8dc1-856b03ac5474
creatorsName: cn=Manager,dc=wyh,dc=com
createTimestamp: 20091008122451Z
entryCSN: 20091008122451Z#000001#00#000000
modifiersName: cn=Manager,dc=wyh,dc=com
modifyTimestamp: 20091008122451Z
dn: cn=wyh,ou=managers,dc=wyh,dc=com
cn: wyh
sn: wuyunhui
objectClass: person
structuralObjectClass: person
structuralObjectClass: person
entryUUID: 5215a92c-4851-102e-8dc2-856b03ac5474
creatorsName: cn=Manager,dc=wyh,dc=com
createTimestamp: 20091008122451Z
entryCSN: 20091008122451Z#000002#00#000000
modifiersName: cn=Manager,dc=wyh,dc=com
modifyTimestamp: 20091008122451Z
提示:從導出結果可看出,除了使用ldapadd命令添加到目錄數據庫中的條目數據外,還導出了很多其他信息,包括條目錄UUID、時間戳等信息。