Ldap 從入門到放棄(一)


 

OpenLDAP 2.4版本 快速入門


本文內容是自己通過官網文檔、網絡和相關書籍學習和理解並整理成文檔,其中有錯誤或者疑問請在文章下方留言。

一、Introduction to OpenLDAP Directory Services

  1、What is a directory service?

  目錄是一個專門的數據庫,專門用於搜索和瀏覽,另外也支持基本的查詢和更新功能。


   Note:目錄被一些人視為僅僅是一個優化了讀取操作的數據庫。這一定義,往最好了說,是過於簡單化了。


   目錄往往包含描述性的,基於屬性的信息和支持先進的過濾功能。目錄一般不支持被設計用於處理大批量復雜更新的數據庫管理系統的復雜交易或回滾計划。目錄的更新通常是簡單的全有或全無的變更,如果變更被允許的話。目錄一般都調整為快速反應大批量查找或搜索操作. 它們可能有能力復制廣泛的信息,以提高可用性和可靠性,同時降低響應時間. 當復制目錄信息時,臨時的復制品之間的不一致性可能可以接受,只要矛盾及時得到解決。

  有許多不同的方式提供一個目錄服務。不同的方法允許不同種類的信息存儲在目錄中,對於信息可以如何轉發,查詢和更新,以及如何保護未經授權的訪問,等有不同的要求。一些目錄服務是本地的,提供服務給一個限制的范圍內(例如,一台機器的finger服務)。其他服務是全球性的,提供服務給更廣泛的范圍內(例如,整個互聯網。全球服務通常是分散的,也就是說,它們包含的數據是分散在許多機器,所有這些合作來提供目錄服務。通常情況下一個全球性的服務定義了一個統一的名字空間,提供同一視圖的數據,無論您身在何處和數據本身有何關系。
  一個網站目錄,如開放式目錄管理項目http://dmoz.org提供。就是一個很好的目錄服務例子。這些服務把網頁目錄化,並專門設計用於支持瀏覽和搜索。
  雖然有人認為Internet Domain Name System(DNS)是一個全球分布式目錄服務的例子,但是DNS是不能瀏覽或搜尋的。它更准確的描述是一個全球型的分布查找服務。

  2、What is LDAP?

  LDAP (Lightweight Directory Access Protocol ,LDAP) 表示輕量級目錄訪問協議。顧名思義,它是一個輕量級協議,用於訪問目錄服務,特別是基於X.500的目錄服務。LDAP運行在TCP/IP或其他面向連接的傳輸服務。LDAP是一個IETF標准傳輸協議,在輕量級目錄訪問協議(Lightweight Directory Access Protocol ,LDAP) RFC4510中被指定。
  What kind of information can be stored in the directory? 那么,什么類型的信息能被存儲在目錄里? LDAP的information model是基於entries(后面我們叫條目)。一個條目是一個屬性的集合,它有一個全球唯一的標識名(DN)。DN用於明確條目。每個條目的屬性有一個類型和一個或多個值。該類型通常是助記憶的字符串,像 "cn" 是通用名稱(我理解為人的名字),或“mail”就是電子郵件地址。它值的語法依賴於屬性類型。例如,cn 這個屬性,我們一般表示人的名字,比如 "Bab Jensen"。mail 屬性可以包含值"babs@example.com"。jpegPhoto 屬性可以包含一張以JPEG (binary)格式的照片。
  How is the information arranged? 在LDAP,目錄的條目被排列在一個層次樹狀結構。Openldap(ldap開源集中帳號管理架構的實現,被廣大互聯網公司采用,是我要主要講的產品module)目錄架構分為2種:一種為LDAP directory tree (traditional naming);另一種為LDAP directory tree (Internet naming)。習慣上,我們在樹根一般定義國家(c=CN)或者域名(dc=com),其次往往定義一個或多個組織(organization, o) 或組織單元(organization unit, ou)。一個組織單元可以包含people, printers, documents, or just about anything else you can think of。

Figure 2.1 shows an example LDAP directory tree using traditional naming

Figure 2.1 LDAP directory tree (traditional naming)

★ Figure 1.2 shows an example LDAP directory tree using domain-based naming

PS:目錄樹也可以基於Internet domain names的命名方式,而且這種方式正越來越受歡迎,因為它允許使用DNS為目錄服務定位,后面我們目錄樹的架構主要拿這個來講

 

 

Figure 2.2: LDAP directory tree (Internet naming)

  另外,我們可以通過使用一種特殊屬性objectClass(后面高級章節會跟這個attribute打交道),它可讓你的LDAP控制在一個條目中哪個屬性是必需或是允許的。objectClass 屬性的值決定了schema 規則條目必須遵從

  How is the information referenced? 一個條目(相當於關系數據庫中表的記錄)引用的是它的DN(Distinguished Name)(相當於關系數據庫表中的關鍵字Primary Key,DN可以看做是到目錄樹中某一對象的路徑),每個對象都有完全唯一的DN。DN是由對象本體開始(called the Relative Distinguished Name or RDN)再串連其祖先條目名字的一條路徑。 例如, 在上面Internet命名例子里的條目 Barbara Jensen 有一個 RDN 為 uid=babs 和一個 DN 為 uid=babs,ou=People,dc=example,dc=com全 DN 格式在 RFC4514 中的 "LDAP: String Representation of Distinguished Names."有描述。

  How is the information accessed? LDAP的功能模型中定義了一系列利用LDAP協議的操作,主要包括以下4個部分:

  • 查詢操作(ldapsearch): 允許查詢目錄並取得條目,其查詢性能要比關系數據庫好。
  • 更新操作(ldapsearch): 目錄樹條目支持條目的添加、刪除、修改等操作。
  • 同步操作: OpenLDAP是一種典型的分布式結構,提供復制同步,可將主服務器上的數據通過推或拉的機制實現在從服務器上更新,完成數據的同步,從而避免OpenLDAP服務器出現單點故障,影響用戶驗證。
  • 認證和管理操作: 允許客戶端在目錄中識別自己,並且能夠控制一個會話的性質。

  3、When should I use LDAP?

   這是個非常好的問題。 通常,當你需要通過標准化的方法訪問集中化管理和存儲的數據時,你應該使用一個目錄服務器。一些常見(但不限於此)的例子如下:

  • 機器驗證
  • 用戶驗證
  • 用戶/系統 組
  • 地址簿
  • 組織機構表
  • 資產跟蹤
  • 電話信息存儲
  • 用戶資源管理
  • E-mail地址查找
  • 應用配置存儲
  • PBX配置存儲
  • 其他.....

  除了上面官網提到的,還適用於不同平發行版的UNIX、Windows系統以及各種應用平台的用戶管理,如Apache、Nginx、Zabbix、Postfix、Samba、FTP、SVN、GIT、Openvpn、Hadoop、OpenStack 以及存儲設備控制台等。OpenLDAP適用於一台到數千台機器的系統,可實現帳號集中式統一管理。

  4、When should I not use LDAP? 

  當你開始發現自己用目錄來做你需要做的事情的時候很別扭,就可能需要重新設計了。或者你只是需要一個應用來使用和操作你的數據。當LDAP對某項工作很合適的時候,很明顯就能看出來。(官方的說法)

  5、How does LDAP work?

  OpenLDAP目前是一款開源的帳號集中管理軟件,且屬於C/S架構。通過配置服務器和客戶端,實現帳號的管理,並通過余第三方應用相結合,實現客戶端所有帳號均可通過服務端進行驗證授權。

  OpenLDAP的工作模型,如Love cat圖所示:

  

  OpenLDAP工作模型解釋如下:

  • 客戶端向OpenLDAP服務器發起驗證請求;
  • 服務器接受用戶請求后,並通過slapd進程向后端的數據庫進行查詢;
  • slapd將查詢的結果返回給客戶端即可。如果有緩存機制,服務端會先將查詢的條目進行緩存,然后再發給客戶端。

  6、What is the difference between LDAPv2 and LDAPv3?(這里直接貼官網的,基本就是schema,sasl,tls,unicode,ldap的uri格式,ldap數據導入導出的文件接口的ldif等的不同)

LDAPv3 was developed in the late 1990's to replace LDAPv2. LDAPv3 adds the following features to LDAP:
  Strong authentication and data security services via SASL.
  Certificate authentication and data security services via TLS (SSL)
  Internationalization through the use of Unicode
  Referrals and Continuations
  Schema Discovery
  Extensibility (controls, extended operations, and more)
LDAPv2 is historic (RFC3494). As most so-called LDAPv2 implementations (including slapd(8)) do not conform to the LDAPv2 technical specification, interoperability amongst implementations claiming LDAPv2 support is limited. As LDAPv2 differs significantly from LDAPv3, deploying both LDAPv2 and LDAPv3 simultaneously is quite problematic. LDAPv2 should be avoided. LDAPv2 is disabled by default.

  7、OpenLDAP schema 概念

    1、schema 介紹及用途

  schema 是OpenLDAP 軟件的重要組成部分,主要用於控制目錄樹中各種條目所擁有的對象類以及各種屬性的定義,並通過自身內部規范機制限定目錄樹條目所遵循的邏輯結構以及定義規范,保證整個目錄樹沒有非法條目數據,避免不合法的條目存在目錄樹中,從而保障整個目錄樹信息的完整性、唯一性。

    在OpenLDAP 目錄樹中,schema 用來指定一個條目所包含的對象類(objectClass)以及每一個對象類所包含的屬性值(attribute value)。其屬性又分為必要屬性和可選屬性兩種,一般必要屬性是指添加條目時必須指定的屬性,可選屬性是可以選擇或不選擇的。schema 定義對象類對象類包含屬性的定義,對象類和屬性組合成條目。

    目錄樹中條目可理解為是一個具體的對象,它們均是通過schema 創建的,並符合schema 的標准規范,如對你所添加的數據條目中所包含的對象類級屬性進行檢測,檢測通過完成添加,否則打印錯誤信息。因此,schema 是一個數據模型,數據模型可以理解為關系數據庫的存儲引擎,如MyISAM、InnoDB,主要用來決定數據按照什么方式進行存儲,並定義存儲在目錄樹不同條目中數據類型之間的關系。

    schema 是一個標准,定義了OpenLDAP 目錄樹對象和屬性存取方式,這也是OpenLDAP 能夠存儲什么數據類型的取決因素。因此數據有什么屬性等均根據schema 來實現。OpenLDAP 默認的schema 文件一般存放在/etc/openldap/schema/目錄下,此目錄下每個文件定義了不同的對象類和屬性。如果想引用額外的schema,只需要在配置文件中通過include 包含所指定的schema 即可。

    以下代碼可用於獲取當前系統OpenLDAP 所使用的schema 規范,了解當前所使用的schema文件,這有助於添加目錄樹中的條目信息,如對象類以及包含哪些屬性及值,減少添加條目提示的各種語法錯誤。

[root@test schema]# cat /etc/openldap/slapd.conf | grep '^incl*'
include         /etc/openldap/schema/corba.schema
include         /etc/openldap/schema/core.schema
include         /etc/openldap/schema/cosine.schema
include         /etc/openldap/schema/duaconf.schema
include         /etc/openldap/schema/dyngroup.schema
include         /etc/openldap/schema/inetorgperson.schema
include         /etc/openldap/schema/java.schema
include         /etc/openldap/schema/misc.schema
include         /etc/openldap/schema/nis.schema         #定義網絡信息服務
include         /etc/openldap/schema/openldap.schema
include         /etc/openldap/schema/ppolicy.schema     #定義用戶密碼規則
include         /etc/openldap/schema/collective.schema
include         /etc/openldap/schema/sudo.schema        #自己添加提權的
include         /etc/openldap/schema/openssh-lpk-openldap.schema
   

  2、獲取schema 的途徑

    默認安裝OpenLDAP 組件后,系統的配置定義一組常用的schema 文件,這組文件一般存放在/etc/openldap/schema 目錄內,可通過include 引用。當所定義的objectClass 不存在時,該如何獲取objectClass?下面就介紹如何獲取schema 來包含objectClass。

    通過服務器自身軟件包的安裝來生成schema 文件,本節以sudo 為例演示其過程。

  • 查看軟件包生成的文件列表

1
2
3
4
[root@ test  ~] # rpm -ql sudo|grep schema
/usr/share/doc/sudo-1 .8.6p3 /schema .ActiveDirectory
/usr/share/doc/sudo-1 .8.6p3 /schema .OpenLDAP
/usr/share/doc/sudo-1 .8.6p3 /schema .iPlanet
  • 通過配置文件引入schema

1
2
cp  /usr/share/doc/sudo-1 .8.6p3 /schema .OpenLDAP  /etc/openldap/schema/sudo .schema
echo  "include /etc/openldap/schema/sudo.schema"  /etc/openldap/slapd .conf
  • 通過schema 產生ldif 文件

1
2
3
slapcat -f ~ /sudo/sudoSchema .conf -F  /tmp/  -n0 -s  "cn={0}sudo,cn=schema,cn=config"  > ~ /sudo/sudo .ldif 
sed  -i  "s/{0}sudo/{12}sudo/g"  ~ /sudo/sudo .ldif 
head  -n-8 ~ /sudo/sudo .ldif > ~ /sudo/sudo-config .ldif
  • 通過OpenLDAP 指令導入目錄樹

1
ldapadd -Y EXTERNAL -H ldapi: ///  -f ~ /sudo/sudo-config .ldif

    此時就可以通過sudo schema 文件定義各種sudo 規則從而實現用戶權限的控制。

7、objectClass 詳解

    在OpenLDAP 目錄樹中,每個條目必須包含一個屬於自身條件的對象類,然后再定義其條目屬性及對應的值。

    OpenLDAP 條目的屬性能否添加取決於條目所繼承的objectClass 是否包含此屬性。objectClass具有繼承關系,也就是說,條目添加的屬性最終取決於自身所繼承的所有objectClass 的集合。如果所添加的屬性不在objectClass 范圍內,此時目錄服務器不允許添加此屬性。如果要添加,就必須添加schema 文件產生objectClass 所對應的屬性。objectClass 和Attribute 由schema 文件來規定,存放在/etc/openldap/schema 目錄下,schema 文件規范objectClass 的構成以及屬性和值在目錄樹中的對應關系。后面章節會介紹如何通過定義schema 文件來產生objectClass,從而生成所需要的屬性。

    每一個屬性和值將用作每個條目在目錄樹中存儲信息的標准,例如能包含哪些屬性信息。對於objectClass 的理解,讀者可以將objectClass 的屬性值理解為一種模板。模板定義哪些信息可以存取,哪些信息不可以存儲在目錄樹中。

  1、objectClass 案例分析

    下面給出兩個對象類案例分析示例。

  • objectClass 案例分析示例1

    所有的objectClass 定義都存放在/etc/openldap/schema/*.schema 文件中。例如,person 屬性的定義就存放在core.schema 文件中。

1
2
3
4
5
objectclass ( 2.5.6.6 NAME  'person' 
        DESC  'RFC2256: a person' 
        SUP  top  STRUCTURAL 
        MUST ( sn $ cn )  M
        AY ( userPassword $ telephoneNumber $ seeAlso $ description ) )

    分析:

    如果要定義person 類型,需要定義頂級為top,並且必須定義sn 和cn 兩個屬性,還可以附加userPassword、telephoneNumber、seeAlso、description 4 個屬性值。郵件地址、國家等屬性不可以定義,除非讀者添加相關的objectClass 條目,否則提示相關屬性不允許添加。

  • objectClass 案例分析示例2

1
2
3
4
5
6
7
8
9
objectclass: (2.5.6.0 NAME  'top' 
        ABSTRACT 
        MUST (objectClass)) 
  
objectclass: ( 2.5.6.6 NAME  'person' 
        SUP  top  STRUCTURAL 
        MUST (sn $ cn ) 
        MAY (userPassword $ telephoneNumber $ 
        seeAlso $ description ))

    分析:

    對於此案例,如果要定義top 屬性,必須定義一個objectClass 屬性。因為此案例中還定義了person 屬性,所以要必須定義sn 和cn 屬性,以及可以附加的屬性(userPassword、telephoneNumber、seeAlso、description)。此案例中必須要定義的有3 個屬性分別是objectClass、sn 以及cn。通過此案例下一級的objectClass 可以繼承上一級objectClass 的屬性信息。

  2、屬性概述

    屬性(Attribute)在目錄樹中主要用於描述條目相關信息,例如用戶條目的用途、聯系方式、郵件、uid、gid、公司地址等輔助信息。屬性由objectClass 所控制,一個objectClass 的節點具有一系列Attribute,Attribute 可以理解為Linux 系統當中的變量,每個變量都有對應的值,OpenLDAPAttribute 也是有對應的值。這些屬性的對應值表示每個對象的特點,但有些屬性在添加時是必須指定的,有些屬性是非必要的(類似於條目更詳細的描述)。在目錄樹中常用的Attribute 有uid、sn、giveName、I、objectClass、dc、ou、cn、mail、telephoneNumber、c 等。

    屬性(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不同。

8、LDIF 詳解

  1、LDIF 用途

    LDIF(LDAP Data Interchanged Format)的輕量級目錄訪問協議數據交換格式的簡稱,是存儲LDAP 配置信息及目錄內容的標准文本文件格式,之所以使用文本文件來存儲這些信息是為了方便讀取和修改,這也是其他大多數服務配置文件所采取的格式。通常用來交換數據並在OpenLDAP服務器之間互相交換數據,並且可以通過LDIF 實現數據文件的導入、導出以及數據文件的添加、修改、重命名等操作,這些信息需要按照LDAP 中schema 的規范進行操作,並會接受schema 的檢查,如果不符合OpenLDAP schema 規范要求,則會提示相關語法錯誤。

  2、LDIF 文件特點

  • LDIF 文件每行的結尾不允許有空格或者制表符。

  • LDIF 文件允許相關屬性可以重復賦值並使用。

  • LDIF 文件以.ldif 結尾命名。

  • LDIF 文件中以#號開頭的一行為注釋,可以作為解釋使用。

  • LDIF 文件所有的賦值方式為:屬性:[空格]屬性值。

  • LDIF 文件通過空行來定義一個條目,空格前為一個條目,空格后為另一個條目的開始。

  3、LDIF 格式語法

  • LDIF 文件存取OpenLDAP 條目標准格式:

1
2
3
4
# 注釋,用於對條目進行解釋 
dn:條目名稱 
objectClass(對象類): 屬性值 
objectClass(對象類): 屬性值  ……
  • LDIF 格式樣例如下:

1
2
3
4
5
6
7
8
9
10
11
dn: uid=water,ou=people, dc =wzlinux, dc =com      #DN 描述項,在整個目錄樹上為唯一的 
objectClass:  top 
objectClass: posixAccount 
objectClass: shadowAccount 
objectClass: person 
objectClass: inetOrgPerson 
objectClass: hostObject 
sn: zuo 
cn: zuoyang 
telephoneNumber:xxxxxxxxxxx 
mail: xxxx@126.com

注:冒號后面有一個空格,然后才是屬性的值,schema 規范定義要求很嚴格。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM