OpenLDAP學習筆記

OpenLDAP學習筆記

博客分類: LDAP

 

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

Python代碼  收藏代碼編輯器

  1. 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的用戶和組。

 

Python代碼  收藏代碼

  1. # groupadd ldap  

  2. # useradd -g ldap ldap  

  3. # passwd ldap  

 

(2)執行如下命令,查詢系統中是否已安裝openldap-servers程序。

 

Python代碼  收藏代碼

  1. # rpm -qa openldap-servers  

 若無任何輸出,則表示當前系統中未安裝openldap-servers服務器程序。

 

(3)使用如下命令將RHEL安裝光盤掛載到系統中:

 

Python代碼  收藏代碼

  1. # mount /dev/cdrom /mnt/cdrom  

 

(4)執行如下命令安裝openldap-servers程序的依賴程序包libtools-ltdl:

 

Python代碼  收藏代碼

  1. # rpm -ivh /mnt/cdrom/Server/libtool-ltdl-1.5.22-6.1.i386.rpm  

 若不執行上面的命令,直接執行下一步的安裝命令,將提示有依賴程序未安裝。

 

(5)執行如下命令安裝openldap-servers程序:

 

Python代碼  收藏代碼

  1. # rpm -ivh /mnt/cdrom/Server/openldap-servers-2.3.27-5.i386.rpm  

 

這樣就將openldap-servers服務器程序安裝到系統中了。整個安裝過程以下圖所示。

 

 

(6)使用如下命令修改保存數據的目錄/var/lib/ldap/及其文件的全部者,並修改權限,只有ldap用戶纔對數據有讀寫權限:

 

Python代碼  收藏代碼

  1. # chown ldap.ldap /var/lib/ldap  

  2. # 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服務器可以使用如下命令之一:

 

Python代碼  收藏代碼

  1. # server ldap start  

  2. # /etc/rc.d/init.d/ldap  

  3. # /usr/sbin/slapd  

 

使用第1條命令來啓動ldap服務進程的過程以下圖所示。

 

 

提示:使用/usr/sbin/slapd命令啓動服務程序是最好的一種方式,若是用前兩條命令啓動openldap服務程序失敗,可以使用最後一條命令試一下。

 

      從上圖可看出,啓動的是slapd進程,並有一個提示信息,提示沒有DB_CONFIG文件。可經過如下命令將DB_CONFIG文件複製到/var/lib/ldap/目錄中:

 

Python代碼  收藏代碼

  1. # cp /etc/openldap/DB_CONFIG.example /var/lib/ldap/DB_CONFIG  

 

另外,因爲使用的是默認配置文件,提示但願使用後綴「dc=my-domain, dc=com」。下節將介紹修改配置文件的操做。

 

2.查看監聽端口 
      OpenLDAP使用的監聽端口是389,經過netstat命令查看該端口是否處於監聽狀態,可瞭解slapd進程是否在工做。具體命令以下:

 

Python代碼  收藏代碼

  1. # netstat –tnlp | grep 389  

 

執行結果以下圖所示,能夠看出,389端口處於監聽狀態,表示slapd進程正在工做。

 

 

3.搜索測試 
      slapd服務進程啓動後,可以使用OpenLDAP客戶端的一個搜索命令進行一次搜索,以檢查服務的配置是否正確。
      使用如下命令進行搜索:

 

Python代碼  收藏代碼

  1. # ldapsearch -x -b '' -s base '(objectclass=*)'  

 

注意:-b後面是兩個單引號,用來阻止特殊字符被Shell解析。

 

      因爲還未向LDAP服務器中添加任何數據,所以,系統中應該只有「根」這個條目,執行以上搜索的結果以下圖所示。

 

從以上測試可看出,OpenLDAP已經正確安裝到系統中,接下來就須要修改配置文件,設置LDAP的根目錄了。

 

 

配置OpenLDAP

 

      在上面的例子中的搜索結果可看出,在配置文件中是以默認的「dc=my-domain, dc=com」做爲後綴,須要對其進行修改,固然也還須要修改其餘的一些配置。下面將介紹對配置文件的修改操做。

slapd.conf


      OpenLDAP的配置文件位於/etc/openldap/目錄中,名稱爲slapd.conf。該文件內容較多,一般只須要修改幾個地方便可,包括修改後綴、管理員及其密碼。其初始內容以下:

 

