LDAP協議數據庫
目錄是一組具備相似屬性、以必定邏輯和層次組合的信息。常見的例子是通信簿,由以字母順序排列的名字、地址和電話號碼組成。
目錄服務是一種在分佈式環境中發現目標的方法。目錄具備兩個主要組成部分:編程
第一部分是數據庫,數據庫是分佈式的,且擁有一個描述數據的規劃。服務器
第二部分則是訪問和處理數據的各類協議。網絡
目錄服務其實也是一種數據庫系統,只是這種數據庫是一種樹形結構,而不是一般使用的關係數據庫。目錄服務與關係數據庫之間的主要區別在於:兩者都容許對存儲數據進行訪問,只是目錄主要用於讀取,其查詢的效率很高,而關係數據庫則是爲讀寫而設計的。
提示:目錄服務不適於進行頻繁的更新,屬於典型的分佈式結構。
LDAP是一個目錄服務協議,目前存在衆多版本的LDAP,而最多見的則是V2和V3兩個版本,它們分別於1995年和1997年首次發佈。數據結構
LDAP的基本模型app
LDAP的基本模型是創建在「條目」(Entry)的基礎上。一個條目是一個或多個屬性的集合,而且具備一個全局惟一的「可區分名稱」(用dn表示)。與關係型數據(後面簡稱數據庫)進行類比,一個條目至關於數據庫中的一條記錄,而dn至關於數據庫中記錄的關鍵字,屬性至關於數據庫中的字段。
提示:dn必須是全局惟一的。
LDAP中,將數據組織成一個樹形結構,這與現實生活中的不少數據結構能夠對應起來,而不像設計關係型數據庫的表,須要進行多種變化。例如,圖1-1所示就是一個樹形結構的數據。負載均衡
在圖1-1所示的樹形結構中,樹的根結點是一個組織的域名(dlw.com),其下分爲3個部分,分別是managers、people和group,可將這3個組看做組織中的3個部門,如managers用來管理全部管理人員,people用來管理登陸系統的用戶,group用來管理系統中的用戶組。固然,在該圖中還可繼續增長其餘分支。
對於圖1-1所示的樹形結構,使用關係數據庫來保存數據的話,須要設置多個表,一層一層分別保存,當須要查找某個信息時,再逐層進行查詢,最終獲得結果。
若使用目錄來保存該圖中的數據,則更直觀。圖中每一個結點用一個條目來保存,不一樣類型的結點須要保存的數據可能不一樣,在LDAP中經過一個稱爲objectClass的類型來控制不一樣結點須要的數據(稱爲屬性)。
對於目錄中的數據怎樣進行引用呢?前面提到過,每個條目都有一個dn,由於dn是惟一的,所以就可找到須要結點的數據。dn的構造方式以下:
首先獲得條目本身的名稱(rdn,稱爲相對dn),而後開始向上逐級查找父結點,一直到根項爲止。例如,對於圖1-1中最右下方的結點,其dn爲:dom
dn: cn=ldap, ou=group, o=dlw.com 分佈式
經過這樣的方式,便可惟一標識每個結點。
在現實生活中,有不少這種樹形結構的數據,如計算機文件系統的目錄結構、Internet中的域名等。這些類型的數據,只要不須要頻繁的更新,都適合用目錄來保存。
LDAP的功能
在LDAP的功能模型中定義了一系列利用LDAP協議的操做,主要包含如下4部分:
查詢操做 :容許查詢目錄和取得數據,其查詢性能比關係數據庫好。
更新操做 :目錄的更新操做不要緊數據庫方便,更新性能較差,但也一樣容許進行添加、刪除、修改等操做。
複製操做 :前面也提到過,LDAP是一種典型的分佈式結構,提供複製操做,可將主服務器的數據的更新複製到設置的從服務器中。
認證和管理操做 :容許客戶端在目錄中識別本身,而且可以控制一個會話的性質。
LDAP協議的特色
LDAP是一種目錄服務,保存在特殊的數據庫中,數據的讀取速度遠高於寫入速度。
LDAP對查詢作了優化,讀取速度優於普通關係數據庫。
LDAP不支持事務、不能進行回滾,須要進行這些操做的應用只有選擇關係數據庫。
LDAP採用服務器/客戶端模式,支持分佈式結構。
LDAP中的條目以樹形結構組織和存儲。
LDAP基於Internet協議,直接運行在簡單和通用的TCP/IP或其餘可靠的傳輸協議層上,使鏈接的創建和包的處理簡單、快捷,對於互聯網和企業網應用都很方便。
LDAP協議簡單,經過使用查找操做實現列表操做和讀操做。
LDAP經過引用機制實現分佈式訪問,經過客戶端API實現分佈式操做(對於應用透明),平衡了負載。
LDAP實現具備低費用、易配置和易管理的特色,並提供了知足應用程序對目錄服務所需求的特性。
安裝OpenLDAP
在RHEL 5的安裝光盤中提供了OpenLDAP 2.3.27軟件包,經過OpenLDAP軟件可實現LDAP服務。OpenLDAP程序包括客戶端、服務器、開發工具包等軟件包,本節將介紹安裝這些程序包的具體過程。
能夠先經過rpm命令查詢系統中是否已安裝OpenLDAP服務器程序,若未安裝該服務器程序,再使用rpm命令從RHEL光盤中安裝該程序。
從RHEL 5安裝光盤中找到OpenLDAP服務器程序,並安裝到當前系統中。
具體操做步驟以下:
(1)在進行安裝之前,首先使用如下命令建立管理OpenLDAP的用戶和組。
# groupadd ldap
# useradd -g ldap ldap
# passwd ldap
(2)執行如下命令,查詢系統中是否已安裝openldap-servers程序。
# rpm -qa openldap-servers
若無任何輸出,則表示當前系統中未安裝openldap-servers服務器程序。
(3)使用如下命令將RHEL安裝光盤掛載到系統中:
# mount /dev/cdrom /mnt/cdrom
(4)執行如下命令安裝openldap-servers程序的依賴程序包libtools-ltdl:
# rpm -ivh /mnt/cdrom/Server/libtool-ltdl-1.5.22-6.1.i386.rpm
若不執行上面的命令,直接執行下一步的安裝命令,將提示有依賴程序未安裝。
(5)執行如下命令安裝openldap-servers程序:
# rpm -ivh /mnt/cdrom/Server/openldap-servers-2.3.27-5.i386.rpm
這樣就將openldap-servers服務器程序安裝到系統中了。整個安裝過程以下圖所示。
(6)使用如下命令修改保存數據的目錄/var/lib/ldap/及其文件的全部者,並修改權限,只有ldap用戶纔對數據有讀寫權限:
# chown ldap.ldap /var/lib/ldap
# chmod -R 600 /var/lib/ldap
在光盤中還有如下與openldap有關的軟件包,也可以使用相似命令進行安裝,這裏再也不逐個介紹。
● openldap-clients-2.3.27-5.i386.rpm:客戶端操做的相關程序。
● openldap-devel-2.3.27-5.i386.rpm:開發包。
測試安裝正確性
安裝完成後,將在/var/lib/目錄中建立一個子目錄ldap來保存數據,同時在/etc/目錄中也將建立一個子目錄openldap來保存配置文件。而openldap的守護進程slapd則保存在/usr/bin/目錄中。
提示:若是是經過源代碼進行編譯安裝的openldap,這些程序文件放置的位置可能不一樣。
1.啓動服務進程
要檢查安裝是否正確,可直接運行守護進程,這裏將使用默認的配置。
啓動OpenLDAP服務器可以使用如下命令之一:
# server ldap start
# /etc/rc.d/init.d/ldap
# /usr/sbin/slapd
使用第1條命令來啓動ldap服務進程的過程以下圖所示。
提示:使用/usr/sbin/slapd命令啓動服務程序是最好的一種方式,若是用前兩條命令啓動openldap服務程序失敗,可以使用最後一條命令試一下。
從上圖可看出,啓動的是slapd進程,並有一個提示信息,提示沒有DB_CONFIG文件。可經過如下命令將DB_CONFIG文件複製到/var/lib/ldap/目錄中:
# cp /etc/openldap/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
另外,因爲使用的是默認配置文件,提示但願使用後綴「dc=my-domain, dc=com」。下節將介紹修改配置文件的操做。
2.查看監聽端口
OpenLDAP使用的監聽端口是389,經過netstat命令查看該端口是否處於監聽狀態,可瞭解slapd進程是否在工做。具體命令以下:
# netstat –tnlp | grep 389
執行結果以下圖所示,能夠看出,389端口處於監聽狀態,表示slapd進程正在工做。
3.搜索測試
slapd服務進程啓動後,可以使用OpenLDAP客戶端的一個搜索命令進行一次搜索,以檢查服務的配置是否正確。
使用如下命令進行搜索:
# ldapsearch -x -b '' -s base '(objectclass=*)'
注意:-b後面是兩個單引號,用來阻止特殊字符被Shell解析。
因爲還未向LDAP服務器中添加任何數據,所以,系統中應該只有「根」這個條目,執行以上搜索的結果以下圖所示。
從以上測試可看出,OpenLDAP已經正確安裝到系統中,接下來就須要修改配置文件,設置LDAP的根目錄了。
配置OpenLDAP
在上面的例子中的搜索結果可看出,在配置文件中是以默認的「dc=my-domain, dc=com」做爲後綴,須要對其進行修改,固然也還須要修改其餘的一些配置。下面將介紹對配置文件的修改操做。
slapd.conf
OpenLDAP的配置文件位於/etc/openldap/目錄中,名稱爲slapd.conf。該文件內容較多,一般只須要修改幾個地方便可,包括修改後綴、管理員及其密碼。其初始內容以下:
#######################################################################
# ldbm and/or bdb database definitions
#######################################################################
database bdb
suffix "dc=my-domain,dc=com"
rootdn "cn=Manager,dc=my-domain,dc=com"
# Cleartext passwords, especially for the rootdn, should
# be avoided. See slappasswd(8) and slapd.conf(5) for details.
# Use of strong authentication encouraged.
# rootpw secret
# rootpw {crypt}ijFYNcSNctBYg
其中各語句的含義以下:
● 以符號「#」開始的行是註釋行,第1~3行、第8~12行都是。
● 第5行設置數據庫,可以使用ldbm或bdb。
● 第6行設置後綴。
● 第7行設置超級管理員的名稱,與Linux系統中的root相似。在配置時用該用戶,配置完成後,建議將其刪除。
● 第11行設置超級管理員的密碼,默認狀態是被註釋了的。這行的密碼是明文狀態。
● 第12行也是設置超級管理員的密碼,這行是以加密方式設置的(默認狀態也是被註釋了的)。
根據實際狀況,修改第六、七、11行便可,具體以下:
#######################################################################
# ldbm and/or bdb database definitions
#######################################################################
database bdb
suffix "dc=dlw,dc=com"
rootdn "cn=root,dc=dlw,dc=com"
# Cleartext passwords, especially for the rootdn, should
# be avoided. See slappasswd(8) and slapd.conf(5) for details.
# Use of strong authentication encouraged.
rootpw secret
# rootpw {crypt}ijFYNcSNctBYg
以上內容中,第6行將後綴修改成「dc=dlw,dc=com」,同時第7行的超級管理員的後綴部分也須要隨之修改。將第11行的註釋取消,設置超級管理員的密碼爲MD5密碼secret。
修改密碼時須要注意rootpw前面不要有空格,以及rootpw與密碼之間使用Tab鍵分割。
通過以上修改,保存後退出,接着使用如下命令重啓slapd進程:
# service ldap restart
瞭解schema
對於LDAP目錄中保存的信息,可使用LDIF(LDAP Interchange Format)格式來保存。這是一種標準文本文件格式,使用這種格式保存得的LDAP服務器數據庫中的數據可方便讀取和修改,這也是其餘大多數服務配置文件所採起的格式。
LDIF文件經常使用來向目錄導入或更改記錄信息,這些信息須要按照LDAP中schema的格式進行組織,並會接受schema的檢查,不符合其要求的格式將會出現報錯信息。有關LDIF文件的格式和建立將在第4章進行介紹,這裏簡單介紹一下組織LDAP數據格式的schema文件。
在LDAP中,schema用來指定一個目錄中所包含的對象(objects)的類型(objectClass),以及每個類型(objectClass)中必須提供的屬性(Atrribute)和可選的屬性。可將schema理解爲面向對象程序設計中的類,經過類定義一個具體的對象。LDIF中的數據條目可理解爲是一個具體的對象,是經過schema來規劃建立的。所以,schema是一個數據模型,用來決定數據按什麼方式存儲,並定義存儲在不一樣的條目(Entry)下的數據之間的關係。schema須要在主配置文件slapd.conf中指定,以用來決定在目錄中可使用哪些objectClass。
在/etc/openldap/schema/目錄中提供了許多schema文件,只須要在配置文件slapd.conf中使用include命令將須要使用的schema包含便可。例如,配置文件默認包含了如下schema文件:
寫道include /etc/openldap/schema/core.schema
include /etc/openldap/schema/cosine.schema
include /etc/openldap/schema/inetorgperson.schema
include /etc/openldap/schema/nis.schema
提示:一般使用系統提供的schema就可解決大部分應用。管理員也能夠本身設計制定schema,通常包括屬性定義(AttributeDefinition)、類定義(ClassDefinition)以及語法定義(SyntaxDefinition)等部分。這裏就不介紹具體的設計方法了。
管理OpenLDAP
啓動OpenLDAP服務器程序以後,接下來的操做就是經過客戶端程序對目錄進行操做,包括添加、修改、刪除和搜索數據等操做。能對LDAP進行操做的客戶端程序不少,下面簡單介紹在Linux命令方式下進行這些操做的方法。
向目錄數據庫中添加數據
初始狀態下,LDAP是一個空目錄,即沒有任何數據。可經過程序代碼向目錄數據庫中添加數據,也可以使用OpenLDAP客戶端工具ldapadd命令來完成添加數據的操做,該命令可將一個LDIF文件中的條目添加到目錄。所以,須要首先建立一個LDIF文件,而後再進行添加操做。
1.LDIF文本條目格式
LDIF用文本格式表示目錄數據庫的信息,以方便用戶建立、閱讀和修改。在LDIF文件中,一個條目的基本格式以下:
寫道# 註釋
dn: 條目名
屬性描述: 值
屬性描述: 值
屬性描述: 值
... ...
dn行相似於關係數據庫中一條記錄的關鍵字,不能與其餘dn重複。一個LDIF文件中能夠包含多個條目,每一個條目之間用一個空行分隔。
例如,如下內容組成一個條目:
寫道1: dn: dc=dlw, dc=com
2: objectclass: top
3: objectclass: dcobject
4: objectclass: organization
5: dc: dlw
6: o: dlw,Inc.
在以上文本中,各行含義以下:
第1行的dn定義該條目的標識。
第2~4行定義該條目的objectcCass,能夠定義多個屬性,如上面代碼中定義了3個objectClass。條目的屬性根據objectClass的不一樣而不一樣,有的objectClass有必須設置的屬性。在2~4行的3個objectClass中,top沒有必須定義的屬性,dcobject必須定義屬性dc,用來表示一個域名的部分,而organization必須定義屬性o,用來表示一個組織的名稱。
根據objectClass的要求,第五、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含義以下:
● 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來表示系統中一個用戶的條目,對於系統中用戶一般須要有這樣一些信息:姓名、電話、密碼、描述等。以下圖所示,對於person,經過cn和sn設置用戶的名和姓,這是必須設置的,而其餘屬性則是可選的。
下面列出部分經常使用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文件,編輯須要向目錄數據庫添加的條目了。
下面根據以下圖所示的結構,建立LDIF文件dlw.com.ldif。
對上圖進行分析,該目錄結構分爲3層,有4個結點。根據上圖可建立LDIF文件以下:
提示:每一個結點可用一個dn表示,對於每一個結點,又可繼續添加新的結點。如在根結點中可添加其餘部門ou,在ou=managers結點也可繼續添加其餘管理人員的信息。
寫道1: dn:dc=dlw,dc=com
2: objectclass:top
3: objectclass:dcobject
4: objectclass:organization
5: dc:dlw
6: o:dlw,Inc.
7:
8: dn:ou=managers, dc=dlw, dc=com
9: ou:managers
10: objectclass:organizationalUnit
11:
12: dn:cn=dlw,ou=managers,dc=dlw,dc=com
13: cn:dlw
14: sn:dongliwei
15: objectclass:person
16:
17: dn:cn=test,ou=managers,dc=dlw,dc=com
18: cn:test
19: sn:Test User
20: objectclass:person
以上文件中各行的含義以下:
第1~6行建立根結點,這部分在前面也有介紹,就再也不重複了。
第七、十一、16行爲空行,用來分隔4個dn條目(4個結點)。
第8~10行定義cn=managers結點的條目,該條目的objectClass爲organizationalUnit,所以須要用ou屬性定義組織名稱。
第12~15行定義cn=dlw結點的條目,該條目使用的objectClass爲person,所以需設置cn和sn兩個屬性值。
第17~20行與第12~15行的意義相同。
在以上LDIF文件中,第一、八、十二、17行以dn開頭,這部份內容必須惟一,而且在向目錄數據庫添加這些數據時,也要確保這些數據不能與目錄數據庫中已有數據相同,不然,添加操做將中斷。
5.從LDIF文件添加到目錄數據庫
使用OpenLDAP客戶端工具ldapadd命令,可將LDIF文件中的條目添加到目錄數據庫中,該命令的格式以下:
ldappadd 選項 LDIF文件
在ldappadd命令中經常使用的選項以下:
-x:進行簡單認證。
-D:用來綁定服務器的dn。
-h:目錄服務的地址。
-w:綁定dn的密碼。
-f:使用LDIF文件進行條目添加的文件。
將前面編寫的LDIF文件的條目數據添加到目錄數據庫中。
具體操做步驟以下:
(1)檢查dlw.com.ldif文件中的內容,須要注意的是,每一個冒號後面都須要空一格,而每行結束處不能留有空格字符。
(2)使用如下命令將dlw.com.ldif文件中的條目添加到目錄中:
寫道# ldapadd -x -D "cn=root,dc=dlw,dc=com" -w secret -f dlw.com.ldif
執行以上命令,若是添加操做正常完成,將顯示以下圖所示的提示信息,表示添加了4個條目到目錄數據庫中。
提示:若是以上命令執行不成功,須要逐個字符檢查dlw.com.ldif文件中的內容,特別注意空格的問題。
查詢
添加到目錄中的條目被保存在目錄數據庫,在Linux命令界面下,可以使用OpenLDAP客戶端工具ldapsearch命令來進行查詢。該命令的格式以下:
ldapsearch 選項 過濾 屬性值
經常使用的選項有如下幾個:
● -x:進行簡單認證。
● -D:用來綁定服務器的dn。
● -w:綁定dn的密碼。
● -b:指定要查詢的根節點。
● -H:制定要查詢的服務器。
使用ldapsearch命令查詢「dc=dlw, dc=com」下的全部條目,可以使用如下命令:
# ldapsearch -x -b "dc=dlw,dc=com"
執行結果以下圖所示。
而若是使用如下命令,將查詢顯示sn中以字符wu開頭的條目,將獲得以下圖所示的查詢結果,只找到一個條目。
# ldapsearch -x -b 'dc=dlw,dc=com' 'sn=wu*'
修改條目
使用OpenLDAP客戶端工具ldapmodify命令可對目錄數據庫中的條目進行修改。該命令的格式以下:
ldapmodify 選項
該命令的選項也不少,經常使用選項與ldapadd相似,這裏就再也不列出了。
提示:使用ldapmodify命令不能修改條目的dn,但能夠修改其餘屬性值。
使用ldapmodify命令修改條目信息能夠有兩種方式:一種是交互式進行修改,另外一種是經過文件進行修改。
1.交互式修改
修改前面建立的條目「cn=test, ou=managers, dc=dlw, dc=com」,將其sn屬性修改成「Test User Modify」,並添加一個description屬性,設置其值爲「add Attribute」。
首先輸入如下命令,進行修改狀態:
# ldapmodify -x -D "cn=root,dc=dlw,dc=com" -W secret
執行以上命令後,終端將等候用戶輸入須要修改條目的dn,輸入如下內容:
dn: cn=test, ou=managers, dc=dlw, dc=com
changetype: modify
replace: sn
sn: Test User Modify
以上輸入內容中,第1行查找須要修改的條目,第2行設置修改模式,第3行設置須要替換的屬性sn,第4行給屬性sn從新設置一個值,替換該屬性原有的值。
輸入完以上內容以後再按Enter鍵,程序將按以上設置更新數據,而後按Ctrl+C鍵退出修改命令。執行過程以下圖所示。
使用以上命令修改條目的數據以後,可以使用如下命令查看是否修改爲功:
#ldapsearch -x -b 'dc=dlw,dc=com' 'cn=test'
執行以上命令查看test條目的數據以下圖所示,能夠看到sn屬性被修改了。
2.經過文件修改
經過前面的方式對條目進行修改時,很不方便,若是在交互方式時輸錯了某個字符,只能中斷命令後從新進行修改。所以,更好的修改方法是首先將修改時輸入的文字保存到一個文件中,而後以該文件做爲輸入進行修改。用這種方式進行操做,首先須要建立一個臨時文件,用來保存須要進行的修改操做,下面演示這種方式的修改過程。
【例子】 經過修改命令將前面LDAP數據庫中的信息還原,即將sn屬性由「Test User Modify」修改成「Test User」。
具體操做步驟以下:
(1)使用vi編輯器建立一個文件modify,在其中輸入如下內容:
dn: cn=test,ou=managers,dc=dlw,dc=com
changetype: modify
replace: sn
sn: Test User
從以上輸入內容可看到,與在交互式時輸入的內容徹底相同。
技巧:使用文件方式修改條目,可方便修改和檢查,若某個地方有輸入錯誤,可修改後再調用ldapmodify進行修改,減小輸入量。
(2)使用如下命令調用modify的內容進行修改:
# ldapmodify -x -D "cn=root,dc=dlw,dc=com" -w secret -f modify
執行結果以下圖所示。
刪除條目
對於目錄數據庫中不用的條目,也可以使用ldapdelete命令將其刪除。該命令的格式以下:
ldapdelete 選項 刪除條目
該命令使用的選項與ldapadd相似,就再也不列出來了。
刪除目錄數據庫中的「cn=test,ou=managers,dc=dlw,dc=com」條目,具體命令以下:
# ldapdelete -x -D "cn=root,dc=dlw,dc=com" -w secret \
> "cn=test,ou=managers,dc=dlw,dc=com"
順利執行以上命令後,終端上將不會有任何信息輸出,表示完成了刪除操做。
使用ldapdelete命令只能刪除樹形結構中的葉結點條目,若是刪除非葉結點條目,將出現錯誤提示。例如,執行如下命令刪除根結點「dc=dlw,dc=com」,因爲根結點下面還有結點,將顯示以下圖所示的錯誤提示信息:
# ldapdelete -x -D "cn=root,dc=dlw,dc=com" -w secret "dc=dlw,dc=com"
數據導出
經過ldapadd命令可向目錄數據庫中添加數據,在某些狀況下,可能還須要進行反向操做,即將目錄數據庫中的數據導出。
使用ldapsearch命令對目錄數據庫進行搜索,而後經過重定向將搜索結果保存到一個文件中,可達到導出數據的目的。另外,導出數據更經常使用的是slapcat命令,該命令的格式以下:
slapcat 選項
最經常使用的選項就是-l,表示導出爲LDIF文件格式。
如將本章前面例子中建立的目錄數據庫導出爲export.ldif文件,可以使用如下命令:
#slapcat -l export.ldif
執行以上命令將在當前工做目錄獲得文件export.ldif,打開文件將顯示以下圖所示的內容:
提示:從導出結果可看出,除了使用ldapadd命令添加到目錄數據庫中的條目數據外,還導出了不少其餘信息,包括條目錄UUID、時間戳等信息。
設置主從LDAP服務器
在某些時候,爲了對LDAP服務器進行負載均衡,可能但願設置多臺LDAP服務器。對於設置多臺LDAP服務器的關鍵問題是數據的同步問題,使用slurpd進程可進行主LDAP服務器向從LDAP服務器複製數據的操做。下面將介紹架設主從LDAP服務器的過程。
多臺LDAP服務器工做過程
對於多臺LDAP服務器,可設置一臺爲主服務器,其餘的爲從服務器。本節介紹一臺從服務器的配置,如果多臺從服務器也可按此步驟進行操做。
注意:在進行配置以前應首先確保每一個LDAP服務器都已安裝好OpenLDAP服務器程序,並能正確工做。
經過本節下面介紹的方法配置好主從LDAP服務器以後,在主服務器運行slurpd進程,該進程使用LDAP協議從主服務器的數據庫更新從服務器的數據,具體操做過程以下:
(1)LDAP客戶端向從服務器提交一個LDAP修改請求。
(2)從服務器給LDAP客戶端返回一個指向主服務器的引用。
(3)LDAP客戶端向主服務器提交LDAP修改請求。
(4)主服務器對數據庫中的數據進行修改,並將改變寫入本機的日誌文件。
(5)在主服務器運行的slurpd進程檢查到日誌中有新內容,經過日誌的信息將改變發送給從服務器。
(6)從服務器接收slurpd發來的信息,對本地數據進行修改。
以上過程就是使用slurpd進程進行數據複製的過程。從以上過程可看出,須要在主服務器的配置文件中設置要向哪些從服務器發送複製信息、主服務器還要設置一個記錄數據改變的日誌文件,而從服務器須要設置一個指向主服務器的連接。
複製數據庫
首先,把主從服務器關閉。經過如下三步操做靜態同步主從服務器上的數據:
把主服務器上/var/lib/ldap目錄下的全部數據庫文件所有拷貝到從服務器的同目錄中,覆蓋原有文件。
把主服務器上的/etc/ldap/schema目錄下的全部schema文件拷貝到從服務器的同目錄中,覆蓋原有文件。
把主服務器上/etc/ldap/slapd.conf文件拷貝到從服務器的同目錄中,覆蓋原有文件。
設置主服務器
配置主服務器上的slapd.conf文件,取消replogfile指令前的註釋符號,取消後的結果以下:
# Replicas of this database
replogfile /var/lib/ldap/replog
增長replica指令,如:
#replace config
replica uri=ldap://192.168.14.21:389 #指定從服務器主機名和端口號
binddn="cn=root,dc=dlw,dc=com" #指定需同步的DN的管理員
bindmethod=simple credentials=111111 #指定驗證方式和需同步的DN的管理員密碼
設置從服務器
配置從服務器上的slapd.conf文件,增長updatedn指令,如:
updatedn " cn=root,dc=dlw,dc=com" #與主服務器的binddn對應
在從服務器的配置文件中,不要包含replica和replogfile指令。
測試主從LDAP服務器
通過以上步驟的操做,主從LDAP服務器都已準備好,接下來就能夠測試相關操做。
1.啓動主LDAP服務器
在主LDAP服務器中啓動slapd進程和slurpd進程。
2.啓動從LDAP服務器
在主LDAP服務器中啓動slapd進程。
【例子】測試主從LDAP服務器。
具體操做步驟以下:
(1)在主LDAP服務器中使用如下命令修改一個條目:
#ldapmodify -x -D "cn=root,dc=dlw,dc=com" -w secret
輸入如下內容,修改cn=dlw條目的內容:
dn: cn=dlw,ou=managers,dc=dlw,dc=com
changetype: modify
replace: sn
sn: dongliwei
輸入後按Enter鍵完成修改,操做過程如圖5-7所示(將sn修改成dongliwei)。
(2)在從LDAP服務器中進行操做,查看主LDAP服務器中的操做是否被複制到從LDAP服務器中來了。在從LDAP服務器中使用如下命令進行查詢:
#ldapsearch -x -b "dc=dlw,dc=com" "cn=dlw"
執行結果以下圖所示,從圖中可看到其中的sn也被修改成dongliwei了(數據庫中原來的內容爲zhangsan.modi,是前面例子中修改的值),即被主LDAP服務器進行了同步複製。
OpenLDAP在用戶認證的應用
OpenLDAP常常用在用戶登陸認證方面,經過LDAP的數據複製功能,可以讓用戶使用一個帳戶登陸網絡中使用LDAP服務的全部服務器。在主LDAP服務器中設置好用戶帳戶數據,而後經過在網絡中的任意客戶端均可使用設置的帳號進行登陸操做。下面將簡單介紹將用戶認證遷移到LDAP的操做方法。
用戶認證用到的ojbectClass
在LDAP中用來保存用戶認證條目的objectClass主要有如下3個,分別用來保存組、用戶、密碼等信息到目錄的條目中。
posixGroup:可設置屬性cn、userPassword、gidNumber等。
posixAccount:可設置屬性cn、gidNumber、uid、uidNumber、homeDirectory、loginShell等。
shadowAccount:可設置屬性uid、shadowExpire、shadowFlag、shadowInactive、shadowLastChange、shadowMax、shadowMin、shadowWarning、userPassword等。
提示:從上面列出的屬性的名稱能夠很容易地與組、用戶的相關信息聯繫起來。
使用遷移工具
要使用LDAP進行用戶認證,首先應該考慮的就是數據遷移的工做量。若是要操做員從/etc/passwd和/etc/group文件中逐個將信息從新錄入,工做量將很是大。
OpenLDAP爲用戶考慮到了這些遷移工做,提供了多個遷移工具的腳本程序,這些程序位於/usr/share/openldap/migration/目錄中,在該目錄中有不少擴展名爲pl和sh的腳本文件,經過這些遷移工具,能夠很方便地將系統中的用戶遷移到LDAP目錄數據庫中。下面介紹具體的遷移步驟。
【例子】 將系統中的用戶信息遷移到LDAP目錄數據庫中。
具體操做步驟以下:
(1)修改/usr/share/openldap/migration/migrate_common.ph文件,在其中查找如下內容:
$DEFAULT_BASE="dc=padl,dc=com";
將其修改成目錄服務器使用的根,如本章使用的例子要改成如下形式:
$DEFAULT_BASE="dc=dlw,dc=com";
保存後退出。
(2)使用如下命令執行腳本migrate_base.pl,用來建立根項,併爲Hosts、Networks、Group和People等建立低一級的組織單元(執行該命令將生成base.ldif文件):
#./migrate_base.pl > base.ldif
(3)因爲本章前面已在LDAP服務器中建立了根項「dc=dlw,dc=com」,所以將base.ldif文件中的第1個條目刪除,另外,在用戶認證中只用到組和用戶,也將其餘無關條目刪除,只保存如下內容(例子):
dn: ou=People,dc=dlw,dc=com
ou: People
objectClass: top
objectClass: organizationalUnit
dn: ou=Group,dc=dlw,dc=com
ou: Group
objectClass: top
objectClass: organizationalUnit
(4)使用如下命令將base.ldif文件中的條目導入目錄數據庫:
# ldapadd -x -D "cn=root,dc=dlw,dc=com" -w secret -f base.ldif
執行結果以下圖所示。
(5)開始遷移組信息。使用如下命令將/etc/group中的組信息保存到臨時文件group.tmp中:
#cat /etc/group > group.tmp
(6)系統組不導入LDAP目錄數據庫中,所以需對group.tmp文件中的信息進行編輯,只保留須要導入LDAP目錄數據庫的組的信息。
(7)使用如下命令將組的數據生成LDIF條目信息:
#./migrate_group.pl group.tmp > group.ldif
(8)使用cat命令查看group.ldif的內容,可看到已按posixGroup這種objectClass將組的數據組織完成,以下圖所示。
(9)相似地,使用如下命令導出/etc/passwd中的用戶數據,並刪除不須要的用戶,而後使用migrate_passwd.pl腳本生成LDIF文件:
#cat /etc/passwd > passwd.tmp
#./migrate_passwd.pl passwd.tmp > passwd.ldif
#cat passwd.ldif
提示:從上面列出的屬性的名稱能夠很容易地與組、用戶的相關信息聯繫起來。
(10)使用如下命令將組和用戶信息導入目錄數據庫:
#ldapadd -x -D "cn=root,dc=dlw,dc=com" -w 111111 -f group.ldif
#ldapadd -x -D "cn=root,dc=dlw,dc=com" -w 111111 -f passwd.ldif
執行以上命令的過程以下圖所示。
(11)使用如下命令查看目錄數據庫中用戶root的信息,用「uid=root」做查詢條件:
#ldapsearch -x -b 'dc=dlw,dc=com' 'uid=root'
查找結果以下圖所示。
經過以上的操做,就將須要導入的組和用戶的信息導入到了目錄數據庫中,接下來還須要對客戶端進行設置,使用LDAP進行登陸驗證操做。
設置客戶端登陸
若客戶端要使用LDAP進行用戶登陸認證,則可以使用本地計算機中不存在的用戶名進行登陸操做。
【例子】 修改配置文件,設置客戶端使用LDAP進行認證。
具體操做步驟以下:
(1)修改客戶端計算機中的/etc/sysconfig/authconfig文件,將如下項都修改成yes:
USELDAP=yes
USELDAPAUTH=yes
USEMD5=no
USESHADOW=yes
USELOCAUTHORIZE=yes
(2)修改客戶端計算機中的/etc/openldap/ldap.conf文件,修改內容以下:
host 192.168.14.20
BASE dc=dlw,dc=com
ssl off
(3)修改客戶端計算機中的/etc/nsswitch.conf文件,在passwd、shadow、group後面都加上ldap,以下圖所示。
通過以上配置之後,在客戶端就可使用LDAP目錄數據庫中的用戶信息在客戶端進行登陸操做了。登陸操做與使用本地用戶帳號相同,這裏就再也不演示了。
LDAP Schema
Schema是LDAP的一個重要組成部分,相似於數據庫的模式定義,LDAP的Schema定義了LDAP目錄所應遵循的結構和規則,好比一個 objectclass會有哪些屬性,這些屬性又是什麼結構等等,schema給LDAP服務器提供了LDAP目錄中類別,屬性等信息的識別方式,讓這些能夠被LDAP服務器識別。
在LDAP的schema中,有四個重要的元素:
Objectclass
objectclass定義了一個類別,這個類別會被不一樣的目錄(在LDAP中就是一個Entry)用到,它說明了該目錄應該有哪些屬性,哪些屬性是必須的,哪些又是可選的。一個objectclass的定義包括名稱(NAME),說明(DESC),類型(STRUCTURAL或AUXILARY ,表示是結構型的仍是輔助型的),必須屬性(MUST),可選屬性(MAY)等信息。
Objectclass格式:
objectclass = ( whsp
numericoid whsp //全局惟一的 OID
[ "NAME" qdescrs ] //類名稱
[ "DESC" qdstring ] //類描述
[ "OBSOLETE" whsp ]
[ "SUP" oids ] ; //父類
[ ( "ABSTRACT" / "STRUCTURAL" / "AUXILIARY" ) whsp ]
[ "MUST" oids ] ; //必填屬性集合
[ "MAY" oids ] //選填屬性集合
whsp ")"
例如:
# Object Class Definitions
objectclass ( 1.3.6.1.4.1.7914.1.2.2.1 NAME 'kunmailUser'
DESC 'KunMail-LDAP User'
SUP top
STRUCTURAL
MUST(username$cn$vuid$vgid)
MAY(maildir$home$clearpw$forwardAddr$quota$storeHost$delivery$mailReplyText$active))
這裏kunmailUser這種數據,要包含maildir $ home $ clearpw $ forwardAddr $ quota $ storeHost $ delivery $ mailReplyText $ active等可選項,還要包括username $ cn $ vuid $ vgid 必選項。 可選項用MAY()來包含,必選項用MUST()來包含。DESC是說明項。SUP表示父類(有點像面向對象編程啊)top表示沒有父類,他本身是頂級。STRUCTURAL是存儲方式。通常來講每一個節點都要包含一個ABSTRACT類("top" or "alias"), 至少一個STRUCTURAL類,0個或者多個AUXILIARY類。AUXILIARY表示輔助型、STRUCTURAL表示結構型(默認)、ABSTRACT表示摘要型。
下面定義一個容許將myPhoto增長到任何已經存在的條目中的auxiliary對象類:
objectclass= ( 1.1.2.2.1 NAME 'myPhotoObject'
DESC 'mixin myPhoto'
AUXILIARY
MAY myPhoto )
若是您的組織須要一個私有的結構化對象類來表示用戶,你能夠子類化任何一個已經存在的person類,好比inetOrgPerson(RFC2798),而後增長鬚要的屬性:
objectclass =( 1.1.2.2.2 NAME 'myPerson'
DESC 'my person'
SUP inetOrgPerson
MUST ( 'myUniqueName' $ 'givenName' )
MAY 'myPhoto' )
該對象類從inetOrgPerson中繼承容許的或者必須的屬性,可是,要求myUniqueName和givenName,容許myPhoto。
Attribute
attribute就是一個上面objectclass中可能包含的屬性,對其的定義包括名稱,數據類型,單值仍是多值以及匹配規則等。後面用具體的例子來講明。
Attribute格式:
attributeType ( whsp
numericoid whsp //全局惟一的 OID
[ "NAME" qdescrs ] //屬性名稱
[ "DESC" qdstring ] //屬性描述
[ "OBSOLETE" whsp ]
[ "SUP" woid ] //本屬性從其它屬性中派生出來的
[ "EQUALITY" woid //相等性匹配
[ "ORDERING" woid//順序匹配
[ "SUBSTR" woid ] //字符串匹配
[ "SYNTAX" whsp noidlen whsp ] //字段的數據類型的OID
[ "SINGLE-VALUE" whsp ] //定義本屬性爲單值(默認多值)
[ "COLLECTIVE" whsp ] //default not collective
[ "NO-USER-MODIFICATION" whsp ]//default user modifiable
[ "USAGE" whsp AttributeUsage ]//default userApplications
whsp ")"
AttributeUsage =
"userApplications" /
"directoryOperation" /
"distributedOperation" / ; DSA-shared
whsp是空格的意思(' ')。numericoid 是全局惟一的 OID,是帶.的十進制形式 (e.g. 1.1.0), qdescrs有一個或幾個意思, woid 可使名稱或者是 OID 可選擇的必定長度的後綴(e.g {10})。
例如,屬性類型name和cn在core.schema中以下定義:
attributeType ( 2.5.4.41 NAME 'name'
DESC 'name(s) associated with the object'
EQUALITY caseIgnoreMatch
SUBSTR caseIgnoreSubstringsMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32768} )
attributeType ( 2.5.4.3 NAME ( 'cn' $ 'commonName' )
DESC 'common name(s) assciated with the object'
SUP name )
attributetype ( 1.3.6.1.4.1.7914.1.2.1.6 NAME 'quota'
DESC 'The amount of space the user can use until all further messages get bounced.'
SYNTAX 1.3.6.1.4.1.1466.115.121.1.44
SINGLE-value )
請注意,每個都定義了屬性的OID,給出了一個短的名稱,以及一個簡短的描述。每個名稱都是OID的一個別名。Slapd(8)在返回結果的時候,將返回第1個列出的名稱。
第1個名稱,name,保存了directoryString(UTF-8編碼的Unicode)語法。該語法由OID說明。(1.3.6.1.4.1.1466.115.121.1.15標識了目錄字符串語法)。還說明了一個推薦長度爲32768的選項。服務器應該支持該長度的值,可是,也能夠支持更長的值。該域沒有指明長度限制,所以,在服務器上被忽略,而且服務器不會限制其大小。另外,相等和子串匹配使用不區分大小寫的規則。下面是常用的語法和匹配規則(OpenLDAP支持這些,以及更多)
第2個屬性,cn,是name的一個子類型,所以,它繼承了語法,匹配規則,而且使用name.commonName做爲別名。
兩個屬性都沒有限制到單一值。均可以被用戶應用程序所使用,都不存在過時,都不是集合。
不少組織爲用戶保留惟一的名字(unique name),雖然用戶可使用displayName,可是這個屬性(name)依舊由用戶控制。而不是organization。咱們能夠從 inetorgperson.schema 拷貝displayName ,替換OID,name,和描述(description)。
attributetype ( 1.1.2.1.1 NAME 'myUniqueName'
DESC 'unique name with my organization'
EQUALITY caseIgnoreMatch
SUBSTR caseIgnoreSubstringsMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
SINGLE-VALUE )
可是,若是咱們要使name屬性包含一個斷言,這個屬性能夠被定義爲name的子屬性。
attributetype ( 1.1.2.1.1 NAME 'myUniqueName'
DESC 'unique name with my organization'
SUP name )
不少的組織爲每個用戶保留一個頭像。myPhoto屬性類型的定義能夠用來保存用戶的頭像。固然用戶能夠選擇jpegPhoto屬性類型(RFC2798)(或其子類型)來保存頭像。固然你只能在圖片符合JPEG File Interchange Format時使用。
固然,一個使用八進制語法的屬性類型能夠這樣的定義:
attributetype ( 1.1.2.1.2 NAME 'myPhoto'
DESC 'a photo (application defined format)'
SYNTAX 1.3.6.1.4.1.1466.115.121.1.40
SINGLE-VALUE )
在這,語法中並無置頂photo的格式(format),這裏假設訪問屬性的應用能夠對其值進行處理。
若是你想支持多種圖片格式,你須要爲每個格式定義屬性類型。爲圖片添加類型信息的前綴。或者使用ASN.1描述值,和use the ;binary transfer option。
可使圖片屬性可以保存URI,你能夠在labeledURI(RFC2079)後建立一個屬性,或者建立一個子類型。
attributetype ( 1.1.2.1.3 NAME 'myPhotoURI'
DESC 'URI and optional label referring to a photo'
SUP labeledURI )
Syntax
syntax是LDAP中的「語法」,其實就是LDAP中會用到的數據類型和數據約束,這個語法是聽從X.500中數據約束的定義的。其定義須要有一個ID(聽從X.500)以及說明(DESP)
Commonly Used Syntaxes |
||
Name |
OID |
Description |
boolean |
1.3.6 .1.4.1.1466.115.121.1.7 |
boolean value |
distinguishedName |
1.3.6.1.4.1.1466.115.121.1.12 |
DN |
directoryString |
1.3.6.1.4.1.1466.115.121.1.15 |
UTF-8 string |
IA5String |
1.3.6.1.4.1.1466.115.121.1.26 |
ASCII string |
Integer |
1.3.6.1.4.1.1466.115.121.1.27 |
integer |
Name and Optional UID |
1.3.6.1.4.1.1466.115.121.1.34 |
DN plus UID |
Numeric String |
1.3.6.1.4.1.1466.115.121.1.36 |
numeric string |
OID |
1.3.6.1.4.1.1466.115.121.1.38 |
object identifier |
Octet String |
1.3.6.1.4.1.1466.115.121.1.40 |
arbitary octets |
Printable String |
1.3.6.1.4.1.1466.115.121.1.44 |
printable string |
Matching Rules
是用來指定某屬性的匹配規則,實際上就是定義一個特殊的Syntax的別名,讓LDAP服務器能夠識別,並對定義的屬性進行匹配。
Commonly Used Matching Rules |
||
Name |
Type |
Description |
booleanMatch |
equality |
boolean |
octetStringMatch |
equality |
octet string |
objectIdentiferMatch |
equality |
OID |
distinguishedNameMatch |
equality |
DN |
uniqueMemberMatch |
equality |
Name with optional UID |
numericStringMatch |
equality |
numerical |
numericStringOrderingMatch |
ordering |
numerical |
numericStringSubstringsMatch |
substrings |
numerical |
caseIgnoreMatch |
equality |
case insensitive, space insensitive |
caseIgnoreOrderingMatch |
ordering |
case insensitive, space insensitive |
caseIgnoreSubstringsMatch |
substrings |
case insensitive, space insensitive |
caseExactMatch |
equality |
case sensitive, space insensitive |
caseExactOrderingMatch |
ordering |
case sensitive, space insensitive |
caseExactSubstringsMatch |
substrings |
case sensitive, space insensitive |
caseIgnoreIA5Match |
equality |
case insensitive, space insensitive |
caseIgnoreIA5OrderingMatch |
ordering |
case insensitive, space insensitive |
caseIgnoreIA5SubstringsMatch |
substrings |
case insensitive, space insensitive |
caseExactIA5Match |
equality |
case sensitive, space insensitive |
caseExactIA5OrderingMatch |
ordering |
case sensitive, space insensitive |
caseExactIA5SubstringsMatch |
substrings |
case sensitive, space insensitive |
LDAP的schema的主要元素就是這些了,下面列舉出了一些LDAP規定好的或是如今比較通用的schema,通常的LDAP服務器都應該能夠識別這些定義。
這就是一個名爲subschema的objectclass的定義:
objectclass=(2.5.20.1 NAME 'subschema' AUXILIARY
MAY ( dITStructureRules $ nameForms $ ditContentRules $
objectClasses $ attributeTypes $ matchingRules $ matchingRuleUse ) )
首先是ID,這裏是2.5.20.1,接着是NAME,AUXILIARY說明是輔助型,以後是可選屬性的定義,subschema中沒有定義必須屬性,若是須要定義,應該和MAY同樣,將屬性放在MUST()中並用$隔開
再來看一個屬性定義:
attributetype ( 2.5.4.3 NAME 'cn' SUP name EQUALITY caseIgnoreMatch )
能夠看到cn屬性的父屬性是name,它相等性匹配於caseIgnoreMatch(匹配原則爲EQUALITY,還有如SUBSTR是字符串匹配,ORDERING是順序匹配)
syntax定義通常都比較簡單,如:
( 1.3.6.1.4.1.1466.115.121.1.6 DESC 'String' )
這個定義說明,這一串數字1.3.6.1.4.1.1466.115.121.1.5就表明了LDAP中的字符串,這個數字串的定義和X.500相關,包括了它的存儲方式,所佔空間大小等。
最後看看Matching Rule的例子,前面提到了caseIgnoreMatch,就看他的吧
attributetype ( 2.5.13.2 NAME 'caseIgnoreMatch'
SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
其實1.3.6.1.4.1.1466.115.121.1.15 就是LDAP數據類型Directory String的ID,說明前面的cn須要等於這個數據類型纔有效。 還有不少經常使用schema的定義都在了RFC2252中,LDAP服務器都應該支持這些基本的schema。好了,如今基本對LDAP中的schema有個一個大體的說明,可能有不到位或不妥之處,還望你們指正。