1、LDAP概念
LDAP是輕量目錄訪問協議,英文全稱是Lightweight Directory Access Protocol,通常都簡稱爲LDAP。它是基於X.500標準的,可是簡單多了而且能夠根據須要定製。與X.500不一樣,LDAP支持TCP/IP,這對訪問Internet是必須的。LDAP的核心規範在RFC中都有定義,全部與LDAP相關的RFC均可以在LDAPman RFC網頁中找到。簡單說來,LDAP是一個獲得關於人或者資源的集中、靜態數據的快速方式。 LDAP是一個用來發布目錄信息到許多不一樣資源的協議。一般它都做爲一個集中的地址本使用,不過根據組織者的須要,它能夠作得更增強大。java
如今市場上有關LDAP的產品已有不少,各大軟件公司都在他們的產品中集成了LDAP服務,如Microsoft的ActiveDirectory、Lotus的Domino Directory、IBM的WebSphere中也集成了LDAP服務。LDAP的開源實現是OpenLDAP,它比商業產品一點也不差,並且源碼開放。數據庫
OpenLDAP 是最經常使用的目錄服務之一,它是一個由開源社區及志願者開發和管理的一個開源項目,提供了目錄服務的全部功能,包括目錄搜索、身份認證、安全通道、過濾器等等。大多數的 Linux 發行版裏面都帶有 OpenLDAP 的安裝包。OpenLDAP 服務默認使用非加密的 TCP/IP 協議來接收服務的請求,並將查詢結果傳回到客戶端。因爲大多數目錄服務都是用於系統的安全認證部分好比:用戶登陸和身份驗證,因此它也支持使用基於 SSL/TLS 的加密協議來保證數據傳送的保密性和完整性。OpenLDAP 是使用 OpenSSL 來實現 SSL/TLS 加密通訊的。 api
LDAP的信息模型是創建在"條目"(entries)的基礎上。一個條目是一些屬性的集合,而且具備一個全局惟一的"可區分名稱"DN,一個條目能夠經過DN來引用。每個條目的屬性具備一個類型和一個或者多個值。類型一般是容易記憶的名稱,好比"cn"是通用名稱(common name) ,或者"mail"是電子郵件地址。條目的值的語法取決於屬性類型。好比,cn屬性可能具備一個值"Babs Jensen" 。一個mail屬性可能包含"bbs@kevin.com" 。一個jpegphoto屬性可能包含一幅JPEG(二進制)格式的圖片。安全
LDAP經常使用關鍵字列表
LDAP經過屬性objectClass來控制哪個屬性必須出現或容許出如今一個條目中,它的值決定了該條目必須遵照的模式規則。bash
關鍵字 | 英文全稱 | 含義 |
dc | Domain Component | 域名的部分,其格式是將完整的域名分紅幾部分,如域名爲example.com變成dc=example,dc=com |
uid | User Id | 用戶ID,如「tom」 |
ou | Organization Unit | 組織單位,相似於Linux文件系統中的子目錄,它是一個容器對象,組織單位能夠包含其餘各類對象(包括其餘組織單元),如「market」 |
cn | Common Name | 公共名稱,如「Thomas Johansson」 |
sn | Surname | 姓,如「Johansson」 |
dn | Distinguished Name | 唯一辨別名,相似於Linux文件系統中的絕對路徑,每一個對象都有一個唯一的名稱,如「uid= tom,ou=market,dc=example,dc=com」,在一個目錄樹中DN老是唯一的 |
rdn | Relative dn | 相對辨別名,相似於文件系統中的相對路徑,它是與目錄樹結構無關的部分,如「uid=tom」或「cn= Thomas Johansson」 |
c | Country | 國家,如「CN」或「US」等。 |
o | Organization | 組織名,如「Example, Inc.」 |
LDAP支持的目錄操做
包括:查詢目錄、更新目錄、增長條目、刪除條目、改變條目名稱,搜索信息,最經常使用的LDAP操做是搜索信息操做。LDAP搜索操做容許搜索目錄的一部分,查找匹配某個搜索過濾器規則的條目,搜索在 dc=example,dc=com 條目之中或者之下的整個目錄子樹,查找一個名字叫作 Barbara Jensen 的我的,而且獲取每個找到的條目的電子郵件地址。服務器
1.1 LDAP協議簡單介紹
目錄是一組具備相似屬性、以必定邏輯和層次組合的信息。常見的例子是通信簿,由以字母順序排列的名字、地址和電話號碼組成。
目錄服務是一種在分佈式環境中發現目標的方法。目錄具備兩個主要組成部分:
第一部分是數據庫,數據庫是分佈式的,且擁有一個描述數據的規劃。
第二部分則是訪問和處理數據的各類協議。網絡
錄服務其實也是一種數據庫系統,只是這種數據庫是一種樹形結構,而不是一般使用的關係數據庫。目錄服務與關係數據庫之間的主要區別在於:兩者都容許對存儲數據進行訪問,只是目錄主要用於讀取,其查詢的效率很高,而關係數據庫則是爲讀寫而設計的。
舒適提示:目錄服務不適於進行頻繁的更新,屬於典型的分佈式結構。
LDAP是一個目錄服務協議,目前存在衆多版本的LDAP,而最多見的則是V2和V3兩個版本,它們分別於1995年和1997年首次發佈。數據結構
1.2 LDAP的基本模型
LDAP的基本模型是創建在"條目"(Entry)的基礎上。一個條目是一個或多個屬性的集合,而且具備一個全局惟一的"可區分名稱"(用dn表示)。與關係型數據(後面簡稱數據庫)進行類比,一個條目至關於數據庫中的一條記錄,而dn至關於數據庫中記錄的關鍵字,屬性至關於數據庫中的字段。
舒適提示:dn必須是全局惟一的。
LDAP中,將數據組織成一個樹形結構,這與現實生活中的不少數據結構能夠對應起來,而不像設計關係型數據庫的表,須要進行多種變化。以下圖所展現的就是一個樹形結構的數據。架構
在上圖所示的樹形結構中,樹的根結點是一個組織的域名(dlw.com),其下分爲3個部分,分別是managers、people和group,可將這3個組看做組織中的3個部門:如managers用來管理全部管理人員,people用來管理登陸系統的用戶,group用來管理系統中的用戶組。固然,在該圖中還可繼續增長其餘分支。
對於圖中所示的樹形結構,使用關係數據庫來保存數據的話,須要設置多個表,一層一層分別保存,當須要查找某個信息時,再逐層進行查詢,最終獲得結果。
若使用目錄來保存該圖中的數據,則更直觀。圖中每一個結點用一個條目來保存,不一樣類型的結點須要保存的數據可能不一樣,在LDAP中經過一個稱爲objectClass的類型來控制不一樣結點須要的數據(稱爲屬性)。app
對於目錄中的數據怎樣進行引用呢?前面提到過,每個條目都有一個dn,由於dn是惟一的,所以就可找到須要結點的數據。dn的構造方式以下:
首先獲得條目本身的名稱(rdn,稱爲相對dn),而後開始向上逐級查找父結點,一直到根項爲止。例如,對於圖1-1中最右下方的結點,其dn爲:
dn: cn=ldap, ou=group, o=dlw.com
經過這樣的方式,便可惟一標識每個結點。在現實生活中,有不少這種樹形結構的數據,如計算機文件系統的目錄結構、Internet中的域名等。這些類型的數據,只要不須要頻繁的更新,都適合用目錄來保存。
LDAP主要的簡稱含義:
o-> organization(組織-公司)
ou-> organization unit(組織單元-部門)
c-> countryName(國家)
dc-> domainComponent(域名)
sn-> suer name(真實名稱)
cn-> common name(經常使用名稱)
1.3 LDAP的功能
在LDAP的功能模型中定義了一系列利用LDAP協議的操做,主要包含如下4部分:
查詢操做:容許查詢目錄和取得數據,其查詢性能比關係數據庫好。
更新操做:目錄的更新操做不要緊數據庫方便,更新性能較差,但也一樣容許進行添加、刪除、修改等操做。
複製操做:前面也提到過,LDAP是一種典型的分佈式結構,提供複製操做,可將主服務器的數據的更新複製到設置的從服務器中。
認證和管理操做:容許客戶端在目錄中識別本身,而且可以控制一個會話的性質。
Ldap具體高級功能:
實現帳號統一集中管理;
權限控制策略管理;
密碼控制策略管理;
密碼審計管理;
主機控制管理;
同步機制管理;
TLS/SASL加密傳輸;
高可用負載均衡架構;
自定義schema;
各類集中平臺帳號集中管理;
1.4 LDAP協議的特色
LDAP是一種目錄服務,保存在特殊的數據庫中,數據的讀取速度遠高於寫入速度。
LDAP對查詢作了優化,讀取速度優於普通關係數據庫。
LDAP不支持事務、不能進行回滾,須要進行這些操做的應用只有選擇關係數據庫。
LDAP採用服務器/客戶端模式,服務器端用於存儲數據,客戶端提供操做目錄信息樹的工具,支持分佈式結構。
LDAP中的條目以樹形結構組織和存儲。
LDAP基於Internet協議,直接運行在簡單和通用的TCP/IP或其餘可靠的傳輸協議層上,使鏈接的創建和包的處理簡單、快捷,對於互聯網和企業網應用都很方便。
LDAP協議簡單,經過使用查找操做實現列表操做和讀操做。
LDAP經過引用機制實現分佈式訪問,經過客戶端API實現分佈式操做(對於應用透明),平衡了負載。
LDAP實現具備低費用、易配置和易管理的特色,並提供了知足應用程序對目錄服務所需求的特性。
1.5 LDAP目錄服務
目錄是一個爲查詢、瀏覽和搜索而優化的專業分佈式數據庫,它呈樹狀結構組織數據,就好象Linux/Unix系統中的文件目錄同樣。目錄數據庫和關係數據庫不一樣,它有優異的讀性能,但寫性能差,而且沒有事務處理、回滾等複雜功能,不適於存儲修改頻繁的數據。因此目錄天生是用來查詢的,就好象它的名字同樣。
目錄服務是由目錄數據庫和一套訪問協議組成的系統。相似如下的信息適合儲存在目錄中:
與LDAP同樣提供相似的目錄服務軟件還有ApacheDS、Active Directory、Red Hat Directory Service 。
1.6 LDAP組織數據的方式
1.7 身份認證在LDAP中提供三種認證機制
a)匿名認證:即不對用戶進行認證,該方法僅對徹底公開的方式適用
b)基本認證:經過用戶名和密碼進行身份識別,又分爲簡單密碼和MD5密碼認證
[root@ldap-server ~]# ldapadd -x -D "cn=root,dc=otas,dc=cn" -W -f base.ldif
Enter LDAP Password: 輸入admin123
adding new entry "dc=otas,dc=cn"
adding new entry "ou=People,dc=otas,dc=cn"
adding new entry "ou=Group,dc=otas,dc=cn"
c)SASL認證:即LDAP提供的在SSL和TLS安全通道基礎上進行的身份認證,包括數字證書的認證。
1.8 TLS安全性
分佈式LDAP 是以明文的格式經過網絡來發送信息的,包括client訪問sldap的密碼。TLS(SSL 的後繼者,由OpenSSL 包)加密機制來解決這個問題。
LDAP目錄數據結構
a)在LDAP中目錄是按照樹型結構組織——目錄信息樹(DIT),DIT是一個主要進行讀操做的數據庫
b)DIT由條目(Entry)組成,條目至關於關係數據庫中表的記錄;條目是具備分辨名DN(Distinguished Name)的屬性-值對(Attribute-value,簡稱AV)的集合
在目錄樹中怎麼組織數據
cn=Fran Smith,ou=employees,dc=foobar,dc=com
------------ -----------------
容器條目 BaseDN
--------------------------------------------
DN
-> 在UNIX文件系統中,最頂層是根目錄(root),LDAP目錄也一般用ROOT作根,一般稱爲BaseDN。
-> 由於歷史(X.500)的緣由,LDAP目錄用OU(Organization Unit)從邏輯上把數據分開來。
Ou 也是一種條目,容器條目
-> Ou 下就是真正的用戶條目
什麼是dn?
dn即distinguished name的簡稱,在LDAP中,一個條目的分辨名叫作"dn",dn是該條目在整個樹中的惟一名稱標識;dn至關於關係數據庫表中的關鍵字(Primary Key);dn是一個識別屬性,一般用於檢索
常見的兩種dn設置:
[root@ldap-server ~]# ldapsearch -x -LLL "uid=mac*" dn: uid=mac,ou=People,dc=otas,dc=cn 惟一標適 uid: mac cn: mac
2、LDAP基本概念及其管理
啓動OpenLDAP服務器程序以後,接下來的操做就是經過客戶端程序對目錄進行操做,包括添加、修改、刪除和搜索數據等操做。
2.1 Entry
條目,也叫記錄項,是LDAP中最基本的顆粒,就像字典中的詞條,或者是數據庫中的記錄。一般對LDAP的添加、刪除、更改、檢索都是以條目爲基本對象的。
2.2 schema
對象類(ObjectClass)、屬性類型(AttributeType)、語法(Syntax)分別約定了條目、屬性、值,他們之間的關係以下圖所示。因此這些構成了模式(Schema)——對象類的集合。條目數據在導入時一般須要接受模式檢查,它確保了目錄中全部的條目數據結構都是一致的。
schema(通常在/etc/ldap/schema/目錄)在導入時要注意先後順序。
對於LDAP目錄中保存的信息,可使用LDIF(LDAP Interchange Format)格式來保存。這是一種標準文本文件格式,使用這種格式保存得的LDAP服務器數據庫中的數據可方便讀取和修改,這也是其餘大多數服務配置文件所採起的格式。
LDIF文件經常使用來向目錄導入或更改記錄信息,這些信息須要按照LDAP中schema的格式進行組織,並會接受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)等部分。這裏就不介紹具體的設計方法了。
2.3 向目錄數據庫中添加數據
初始狀態下,LDAP是一個空目錄,即沒有任何數據。可經過程序代碼向目錄數據庫中添加數據,也可以使用OpenLDAP客戶端工具ldapadd命令來完成添加數據的操做,該命令可將一個LDIF文件中的條目添加到目錄。所以,須要首先建立一個LDIF文件,而後再進行添加操做。
1)LDIF文本條目格式
LDIF(LDAP Data Interchange Format,數據交換格式)是LDAP數據庫信息的一種文本格式,用於數據的導入導出,每行都是"屬性: 值"對。
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.4 objectClass
LDAP中,一個條目必須包含一個objectClass屬性,且須要賦予至少一個值。每個值將用做一條LDAP條目進行數據存儲的模板;模板中包含了一個條目必須被賦值的屬性和可選的屬性。
objectClass有着嚴格的等級之分,最頂層是top和alias。例如,organizationalPerson這個objectClass就隸屬於person,而person又隸屬於top。
objectClass可分爲如下3類:
結構型(Structural):如person和organizationUnit;
輔助型(Auxiliary):如extensibeObject;
抽象型(Abstract):如top,抽象型的objectClass不能直接使用。
對象類是屬性的集合,LDAP預想了不少人員組織機構中常見的對象,並將其封裝成對象類。好比人員(person)含有姓(sn)、名(cn)、電話(telephoneNumber)、密碼(userPassword)等屬性,單位職工(organizationalPerson)是人員(person)的繼承類,除了上述屬性以外還含有職務(title)、郵政編碼(postalCode)、通訊地址(postalAddress)等屬性。
經過對象類能夠方便的定義條目類型。每一個條目能夠直接繼承多個對象類,這樣就繼承了各類屬性。若是2個對象類中有相同的屬性,則條目繼承後只會保留1個屬性。對象類同時也規定了哪些屬性是基本信息,必須含有(Must 活Required,必要屬性):哪些屬性是擴展信息,能夠含有(May或Optional,可選屬性)。
對象類有三種類型:結構類型(Structural)、抽象類型(Abstract)和輔助類型(Auxiliary)。結構類型是最基本的類型,它規定了對象實體的基本屬性,每一個條目屬於且僅屬於一個結構型對象類。抽象類型能夠是結構類型或其餘抽象類型父類,它將對象屬性中共性的部分組織在一塊兒,稱爲其餘類的模板,條目不能直接集成抽象型對象類。輔助類型規定了對象實體的擴展屬性。每一個條目至少有一個結構性對象類。
對象類自己是能夠相互繼承的,因此對象類的根類是top抽象型對象類。以經常使用的人員類型爲例,他們的繼承關係:
在OpenLDAP的schema中定義了不少objectClass,下面列出部分經常使用的objectClass的名稱。
● account
● alias
● dcobject
● domain
● ipHost
● organization
● organizationalRole
● organizationalUnit
● person
● organizationalPerson
● inetOrgPerson
● residentialPerson
● posixAccount
● posixGroup
2.5 Attribute
屬性(Attribute)相似於程序設計中的變量,能夠被賦值。在OpenLDAP中聲明瞭許多經常使用的Attribute(用戶也可本身定義Attribute)。
每一個條目均可以有不少屬性(Attribute),好比常見的人都有姓名、地址、電話等屬性。每一個屬性都有名稱及對應的值,屬性值能夠有單個、多個,好比你有多個郵箱。
屬性不是隨便定義的,須要符合必定的規則,而這個規則能夠經過schema制定。好比,若是一個entry沒有包含在 inetorgperson 這個 schema 中的objectClass: inetOrgPerson,那麼就不能爲它指定employeeNumber屬性,由於employeeNumber是在inetOrgPerson中定義的。
LDAP爲人員組織機構中常見的對象都設計了屬性(好比commonName,surname)。下面有一些經常使用的別名:
常見的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。
2.6 建立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:wangshibo 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開頭,這部份內容必須惟一,而且在向目錄數據庫添加這些數據時,也要確保這些數據不能與目錄數據庫中已有數據相同,不然,添加操做將中斷。
================ldap命令的使用============
1)增長增:ldapadd 選項: -x 進行簡單認證 -D 用來綁定服務器的DN -h 目錄服務的地址 -w 綁定DN的密碼 -f 使用ldif文件進行條目添加的文件 例子: 將 test.ldif 中的數據導入 ldap [root@openldap ~]# ldapadd -x -D "cn=root,dc=kevin,dc=com" -w secret -f /root/test.ldif 2)刪除:ldapdelete 例子 [root@openldap ~]# ldapdelete -x -D "cn=Manager,dc=test,dc=com" -w secret "uid=test1,ou=People,dc=test,dc=com" [root@openldap ~]# ldapdelete -x -D 'cn=root,dc=it,dc=com' -w secert 'uid=zyx,dc=it,dc=com' 3)修改:ldapmodify 選項 -a 添加新的條目.缺省的是修改存在的條目. -C 自動追蹤引用. -c 出錯後繼續執行程序並不停止.缺省狀況下出錯的當即中止. -D binddn 指定搜索的用戶名(通常爲一dn 值). -e 設置客戶端證書文件,例: -e cert/client.crt -E 設置客戶端證書私鑰文件,例: -E cert/client.key -f file 從文件內讀取條目的修改信息而不是從標準輸入讀取. -H ldapuri 指定鏈接到服務器uri。常見格式爲ldap://hostname:port -h ldaphost 指定要鏈接的主機的名稱/ip 地址.它和-p 一塊兒使用. -p ldapport 指定要鏈接目錄服務器的端口號.它和-h 一塊兒使用. -M[M] 打開manage DSA IT 控制. -MM 把該控制設置爲重要的. -n 用於調試到服務器的通信.但並不實際執行搜索.服務器關閉時,返回錯誤;服務器打開時,常和-v 參數一塊兒測試到服務器是不是一條通路. -v 運行在詳細模塊.在標準輸出中打出一些比較詳細的信息.好比:鏈接到服務器的ip 地址和端口號等. -V 啓用證書認證功能,目錄服務器使用客戶端證書進行身份驗證,必須與-ZZ 強制啓用TLS 方式配合使用,而且匿名綁定到目錄服務器. -W 指定了該參數,系統將彈出一提示入用戶的密碼.它和-w 參數相對使用. -w bindpasswd 直接指定用戶的密碼. 它和-W 參數相對使用. -x 使用簡單認證. -Z[Z] 使用StartTLS 擴展操做.若是使用-ZZ,命令強制使用StartTLS 握手成功. 例子 [root@openldap ~]# ldapmodify -x -D "cn=root,dc=it,dc=com" -W -f modify.ldif 4)查詢:ldapsearch 選項 -x 進行簡單認證 -D 用來綁定服務器的DN -w 綁定DN的密碼 -b 指定要查詢的根節點 -H 制定要查詢的服務器 例子 [root@openldap ~]# ldapsearch -x -D "cn=root,dc=kevin,dc=com" -w secret -b "dc=kevin,dc=com" 使用簡單認證,用 "cn=root,dc=kevin,dc=com" 進行綁定,要查詢的根是 "dc=kevin,dc=com"。這樣會把綁定的用戶能訪問"dc=kevin,dc=com"下的全部數據顯示出來。 [root@openldap ~]# ldapsearch -x -W -D "cn=administrator,cn=users,dc=osdn,dc=cn" -b "cn=administrator,cn=users,dc=osdn,dc=cn" -h troy.osdn.zzti.edu.cn [root@openldap ~]# ldapsearch -b "dc=canon-is,dc=jp" -H ldaps://192.168.10.192:389 5)設置使用者密碼:ldappasswd 選項 -x 進行簡單認證 -D 用來綁定服務器的DN -w 綁定DN的密碼 -S 提示的輸入密碼 -s pass 把密碼設置爲pass -a pass 設置old passwd爲pass -A 提示的設置old passwd -H 是指要綁定的服務器 -I 使用sasl會話方式 例子 [root@openldap ~]# ldappasswd -x -D 'cm=root,dc=it,dc=com' -w secret 'uid=zyx,dc=it,dc=com' -S
2.7 從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
舒適提示:若是以上命令執行不成功,須要逐個字符檢查dlw.com.ldif文件中的內容,特別注意空格的問題。
2.8 查詢
添加到目錄中的條目被保存在目錄數據庫,在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*'
2.9 修改條目
使用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'
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
2.10 刪除條目
對於目錄數據庫中不用的條目,也可以使用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"
2.11 數據導出
經過ldapadd命令可向目錄數據庫中添加數據,在某些狀況下,可能還須要進行反向操做,即將目錄數據庫中的數據導出。
使用ldapsearch命令對目錄數據庫進行搜索,而後經過重定向將搜索結果保存到一個文件中,可達到導出數據的目的。另外,導出數據更經常使用的是slapcat命令,該命令的格式以下:
# slapcat 選項
最經常使用的選項就是-l,表示導出爲LDIF文件格式。
如將前面例子中建立的目錄數據庫導出爲export.ldif文件,可以使用如下命令:
# slapcat -l export.ldif
舒適提示:從導出結果可看出,除了使用ldapadd命令添加到目錄數據庫中的條目數據外,還導出了不少其餘信息,包括條目錄UUID、時間戳等信息。
2.12 設置主從LDAP服務器
在某些時候,爲了對LDAP服務器進行負載均衡,可能但願設置多臺LDAP服務器。對於設置多臺LDAP服務器的關鍵問題是數據的同步問題,使用slurpd進程可進行主LDAP服務器向從LDAP服務器複製數據的操做。下面將介紹架設主從LDAP服務器的過程
2.13 多臺LDAP服務器工做過程
對於多臺LDAP服務器,可設置一臺爲主服務器,其餘的爲從服務器。本節介紹一臺從服務器的配置,如果多臺從服務器也可按此步驟進行操做。
注意:在進行配置以前應首先確保每一個LDAP服務器都已安裝好OpenLDAP服務器程序,並能正確工做。
配置好主從LDAP服務器以後,在主服務器運行slurpd進程,該進程使用LDAP協議從主服務器的數據庫更新從服務器的數據,具體操做過程以下:
1)LDAP客戶端向從服務器提交一個LDAP修改請求。
2)從服務器給LDAP客戶端返回一個指向主服務器的引用。
3)LDAP客戶端向主服務器提交LDAP修改請求。
4)主服務器對數據庫中的數據進行修改,並將改變寫入本機的日誌文件。
5)在主服務器運行的slurpd進程檢查到日誌中有新內容,經過日誌的信息將改變發送給從服務器。
6)從服務器接收slurpd發來的信息,對本地數據進行修改。
以上過程就是使用slurpd進程進行數據複製的過程。從以上過程可看出,須要在主服務器的配置文件中設置要向哪些從服務器發送複製信息、主服務器還要設置一個記錄數據改變的日誌文件,而從服務器須要設置一個指向主服務器的連接。
2.14 複製數據庫
首先,把主從服務器關閉。而後經過如下三步操做靜態同步主從服務器上的數據:
把主服務器上/var/lib/ldap目錄下的全部數據庫文件所有拷貝到從服務器的同目錄中,覆蓋原有文件。
把主服務器上的/etc/ldap/schema目錄下的全部schema文件拷貝到從服務器的同目錄中,覆蓋原有文件。
把主服務器上/etc/ldap/slapd.conf文件拷貝到從服務器的同目錄中,覆蓋原有文件。
3、其餘補充說明
3.1 Ldap常見對象屬性
LDAP爲人員組織機構中常見的對象都設計了屬性(好比commonName,surname)。下面有一些經常使用的別名:
3.2 ldif文件示例
能夠說LDIF文件是OpenLDAP操做數據或修改配置的一切來源,下面是實際經過客戶端工具操做的具體示例。 1)添加組織或條目 建立一個Marketing部門,添加一個dn記錄: [root@ldap-server ~]# cat add_entry.ldif dn: ou=Marketing, dc=example,dc=com changetype: add objectclass: top objectclass: organizationalUnit ou: Marketing dn: cn=Pete Minsky,ou=Marketing,dc=example,dc=com changetype: add objectclass: person objectclass: organizationalPerson objectclass: inetOrgPerson cn: Pete Minsky sn: Pete ou: Marketing description: sb, sx description: sx uid: pminsky [root@ldap-server ~]# ldapmodify -xWD 'cn=admin,dc=example,dc=com' -f add_entry.ldif 或去掉changetype後 [root@ldap-server ~]# ldapmodify -a -xWD 'cn=admin,dc=example,dc=com' -f add_entry.ldif [root@ldap-server ~]# ldapadd -xWD 'cn=admin,dc=example,dc=com' -f add.ldif 2)修改組織或條目 添加mail屬性,修改sn的值,刪除一個description屬性: [root@ldap-server ~]# cat modify_entry.ldif dn: cn=Pete Minsky,ou=Marketing,dc=example,dc=com changetype: modify add: mail mail: pminsky@example.com - replace: sn sn: Minsky - delete: description description: sx [root@ldap-server ~]# ldapmodify -xWD 'cn=admin,dc=example,dc=com' -f modify_entry.ldif [root@ldap-server ~]# ldapsearch -xD 'cn=admin,dc=mydomain,dc=net' -b 'ou=People,dc=mydomain,dc=net' -s sub 'objectclass=*' -w tplink -LLL 3)重命名條目 dn: cn=Pete Minsky,ou=Marketing,dc=example,dc=com changetype: modrdn newrdn: cn=Susan Jacobs deleteoldrdn: 1 modrdn只容許修改dn最左邊的部分,且不能重命名帶葉子或分支的子樹,若是要將一個用戶移動到另外一個部門下,只能在新部門建立dn,而後刪除舊的dn。 4)刪除組織或條目 LDAP協議只能刪除無分支的葉子dn: [root@ldap-server ~]# cat delete_entry.ldif dn: cn=Susan Jacobs,ou=Marketing,dc=example,dc=com changetype: delete 或 [root@ldap-server ~]# ldapdelete -xWD "cn=admin,dc=example,dc=com" -h localhost -p 389 "cn=Susan Jacobs,ou=Marketing,dc=example,dc=com" 5)LDIF配置backend OpenLDAP的配置採用以cn=config爲根的目錄樹的形式組織起來,採用config做爲database,默認狀況下包括admin或root用戶都沒有訪問權限,須要賦予讀寫權限, 然而賦予修改權限要求首先要提供認證信息,初始化安裝後的cn=config是沒有credentials [root@ldap-server ~]# ldapmodify -Y EXTERNAL -H ldapi:/// -f modify_config.ldif SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 modifying entry "olcDatabase={0}config,cn=config" ldap_modify: Insufficient access (50) 因此這裏不得不手動編輯olcDatabase={0}config.ldif文件,得到最初認證權限(雖然官方不推薦手動修改配置): [root@ldap-server ~]# vi /etc/ldap/slapd.d/cn\=config/olcDatabase\=\{0\}config.ldif olcRootPW: {SSHA}your_slappasswd_secret 重啓slapd後即可以修改config: [root@ldap-server ~]# /etc/init.d/slapd restart [root@ldap-server ~]# ldapwhoami -x -D cn=config -W 修改示例: [root@ldap-server ~]# ldapmodify -xWD 'cn=config' Enter LDAP Password: dn: olcDatabase={0}config,cn=config changetype: modify replace: olcRootDN olcRootDN: cn=config - replace: olcRootPW olcRootPW: {SSHA}your_slappasswd_secret modifying entry "olcDatabase={0}config,cn=config" 在/etc/ldap/slapd.d/cn=config/olcDatabase={0}config.ldif中olcRootDN變成base64加密後的值(兩個」:」)。 最後,若是要在slapd服務未啓動的狀況下修改配置能夠經過如下命令轉換成ldif中間文件: [root@ldap-server ~]# slapcat -n0 -F /etc/ldap/slapd.d/ > /tmp/config-in-portable-format.ldif 編輯ldif文件後,從新shengc slapd.d目錄 [root@ldap-server ~]# slapadd -n0 -F /tmp/slapd.d -l /tmp/config-in-portable-format.ldif
3.3 OpenLDAP配置步驟
OpenLDAP主配置文件slapd.conf,該配置文件通常保存在安裝目錄下的etc/openldap/目錄下。它的初始內容以下: [root@ldap-server openldap]# cat slapd.conf # # See slapd.conf(5) for details on configuration options. # This file should NOT be world readable. # include /usr/local/etc/openldap/schema/core.schema # Define global ACLs to disable default read access. # Do not enable referrals until AFTER you have a working directory # service AND an understanding of referrals. #referral ldap://root.openldap.org pidfile /usr/local/var/run/slapd.pid argsfile /usr/local/var/run/slapd.args # Load dynamic backend modules: # modulepath /usr/local/libexec/openldap # moduleload back_bdb.la # moduleload back_hdb.la # moduleload back_ldap.la # Sample security restrictions # Require integrityprotection (prevent hijacking) # Require 112-bit (3DESor better) encryption for updates # Require 63-bitencryption for simple bind # security ssf=1 update_ssf=112 simple_bind=64 # Sample access control policy: # Root DSE: allow anyoneto read it # Subschema (sub)entryDSE: allow anyone to read it # Other DSEs: # Allow selfwrite access # Allowauthenticated users read access # Allowanonymous users to authenticate # Directives needed toimplement policy: # access to dn.base="" by * read # access to dn.base="cn=Subschema" by * read # access to * # by self write # by users read # by anonymous auth # # if no access controls are present, the default policy # allows anyone and everyone to read anything but restricts # updates to rootdn. (e.g.,"access to * by * read") # # rootdn can always read and write EVERYTHING! ####################################################################### # 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 avoid. See slappasswd(8)and slapd.conf(5) for details. # Use of strong authentication encouraged. rootpw secret # The database directory MUST exist prior to running slapd AND # should only be accessible by the slapd and slap tools. # Mode 700 recommended. directory /usr/local/var/openldap-data # Indices to maintain index objectClass eq ====================須要注意的================== 設置LDAP使用的Schema [root@openldap-server openldap]# vi slapd.conf 找到語句: include /usr/local/etc/openldap/schema/core.schema 在該語句的後面添加如下語句: include /usr/local/etc/openldap/schema/corba.schema include /usr/local/etc/openldap/schema/cosine.schema include /usr/local/etc/openldap/schema/dyngroup.schema include /usr/local/etc/openldap/schema/inetorgperson.schema include /usr/local/etc/openldap/schema/java.schema include /usr/local/etc/openldap/schema/misc.schema include /usr/local/etc/openldap/schema/nis.schema include /usr/local/etc/openldap/schema/openldap.schema 設置目錄樹的後綴 找到語句: suffix "dc=my-domain,dc=com" 將其改成: suffix "dc=example,dc=com" 設置LDAP管理員的DN 找到語句: rootdn "cn=Manager,dc=my-domain,dc=com" 將其改成: rootdn "cn=root,dc=example,dc=com" 設置LDAP管理員的口令 找到語句: rootpw secret 將其改成: rootpw 123456 注:修改密碼的時候須要注意rootpw前面不能有空格,以及rootpw與密碼之間用TAB鍵隔開。 設置數據庫的存放路徑 # Indices to maintain index objectClass eq 注:藍色部分能夠根據須要進行修改!
3.4 數據導入數據導入的方式主要有四種a)手工輸入b).ldif文件格式錄入c)腳本自動錄入d)客戶端工具錄入