Python代碼  收藏代碼

  1. #######################################################################  

  2. # ldbm and/or bdb database definitions  

  3. #######################################################################  

  4.   

  5. database        bdb  

  6. suffix          "dc=my-domain,dc=com"  

  7. rootdn          "cn=Manager,dc=my-domain,dc=com"  

  8. # Cleartext passwords, especially for the rootdn, should  

  9. # be avoided.  See slappasswd(8) and slapd.conf(5) for details.  

  10. # Use of strong authentication encouraged.  

  11. # rootpw                secret  

  12. # rootpw                {crypt}ijFYNcSNctBYg  

 

其中各語句的含義以下:
  ● 以符號「#」開始的行是註釋行,第1~3行、第8~12行都是。
  ● 第5行設置數據庫,可以使用ldbm或bdb。
  ● 第6行設置後綴。
  ● 第7行設置超級管理員的名稱,與Linux系統中的root相似。在配置時用該用戶,配置完成後,建議將其刪除。
  ● 第11行設置超級管理員的密碼,默認狀態是被註釋了的。這行的密碼是明文狀態。
  ● 第12行也是設置超級管理員的密碼,這行是以加密方式設置的(默認狀態也是被註釋了的)。
根據實際狀況,修改第六、七、11行便可,具體以下:

Python代碼  收藏代碼

  1. #######################################################################  

  2. # ldbm and/or bdb database definitions  

  3. #######################################################################  

  4.   

  5. database        bdb  

  6. suffix          "dc=dlw,dc=com"  

  7. rootdn          "cn=root,dc=dlw,dc=com"  

  8. # Cleartext passwords, especially for the rootdn, should  

  9. # be avoided.  See slappasswd(8) and slapd.conf(5) for details.  

  10. # Use of strong authentication encouraged.  

  11. rootpw  secret  

  12. # rootpw  {crypt}ijFYNcSNctBYg  

 

      以上內容中,第6行將後綴修改成「dc=dlw,dc=com」,同時第7行的超級管理員的後綴部分也須要隨之修改。將第11行的註釋取消,設置超級管理員的密碼爲MD5密碼secret。
      修改密碼時須要注意rootpw前面不要有空格,以及rootpw與密碼之間使用Tab鍵分割。 
      通過以上修改,保存後退出,接着使用如下命令重啓slapd進程:

 

Python代碼  收藏代碼

  1. # 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」下的全部條目,可以使用如下命令:

Python代碼  收藏代碼

  1. # ldapsearch -x -b "dc=dlw,dc=com"  

 

執行結果以下圖所示。

 

 

而若是使用如下命令,將查詢顯示sn中以字符wu開頭的條目,將獲得以下圖所示的查詢結果,只找到一個條目。

 

Python代碼  收藏代碼

  1. # 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」。
      首先輸入如下命令,進行修改狀態:

Python代碼  收藏代碼

  1. # ldapmodify -x -D "cn=root,dc=dlw,dc=com" -W secret  

 

執行以上命令後,終端將等候用戶輸入須要修改條目的dn,輸入如下內容:

 

Python代碼  收藏代碼

  1. dn: cn=test, ou=managers, dc=dlw, dc=com  

  2. changetype: modify  

  3. replace: sn  

  4. sn: Test User Modify  

 

      以上輸入內容中,第1行查找須要修改的條目,第2行設置修改模式,第3行設置須要替換的屬性sn,第4行給屬性sn從新設置一個值,替換該屬性原有的值。
      輸入完以上內容以後再按Enter鍵,程序將按以上設置更新數據,而後按Ctrl+C鍵退出修改命令。執行過程以下圖所示。

 

使用以上命令修改條目的數據以後,可以使用如下命令查看是否修改爲功:

 

Python代碼  收藏代碼

  1. #ldapsearch -x -b 'dc=dlw,dc=com' 'cn=test'  

 

執行以上命令查看test條目的數據以下圖所示,能夠看到sn屬性被修改了。

 

 

2.經過文件修改


    經過前面的方式對條目進行修改時,很不方便,若是在交互方式時輸錯了某個字符,只能中斷命令後從新進行修改。所以,更好的修改方法是首先將修改時輸入的文字保存到一個文件中,而後以該文件做爲輸入進行修改。用這種方式進行操做,首先須要建立一個臨時文件,用來保存須要進行的修改操做,下面演示這種方式的修改過程。

