LDAP學習筆記總結

散盡浮華發表於2016-08-15

 

一、LDAP概念
LDAP是輕量目錄訪問協議,英文全稱是Lightweight Directory Access Protocol,一般都簡稱為LDAP。它是基於X.500標準的,但是簡單多了並且可以根據需要定製。與X.500不同,LDAP支援TCP/IP,這對訪問Internet是必須的。LDAP的核心規範在RFC中都有定義,所有與LDAP相關的RFC都可以在LDAPman RFC網頁中找到。簡單說來,LDAP是一個得到關於人或者資源的集中、靜態資料的快速方式。 LDAP是一個用來發布目錄資訊到許多不同資源的協議。通常它都作為一個集中的地址本使用,不過根據組織者的需要,它可以做得更加強大。

現在市場上有關LDAP的產品已有很多,各大軟體公司都在他們的產品中整合了LDAP服務,如Microsoft的ActiveDirectory、Lotus的Domino Directory、IBM的WebSphere中也整合了LDAP服務。LDAP的開源實現是OpenLDAP,它比商業產品一點也不差,而且原始碼開放。

OpenLDAP 是最常用的目錄服務之一,它是一個由開源社群及志願者開發和管理的一個開源專案,提供了目錄服務的所有功能,包括目錄搜尋、身份認證、安全通道、過濾器等等。大多數的 Linux 發行版裡面都帶有 OpenLDAP 的安裝包。OpenLDAP 服務預設使用非加密的 TCP/IP 協議來接收服務的請求,並將查詢結果傳回到客戶端。由於大多數目錄服務都是用於系統的安全認證部分比如:使用者登入和身份驗證,所以它也支援使用基於 SSL/TLS 的加密協議來保證資料傳送的保密性和完整性。OpenLDAP 是使用 OpenSSL 來實現 SSL/TLS 加密通訊的。 

LDAP的資訊模型是建立在"條目"(entries)的基礎上。一個條目是一些屬性的集合,並且具有一個全域性唯一的"可區分名稱"DN,一個條目可以通過DN來引用。每一個條目的屬性具有一個型別和一個或者多個值。型別通常是容易記憶的名稱,比如"cn"是通用名稱(common name) ,或者"mail"是電子郵件地址。條目的值的語法取決於屬性型別。比如,cn屬性可能具有一個值"Babs Jensen" 。一個mail屬性可能包含"bbs@kevin.com" 。一個jpegphoto屬性可能包含一幅JPEG(二進位制)格式的圖片。

LDAP常用關鍵字列表
LDAP通過屬性objectClass來控制哪一個屬性必須出現或允許出現在一個條目中,它的值決定了該條目必須遵守的模式規則。

關鍵字 英文全稱 含義
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的型別來控制不同結點需要的資料(稱為屬性)。

對於目錄中的資料怎樣進行引用呢?前面提到過,每一個條目都有一個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系統中的檔案目錄一樣。目錄資料庫和關聯式資料庫不同,它有優異的讀效能,但寫效能差,並且沒有事務處理、回滾等複雜功能,不適於儲存修改頻繁的資料。所以目錄天生是用來查詢的,就好象它的名字一樣。

目錄服務是由目錄資料庫和一套訪問協議組成的系統。類似以下的資訊適合儲存在目錄中:

  • 企業員工資訊,如姓名、電話、郵箱等
  • 公司的物理裝置資訊,如伺服器,它的IP地址、存放位置、廠商、購買時間等
  • 客戶的聯絡資訊
  • 軟體包的配置資訊
  • 公用證照和安全密匙

與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                     

二、LDAP基本概念及其管理

啟動OpenLDAP伺服器程式之後,接下來的操作就是通過客戶端程式對目錄進行操作,包括新增、修改、刪除和搜尋資料等操作。

2.1  Entry
條目,也叫記錄項,是LDAP中最基本的顆粒,就像字典中的詞條,或者是資料庫中的記錄。通常對LDAP的新增、刪除、更改、檢索都是以條目為基本物件的。

  • dn:每一個條目都有一個唯一的標識名(distinguished Name ,DN),如上圖中一個 dn:"cn=baby,ou=marketing,ou=people,dc=mydomain,dc=org" 。通過DN的層次型語法結構,可以方便地表示出條目在LDAP樹中的位置,通常用於檢索。
  • rdn:一般指dn逗號最左邊的部分,如cn=baby。它與RootDN不同,RootDN通常與RootPW同時出現,特指管理LDAP中資訊的最高許可權使用者。
  • Base DN:LDAP目錄樹的最頂部就是根,也就是所謂的“Base DN",如"dc=mydomain,dc=org"。

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的要求,第5、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行建立根結點,這部分在前面也有介紹,就不再重複了。
第7、11、16行為空行,用來分隔4個dn條目(4個結點)。
第8~10行定義cn=managers結點的條目,該條目的objectClass為organizationalUnit,因此需要用ou屬性定義組織名稱。
第12~15行定義cn=dlw結點的條目,該條目使用的objectClass為person,因此需設定cn和sn兩個屬性值。
第17~20行與第12~15行的意義相同。

在以上LDIF檔案中,第1、8、12、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.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)客戶端工具錄入

相關文章