LDAP概念和原理介紹
相信對於許多的朋友來說,可能聽說過LDAP,但是實際中對LDAP的了解和具體的原理可能還比較模糊,今天就從“什么是LDAP”、“LDAP的主要產品”、“LDAP的基本模型”、“LDAP的使用案例”四個方面來做一個介紹。
我們在開始介紹之前先來看幾個問題:
1. 我們日常的辦公系統是不是有多個?
2. 每個系統之間是不是都有獨立的賬號密碼?
3. 密碼多了,有時候半天想不起來哪個密碼對應哪個系統?
4. 每次新項目的開發,都需要重新開發和維護一套用戶密碼?
5. 維護多套系統的用戶是不是非常頭疼?
So,如今大家再也不用為上面的的問題頭疼了,因為“LDAP統一認證服務”已經幫助大家解決這些問題了。那么相信大家對“LDAP統一認證服務”是干嘛的已經有一個大概的了解了吧?那我們開始今天要講解的內容吧!
一、什么是LDAP?
(一)在介紹什么是LDAP之前,我們先來復習一個東西:“什么是目錄服務?”
1. 目錄服務是一個特殊的數據庫,用來保存描述性的、基於屬性的詳細信息,支持過濾功能。
2. 是動態的,靈活的,易擴展的。
如:人員組織管理,電話簿,地址簿。
(二)了解完目錄服務后,我們再來看看LDAP的介紹:
LDAP(Light Directory Access Portocol),它是基於X.500標准的輕量級目錄訪問協議。
目錄是一個為查詢、瀏覽和搜索而優化的數據庫,它成樹狀結構組織數據,類似文件目錄一樣。
目錄數據庫和關系數據庫不同,它有優異的讀性能,但寫性能差,並且沒有事務處理、回滾等復雜功能,不適於存儲修改頻繁的數據。所以目錄天生是用來查詢的,就好象它的名字一樣。
LDAP目錄服務是由目錄數據庫和一套訪問協議組成的系統。
(三)為什么要使用
LDAP是開放的Internet標准,支持跨平台的Internet協議,在業界中得到廣泛認可的,並且市場上或者開源社區上的大多產品都加入了對LDAP的支持,因此對於這類系統,不需單獨定制,只需要通過LDAP做簡單的配置就可以與服務器做認證交互。“簡單粗暴”,可以大大降低重復開發和對接的成本。
我們拿開源系統(YAPI)做案例,只需做一下簡單的幾步配置就可以達到LDAP的單點登錄認證了:
{ "ldapLogin": { "enable": true, "server": "ldap://l-ldapt1.ops.dev.cn0.qunar.com", "baseDn": "CN=Admin,CN=Users,DC=test,DC=com", "bindPassword": "password123", "searchDn": "OU=UserContainer,DC=test,DC=com", "searchStandard": "mail" } }
是不是很方便呢?
二、LDAP的主要產品
細心的朋友應該會主要到,LDAP的中文全稱是:輕量級目錄訪問協議,說到底LDAP僅僅是一個訪問協議,那么我們的數據究竟存儲在哪里呢?
來,我們一起看下下面的表格:
廠商 |
產品 |
介紹 |
SUN |
SUNONE Directory Server |
基於文本數據庫的存儲,速度快 。 |
IBM |
IBM Directory Server |
基於DB2 的的數據庫,速度一般。 |
Novell |
Novell Directory Server |
基於文本數據庫的存儲,速度快, 不常用到。 |
Microsoft |
Microsoft Active Directory |
基於WINDOWS系統用戶,對大數據量處理速度一般,但維護容易,生態圈大,管理相對簡單。 |
Opensource |
Opensource |
OpenLDAP 開源的項目,速度很快,但是非主 流應用。 |
沒錯,這就是正常存儲數據的地方,而訪問這些數據就是通過我們上述所說的LDAP。相信到這里大家應該了解兩者之間的關系了吧!
三、LDAP的基本模型
每一個系統、協議都會有屬於自己的模型,LDAP也不例外,在了解LDAP的基本模型之前我們需要先了解幾個LDAP的目錄樹概念:
(一)目錄樹概念
1. 目錄樹:在一個目錄服務系統中,整個目錄信息集可以表示為一個目錄信息樹,樹中的每個節點是一個條目。
2. 條目:每個條目就是一條記錄,每個條目有自己的唯一可區別的名稱(DN)。
3. 對象類:與某個實體類型對應的一組屬性,對象類是可以繼承的,這樣父類的必須屬性也會被繼承下來。
4. 屬性:描述條目的某個方面的信息,一個屬性由一個屬性類型和一個或多個屬性值組成,屬性有必須屬性和非必須屬性。
(二)DC、UID、OU、CN、SN、DN、RDN
關鍵字 |
英文全稱 |
含義 |
dc |
Domain Component |
域名的部分,其格式是將完整的域名分成幾部分,如域名為example.com變成dc=example,dc=com(一條記錄的所屬位置) |
uid |
User Id |
用戶ID songtao.xu(一條記錄的ID) |
ou |
Organization Unit |
組織單位,組織單位可以包含其他各種對象(包括其他組織單元),如“oa組”(一條記錄的所屬組織) |
cn |
Common Name |
公共名稱,如“Thomas Johansson”(一條記錄的名稱) |
sn |
Surname |
姓,如“許” |
dn |
Distinguished Name |
“uid=songtao.xu,ou=oa組,dc=example,dc=com”,一條記錄的位置(唯一) |
rdn |
Relative dn |
相對辨別名,類似於文件系統中的相對路徑,它是與目錄樹結構無關的部分,如“uid=tom”或“cn= Thomas Johansson” |
(三)基本模型:
信息模型:
命名模型:
功能模型:
安全模型:
四、LDAP的使用
那我們是如何訪問LDAP的數據庫服務器呢?
統一身份認證主要是改變原有的認證策略,使需要認證的軟件都通過LDAP進行認證,在統一身份認證之后,用戶的所有信息都存儲在AD Server中。終端用戶在需要使用公司內部服務的時候,都需要通過AD服務器的認證。
那么程序中是如何訪問的呢? 我們以PHP腳本作為例子:
$ldapconn = ldap_connect(“10.1.8.78") $ldapbind = ldap_bind($ldapconn, 'username', $ldappass); $searchRows= ldap_search($ldapconn, $basedn, "(cn=*)"); $searchResult = ldap_get_entries($ldapconn, $searchRows); ldap_close($ldapconn);
1. 連接到LDAP服務器;
2. 綁定到LDAP服務器;
3. 在LDAP服務器上執行所需的任何操作;
4. 釋放LDAP服務器的連接;
這章就只介紹LDAP的一些概念和基本的原理,代碼的操作下一章再展開來講錯或講的不好的地方,還望指教!~