【例子】 經過修改命令將前面LDAP數據庫中的信息還原,即將sn屬性由「Test User Modify」修改成「Test User」。
具體操做步驟以下:
(1)使用vi編輯器建立一個文件modify,在其中輸入如下內容:

Python代碼  收藏代碼

  1. dn: cn=test,ou=managers,dc=dlw,dc=com  

  2. changetype: modify  

  3. replace: sn  

  4. sn: Test User  

 從以上輸入內容可看到,與在交互式時輸入的內容徹底相同。
技巧:使用文件方式修改條目,可方便修改和檢查,若某個地方有輸入錯誤,可修改後再調用ldapmodify進行修改,減小輸入量。

(2)使用如下命令調用modify的內容進行修改:

 

Python代碼  收藏代碼

  1. # ldapmodify -x -D "cn=root,dc=dlw,dc=com" -w secret -f modify  

 

執行結果以下圖所示。

 

 

刪除條目


      對於目錄數據庫中不用的條目,也可以使用ldapdelete命令將其刪除。該命令的格式以下:


      ldapdelete  選項  刪除條目


      該命令使用的選項與ldapadd相似,就再也不列出來了。
      刪除目錄數據庫中的「cn=test,ou=managers,dc=dlw,dc=com」條目,具體命令以下:

 

Python代碼  收藏代碼

  1. # ldapdelete -x -D "cn=root,dc=dlw,dc=com" -w secret \  

  2. "cn=test,ou=managers,dc=dlw,dc=com"  

 

      順利執行以上命令後,終端上將不會有任何信息輸出,表示完成了刪除操做。
      使用ldapdelete命令只能刪除樹形結構中的葉結點條目,若是刪除非葉結點條目,將出現錯誤提示。例如,執行如下命令刪除根結點「dc=dlw,dc=com」,因爲根結點下面還有結點,將顯示以下圖所示的錯誤提示信息:

 

 

Python代碼  收藏代碼

  1. # ldapdelete -x -D "cn=root,dc=dlw,dc=com" -w secret "dc=dlw,dc=com"  

 

數據導出


      經過ldapadd命令可向目錄數據庫中添加數據,在某些狀況下,可能還須要進行反向操做,即將目錄數據庫中的數據導出。
      使用ldapsearch命令對目錄數據庫進行搜索,而後經過重定向將搜索結果保存到一個文件中,可達到導出數據的目的。另外,導出數據更經常使用的是slapcat命令,該命令的格式以下:


      slapcat  選項


      最經常使用的選項就是-l,表示導出爲LDIF文件格式。
      如將本章前面例子中建立的目錄數據庫導出爲export.ldif文件,可以使用如下命令:

 

Python代碼  收藏代碼

  1. #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指令前的註釋符號,取消後的結果以下:

Python代碼  收藏代碼

  1. # Replicas of this database  

  2. replogfile      /var/lib/ldap/replog  

 

增長replica指令,如:

 

Python代碼  收藏代碼

  1. #replace config  

  2. replica uri=ldap://192.168.14.21:389     #指定從服務器主機名和端口號  

  3. binddn="cn=root,dc=dlw,dc=com"         #指定需同步的DN的管理員  

  4. bindmethod=simple credentials=111111  #指定驗證方式和需同步的DN的管理員密碼  

 

設置從服務器


配置從服務器上的slapd.conf文件,增長updatedn指令,如:

 

Python代碼  收藏代碼

  1. updatedn " cn=root,dc=dlw,dc=com"          #與主服務器的binddn對應  

 

在從服務器的配置文件中,不要包含replica和replogfile指令。


測試主從LDAP服務器


通過以上步驟的操做,主從LDAP服務器都已準備好,接下來就能夠測試相關操做。


   1.啓動主LDAP服務器
        在主LDAP服務器中啓動slapd進程和slurpd進程。
   2.啓動從LDAP服務器
        在主LDAP服務器中啓動slapd進程。


【例子】測試主從LDAP服務器。
具體操做步驟以下:

(1)在主LDAP服務器中使用如下命令修改一個條目:

 

Python代碼  收藏代碼

  1. #ldapmodify -x -D "cn=root,dc=dlw,dc=com" -w secret  

 

輸入如下內容,修改cn=dlw條目的內容:

 

Python代碼  收藏代碼

  1. dn: cn=dlw,ou=managers,dc=dlw,dc=com  

  2. changetype: modify  

  3. replace: sn  

  4. sn: dongliwei  

 

輸入後按Enter鍵完成修改,操做過程如圖5-7所示(將sn修改成dongliwei)。

 

 

(2)在從LDAP服務器中進行操做,查看主LDAP服務器中的操做是否被複制到從LDAP服務器中來了。在從LDAP服務器中使用如下命令進行查詢:

 

Python代碼  收藏代碼

  1. #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文件,在其中查找如下內容:

Python代碼  收藏代碼

  1. $DEFAULT_BASE="dc=padl,dc=com";  

 

將其修改成目錄服務器使用的根,如本章使用的例子要改成如下形式:

 

Python代碼  收藏代碼

  1. $DEFAULT_BASE="dc=dlw,dc=com";  

 

保存後退出。

 

 

(2)使用如下命令執行腳本migrate_base.pl,用來建立根項,併爲Hosts、Networks、Group和People等建立低一級的組織單元(執行該命令將生成base.ldif文件):

 

Python代碼  收藏代碼

  1. #./migrate_base.pl > base.ldif  

 

(3)因爲本章前面已在LDAP服務器中建立了根項「dc=dlw,dc=com」,所以將base.ldif文件中的第1個條目刪除,另外,在用戶認證中只用到組和用戶,也將其餘無關條目刪除,只保存如下內容(例子):

 

Python代碼  收藏代碼

  1. dn: ou=People,dc=dlw,dc=com  

  2. ou: People  

  3. objectClass: top  

  4. objectClass: organizationalUnit  

  5.   

  6. dn: ou=Group,dc=dlw,dc=com  

  7. ou: Group  

  8. objectClass: top  

  9. objectClass: organizationalUnit  

 

(4)使用如下命令將base.ldif文件中的條目導入目錄數據庫:

 

Python代碼  收藏代碼

  1. # ldapadd -x -D "cn=root,dc=dlw,dc=com" -w secret -f  base.ldif  

 

執行結果以下圖所示。

 

 

(5)開始遷移組信息。使用如下命令將/etc/group中的組信息保存到臨時文件group.tmp中:

 

Python代碼  收藏代碼

  1. #cat /etc/group > group.tmp  

 

(6)系統組不導入LDAP目錄數據庫中,所以需對group.tmp文件中的信息進行編輯,只保留須要導入LDAP目錄數據庫的組的信息。


(7)使用如下命令將組的數據生成LDIF條目信息:

Python代碼  收藏代碼

  1. #./migrate_group.pl group.tmp > group.ldif  

 

(8)使用cat命令查看group.ldif的內容,可看到已按posixGroup這種objectClass將組的數據組織完成,以下圖所示。

 

 

(9)相似地,使用如下命令導出/etc/passwd中的用戶數據,並刪除不須要的用戶,而後使用migrate_passwd.pl腳本生成LDIF文件:

 

Python代碼  收藏代碼

  1. #cat /etc/passwd > passwd.tmp  

  2. #./migrate_passwd.pl passwd.tmp > passwd.ldif  

  3. #cat passwd.ldif  

 

提示:從上面列出的屬性的名稱能夠很容易地與組、用戶的相關信息聯繫起來。

 

(10)使用如下命令將組和用戶信息導入目錄數據庫:

 

Python代碼  收藏代碼

  1. #ldapadd -x -D "cn=root,dc=dlw,dc=com" -w 111111 -f group.ldif  

  2. #ldapadd -x -D "cn=root,dc=dlw,dc=com" -w 111111 -f passwd.ldif  

 

執行以上命令的過程以下圖所示。

 

 

(11)使用如下命令查看目錄數據庫中用戶root的信息,用「uid=root」做查詢條件:

 

Python代碼  收藏代碼

  1. #ldapsearch -x -b 'dc=dlw,dc=com' 'uid=root'  

 

查找結果以下圖所示。

 

 

      經過以上的操做,就將須要導入的組和用戶的信息導入到了目錄數據庫中,接下來還須要對客戶端進行設置,使用LDAP進行登陸驗證操做。

 

 

