天天看點

LDAP伺服器的概念和原理簡單介紹

目錄是一個為查詢、浏覽和搜尋而優化的專業分布式資料庫,它呈樹狀結構組織資料,就好象linux/unix系統中的檔案目錄一樣。目錄資料庫和關系資料庫不同,它有優異的讀性能,但寫性能差,并且沒有事務處理、復原等複雜功能,不适于存儲修改頻繁的資料。是以目錄天生是用來查詢的,就好象它的名字一樣。

目錄服務是由目錄資料庫和一套通路協定組成的系統。類似以下的資訊适合儲存在目錄中:

企業員工資訊,如姓名、電話、郵箱等;

公用證書和安全密鑰;

公司的實體裝置資訊,如伺服器,它的ip位址、存放位置、廠商、購買時間等;

ldap的結構用樹來表示,而不是用表格。正因為這樣,就不能用sql語句了

ldap可以很快地得到查詢結果,不過在寫方面,就慢得多

ldap提供了靜态資料的快速查詢方式

client/server模型,server 用于存儲資料,client提供操作目錄資訊樹的工具

這些工具可以将資料庫的内容以文本格式(ldap 資料交換格式,ldif)呈現在您的面前

ldap是一種開放internet标準,ldap協定是跨平台的interent協定

LDAP伺服器的概念和原理簡單介紹

在浏覽ldap相關文檔時經常會遇見一些概念,下面是常見概念的簡單解釋。

條目,也叫記錄項,是ldap中最基本的顆粒,就像字典中的詞條,或者是資料庫中的記錄。通常對ldap的添加、删除、更改、檢索都是以條目為基本對象的。

<code>dn</code>:每一個條目都有一個唯一的辨別名(distinguished name ,dn),如上圖中一個 dn:"cn=baby,ou=marketing,ou=people,dc=mydomain,dc=org" 。通過dn的層次型文法結構,可以友善地表示出條目在ldap樹中的位置,通常用于檢索。

<code>rdn</code>:一般指dn逗号最左邊的部分,如cn=baby。它與rootdn不同,rootdn通常與rootpw同時出現,特指管理ldap中資訊的最高權限使用者。

<code>base dn</code>:ldap目錄樹的最頂部就是根,也就是所謂的“base dn",如"dc=mydomain,dc=org"。

每個條目都可以有很多屬性(attribute),比如常見的人都有姓名、位址、電話等屬性。每個屬性都有名稱及對應的值,屬性值可以有單個、多個,比如你有多個郵箱。

屬性不是随便定義的,需要符合一定的規則,而這個規則可以通過schema制定。比如,如果一個entry沒有包含在 inetorgperson 這個 schema 中的<code>objectclass: inetorgperson</code>,那麼就不能為它指定employeenumber屬性,因為employeenumber是在inetorgperson中定義的。

ldap為人員組織機構中常見的對象都設計了屬性(比如commonname,surname)。下面有一些常用的别名:

屬性

别名

文法

描述

值(舉例)

commonname

cn

directory string

姓名

sean

surname

sn

chow

organizationalunitname

ou

機關(部門)名稱

it_section

organization

 o

組織(公司)名稱

example

telephonenumber

 

telephone number

電話号碼

110

objectclass

内置屬性

organizationalperson

對象類是屬性的集合,ldap預想了很多人員組織機構中常見的對象,并将其封裝成對象類。比如人員(person)含有姓(sn)、名(cn)、電話(telephonenumber)、密碼(userpassword)等屬性,機關職工(organizationalperson)是人員(person)的繼承類,除了上述屬性之外還含有職務(title)、郵政編碼(postalcode)、通信位址(postaladdress)等屬性。

通過對象類可以友善的定義條目類型。每個條目可以直接繼承多個對象類,這樣就繼承了各種屬性。如果2個對象類中有相同的屬性,則條目繼承後隻會保留1個屬性。對象類同時也規定了哪些屬性是基本資訊,必須含有(must 活required,必要屬性):哪些屬性是擴充資訊,可以含有(may或optional,可選屬性)。

對象類有三種類型:結構類型(structural)、抽象類型(abstract)和輔助類型(auxiliary)。結構類型是最基本的類型,它規定了對象實體的基本屬性,每個條目屬于且僅屬于一個結構型對象類。抽象類型可以是結構類型或其他抽象類型父類,它将對象屬性中共性的部分組織在一起,稱為其他類的模闆,條目不能直接內建抽象型對象類。輔助類型規定了對象實體的擴充屬性。每個條目至少有一個結構性對象類。

對象類本身是可以互相繼承的,是以對象類的根類是top抽象型對象類。以常用的人員類型為例,他們的繼承關系:

LDAP伺服器的概念和原理簡單介紹

下面是inetorgperson對象類的在schema中的定義,可以清楚的看到它的父類sub和可選屬性may、必要屬性must(繼承自organizationalperson),關于各屬性的文法則在schema中的attributetype定義。

對象類(objectclass)、屬性類型(attributetype)、文法(syntax)分别約定了條目、屬性、值,他們之間的關系如下圖所示。是以這些構成了模式(schema)——對象類的集合。條目資料在導入時通常需要接受模式檢查,它確定了目錄中所有的條目資料結構都是一緻的。

LDAP伺服器的概念和原理簡單介紹

schema(一般在<code>/etc/ldap/schema/</code>目錄)在導入時要注意前後順序。

ldap的背景程序slapd接收、響應請求,但實際存儲資料、擷取資料的操作是由backends做的,而資料是存放在database中,是以你可以看到往往你可以看到<code>backend</code>和<code>database</code>指令是一樣的值如 bdb 。一個 backend 可以有多個 database instance,但每個 database 的 suffix 和 rootdn 不一樣。openldap 2.4版本的子產品是動态加載的,是以在使用backend時需要<code>moduleload back_bdb</code>指令。

另外<code>config</code>是特殊的backend,用來在運作時管理slapd的配置,它隻能有一個執行個體,甚至無需顯式在slapd.conf中配置。

分布式ldap 是以明文的格式通過網絡來發送資訊的,包括client通路ldap的密碼(當然一般密碼已然是二進制的),ssl/tls 的加密協定就是來保證資料傳送的保密性和完整性。

external一般用于初始化添加schema時使用,如<code>ldapadd -y external -h ldapi:/// -f /etc/openldap/schema/core.ldif</code>。