天天看點

LDAP輕型目錄通路協定介紹及應用

LDAP不難,難的是資料太少,尤其是原理和應用方面的,以安裝介紹居多。這也是我寫這篇部落格的原因。

LDAP(英文:Lightweight Directory Access Protocol,縮寫:LDAP,/ˈɛldæp/)即輕型目錄通路協定。LDAP由網際網路工程任務組(IETF)的文檔RFC定義,使用了描述語言ASN.1定義,前生是DAP,但是DAP過于複雜。據說LDAP的出現是源于網際網路龐大的郵箱位址目錄。

LDAP最大的好處就是他是一個協定,一個為多數軟體用來作為登入鑒權的标準。在你為各個系統諸多使用者名和密碼而煩惱的時候,正是LDAP登場的時候。支援LDAP的軟體都有哪些呢?

支援LDAP認證的軟體産品(包括但不限于):zabbix、grafana、jenkins、nginx、apache等。

典型的系統通路如下:

LDAP輕型目錄通路協定介紹及應用
LDAP既然是協定,自然要定義一堆的概念。概括的講LDAP 是一個條目樹。條目是有一或者多個 objectClass 組成,objectClass是由一或者多個屬性(Attributes)組成,屬性即key-value鍵值對組成。形成一個樹形結構。其中每個屬性和objectClass名稱都是唯一的。說了這麼多,不如一張圖來的直覺。
LDAP輕型目錄通路協定介紹及應用

概念解釋:

Schemas:一組objectClass,前人提供了很多Schemas适用于不同業務場景适用。

objectClass:屬性集合。

Attributes:屬性。

常見屬性如下:

DN:唯一名稱辨別,各級DN組成目前目錄的唯一ID。

CN:名稱屬性。

OU:組織。

LDAP中的屬性都是按照描述語言ASN.1定義,以上是開放環境認可的屬性(未一一列出)。引入LDAP的資料導入導出檔案.ldif檔案表示如下:

dn: cn=Robert Smith,ou=people,dc=example,dc=com
objectclass: inetOrgPerson
cn: Robert Smith
cn: Robert
sn: Smith
uid: rsmith
mail: [email protected]
mail: [email protected]
ou: sales
           

目錄樹如圖:

LDAP輕型目錄通路協定介紹及應用

以上是LDAP的概念介紹,下面講LDAP協定的具體實作。主要有windows下的Microsoft出品Active Directory(不在介紹範圍),還有一個就是linux環境下的OpenLDAP。LDAP被設計成解決讀多寫少的目錄型資料通路權限控制,如果位址簿,組織關系等。OpenLDAP同樣也提供了主從複制的高可用方案。資料也可以分布式存儲在不同的LDAP節點,通過配置關聯,完成跨節點的查詢。

很多人喜歡拿LDAP和資料庫類比,或者說LDAP是另外一種資料庫。LDAP的協定規定了資料的導入導出格式即LDIF檔案,但是對于資料存儲卻無限制。通常LDAP的資料存儲會用到其他關系資料庫,如OpenLDAP就可以用Berkeley DB存儲資料。OpenLDAP是提供了管理目錄資料的服務的軟體産品,多數場景用來做統一登入認證。

OpenLDAP支援各種對目錄資料通路的控制,即access規則:

access to <what> [ by <who> [<accesslevel>] [<control>] ]+
           

還有一種on line寫法

olcAccess: to <what> [ by <who> [<accesslevel>] [<control>] ]+
           

olcAccess是on line configuration,能提供線上修改配置而不需要重新開機LDAP服務(不在本文介紹)。

示例:

access to  *
       by  self write
       by  anonymous auth
       by  * read
           

含義:針對整個目錄樹(*),目錄使用者本身有寫的權限,匿名使用者可以用來登入認證,所有人可讀(如果開放匿名使用者的話)。權限設定不正确會直接導緻登入認證功能失敗。OpenLDAP提供了非常豐富的access控制,詳見:

http://www.zytrax.com/books/ldap/ch6/#access

LDAP定義了幾種資料的操作方法:

bind, add, modify, delete,search。一般需要先進行bind即認證操作,認證通過後進行其他如add或search操作。LDAP官網有詳細的request和response定義。

LDAP有自己的查詢文法定義,各種filter。

如下示例一種java語言的spring提供的LdapTemplate提供的認證方式:

ldapTemplate.authenticate(LdapQueryBuilder.query().where("cn").is(req.getUsername()), newPassword);
           

OpenLDAP安裝參見官網:

https://www.openldap.org/doc/admin24/quickstart.html

參考網站:

http://www.zytrax.com/books/ldap/ http://www.openldap.org/ https://ldap.com/