設置客戶端登陸


若客戶端要使用LDAP進行用戶登陸認證,則可以使用本地計算機中不存在的用戶名進行登陸操做。
【例子】 修改配置文件,設置客戶端使用LDAP進行認證。
具體操做步驟以下:
(1)修改客戶端計算機中的/etc/sysconfig/authconfig文件,將如下項都修改成yes:

 

Python代碼  收藏代碼

  1. USELDAP=yes  

  2. USELDAPAUTH=yes  

  3. USEMD5=no  

  4. USESHADOW=yes  

  5. USELOCAUTHORIZE=yes  

 

(2)修改客戶端計算機中的/etc/openldap/ldap.conf文件,修改內容以下:

 

Python代碼  收藏代碼

  1. host 192.168.14.20  

  2. BASE dc=dlw,dc=com  

  3. 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)等信息。

Python代碼  收藏代碼

  1. Objectclass格式:  

  2. objectclass = ( whsp  

  3. numericoid whsp //全局惟一的 OID  

  4. "NAME" qdescrs ] //類名稱  

  5. "DESC" qdstring ] //類描述  

  6. "OBSOLETE" whsp ]  

  7. "SUP" oids ] ; //父類  

  8. [ ( "ABSTRACT" / "STRUCTURAL" / "AUXILIARY" ) whsp ]  

  9. "MUST" oids ] ; //必填屬性集合  

  10. "MAY" oids ] //選填屬性集合  

  11. whsp ")"  

 

例如:

 

Python代碼  收藏代碼

  1. # Object Class Definitions   

  2. objectclass ( 1.3.6.1.4.1.7914.1.2.2.1 NAME 'kunmailUser'   

  3. DESC 'KunMail-LDAP User'   

  4. SUP top   

  5. STRUCTURAL  

  6. MUST(username$cn$vuid$vgid)  

  7. 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對象類:

Python代碼  收藏代碼

  1. objectclass= ( 1.1.2.2.1 NAME 'myPhotoObject'  

  2. DESC 'mixin myPhoto'  

  3. AUXILIARY  

  4. MAY myPhoto )  

 

      若是您的組織須要一個私有的結構化對象類來表示用戶,你能夠子類化任何一個已經存在的person類,好比inetOrgPerson(RFC2798),而後增長鬚要的屬性:

 

Python代碼  收藏代碼

  1. objectclass =( 1.1.2.2.2 NAME 'myPerson'  

  2. DESC 'my person'  

  3. SUP inetOrgPerson  

  4. MUST ( 'myUniqueName' $ 'givenName' )  

  5. MAY 'myPhoto' )  

 

      該對象類從inetOrgPerson中繼承容許的或者必須的屬性,可是,要求myUniqueName和givenName,容許myPhoto。

 

 

Attribute


      attribute就是一個上面objectclass中可能包含的屬性,對其的定義包括名稱,數據類型,單值仍是多值以及匹配規則等。後面用具體的例子來講明。

 

Attribute格式:

 

Python代碼  收藏代碼

  1. attributeType ( whsp  

  2. numericoid whsp //全局惟一的 OID  

  3. "NAME" qdescrs ] //屬性名稱  

  4. "DESC" qdstring ] //屬性描述  

  5. "OBSOLETE" whsp ]  

  6. "SUP" woid ] //本屬性從其它屬性中派生出來的  

  7. "EQUALITY" woid //相等性匹配  

  8. "ORDERING" woid//順序匹配  

  9. "SUBSTR" woid ] //字符串匹配  

  10. "SYNTAX" whsp noidlen whsp ] //字段的數據類型的OID  

  11. "SINGLE-VALUE" whsp ] //定義本屬性爲單值(默認多值)  

  12. "COLLECTIVE" whsp ] //default not collective  

  13. "NO-USER-MODIFICATION" whsp ]//default user modifiable  

  14. "USAGE" whsp AttributeUsage ]//default userApplications  

  15. whsp ")"  

  16. AttributeUsage =  

  17. "userApplications" /  

  18. "directoryOperation" /  

  19. "distributedOperation" / ; DSA-shared  

 

whsp是空格的意思(' ')。numericoid 是全局惟一的 OID,是帶.的十進制形式 (e.g. 1.1.0), qdescrs有一個或幾個意思, woid 可使名稱或者是 OID 可選擇的必定長度的後綴(e.g {10})。
例如,屬性類型name和cn在core.schema中以下定義:

Python代碼  收藏代碼

  1. attributeType ( 2.5.4.41 NAME 'name'  

  2. DESC 'name(s) associated with the object'  

  3. EQUALITY caseIgnoreMatch  

  4. SUBSTR caseIgnoreSubstringsMatch  

  5. SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32768} )  

  6. attributeType ( 2.5.4.3 NAME ( 'cn' $ 'commonName' )  

  7. DESC 'common name(s) assciated with the object'  

  8. SUP name )  

  9. attributetype ( 1.3.6.1.4.1.7914.1.2.1.6 NAME 'quota'   

  10. DESC 'The amount of space the user can use until all further messages get bounced.'   

  11. SYNTAX 1.3.6.1.4.1.1466.115.121.1.44   

  12. 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)。

Python代碼  收藏代碼

  1. attributetype ( 1.1.2.1.1 NAME 'myUniqueName'  

  2. DESC 'unique name with my organization'  

  3. EQUALITY caseIgnoreMatch  

  4. SUBSTR caseIgnoreSubstringsMatch  

  5. SYNTAX 1.3.6.1.4.1.1466.115.121.1.15  

  6. SINGLE-VALUE )  

 

可是,若是咱們要使name屬性包含一個斷言,這個屬性能夠被定義爲name的子屬性。

 

Python代碼  收藏代碼

  1. attributetype ( 1.1.2.1.1 NAME 'myUniqueName'  

  2. DESC 'unique name with my organization'  

  3. SUP name )  

 

      不少的組織爲每個用戶保留一個頭像。myPhoto屬性類型的定義能夠用來保存用戶的頭像。固然用戶能夠選擇jpegPhoto屬性類型(RFC2798)(或其子類型)來保存頭像。固然你只能在圖片符合JPEG File Interchange Format時使用。
      固然,一個使用八進制語法的屬性類型能夠這樣的定義:

 

Python代碼  收藏代碼

  1. attributetype ( 1.1.2.1.2 NAME 'myPhoto'  

  2. DESC 'a photo (application defined format)'  

  3. SYNTAX 1.3.6.1.4.1.1466.115.121.1.40  

  4. SINGLE-VALUE )  

 

      在這,語法中並無置頂photo的格式(format),這裏假設訪問屬性的應用能夠對其值進行處理。
      若是你想支持多種圖片格式,你須要爲每個格式定義屬性類型。爲圖片添加類型信息的前綴。或者使用ASN.1描述值,和use the ;binary transfer option。
      可使圖片屬性可以保存URI,你能夠在labeledURI(RFC2079)後建立一個屬性,或者建立一個子類型。

 

Python代碼  收藏代碼

  1. attributetype ( 1.1.2.1.3 NAME 'myPhotoURI'  

  2. DESC 'URI and optional label referring to a photo'  

  3. 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的定義:

 

Python代碼  收藏代碼

  1. objectclass=(2.5.20.1 NAME 'subschema'  AUXILIARY  

  2.  MAY ( dITStructureRules $ nameForms $ ditContentRules $  

  3. objectClasses $ attributeTypes $ matchingRules $ matchingRuleUse ) )  

 

      首先是ID,這裏是2.5.20.1,接着是NAME,AUXILIARY說明是輔助型,以後是可選屬性的定義,subschema中沒有定義必須屬性,若是須要定義,應該和MAY同樣,將屬性放在MUST()中並用$隔開
      再來看一個屬性定義:

 

Python代碼  收藏代碼

  1. attributetype ( 2.5.4.3 NAME 'cn' SUP name EQUALITY caseIgnoreMatch )  

 

      能夠看到cn屬性的父屬性是name,它相等性匹配於caseIgnoreMatch(匹配原則爲EQUALITY,還有如SUBSTR是字符串匹配,ORDERING是順序匹配)
      syntax定義通常都比較簡單,如:

 

Python代碼  收藏代碼

  1. ( 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,就看他的吧

 

Python代碼  收藏代碼

  1. attributetype ( 2.5.13.2 NAME 'caseIgnoreMatch'  

  2.       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有個一個大體的說明,可能有不到位或不妥之處,還望你們指正。

相關文章
相關標籤/搜索