LDAP是輕量目錄訪問協(xié)議,英文全稱是Lightweight Directory Access Protocol,一般都簡稱為LDAP.
現(xiàn)在市場上有關LDAP的產(chǎn)品已有很多,各大軟件公司都在他們的產(chǎn)品中集成了LDAP服務,如Microsoft的ActiveDirectory、Lotus的Domino Directory、IBM的WebSphere中也集成了LDAP服務.LDAP的開源實現(xiàn)是OpenLDAP,它比商業(yè)產(chǎn)品一點也不差,而且源碼開放.
OpenLDAP是最常用的目錄服務之一,它是一個由開源社區(qū)及志愿者開發(fā)和管理的一個開源項目,提供了目錄服務的所有功能,包括目錄搜索、身份認證、安全通道、過濾器等等.大多數(shù)的Linux發(fā)行版里面都帶有OpenLDAP的安裝包.OpenLDAP服務默認使用非加密的TCP/IP協(xié)議來接收服務的請求,并將查詢結(jié)果傳回到客戶端.由于大多數(shù)目錄服務都是用于系統(tǒng)的安全認證部分比如:用戶登錄和身份驗證,所以它也支持使用基于 SSL/TLS 的加密協(xié)議來保證數(shù)據(jù)傳送的保密性和完整性.OpenLDAP是使用OpenSSL來實現(xiàn)SSL/TLS加密通信的.
LDAP的信息模型是建立在”條目”(entries)的基礎上.一個條目是一些屬性的集合,并且具有一個全局唯一的”可區(qū)分名稱”DN,一個條目可以通過DN來引用.每一個條目的屬性具有一個類型和一個或者多個值.類型通常是容易記憶的名稱,比如”cn”是通用名稱(common name),或者”mail”是電子郵件地址.條目的值的語法取決于屬性類型.比如,cn屬性可能具有一個值”Babs Jensen” .一個mail屬性可能包含”bbs@example.com” .一個jpegphoto屬性可能包含一幅JPEG(二進制)格式的圖片.
LDAP常用關鍵字列表 LDAP通過屬性objectClass來控制哪一個屬性必須出現(xiàn)或允許出現(xiàn)在一個條目中,它的值決定了該條目必須遵守的模式規(guī)則.
| 關鍵字 | 英文全稱 | 含義 |
|---|---|---|
| dc | Domain Component | 域名的部分,其格式是將完整的域名分成幾部分,如域名為example.com變成dc=example,dc=com |
| uid | User Id | 用戶ID,如“tom” |
| ou | Organization Unit | 組織單位,類似于Linux文件系統(tǒng)中的子目錄,它是一個容器對象,組織單位可以包含其他各種對象(包括其他組織單元),如“market” |
| cn | Common Name | 公共名稱,如“Thomas Johansson” |
| sn | Surname | 姓,如“Johansson” |
| dn | Distinguished Name | 惟一辨別名,類似于Linux文件系統(tǒng)中的絕對路徑,每個對象都有一個惟一的名稱, 如“uid= tom,ou=market,dc=example,dc=com”,在一個目錄樹中DN總是惟一的 |
| rdn | Relative dn | 相對辨別名,類似于文件系統(tǒng)中的相對路徑,它是與目錄樹結(jié)構(gòu)無關的部分,如“uid=tom”或“cn= Thomas Johansson” |
| c | Country | 國家,如“CN”或“US”等. |
| o | Organization | 組織名,如“Example,Inc.” |
Entry
條目,也叫記錄項,是LDAP中最基本的顆粒,就像字典中的詞條,或者是數(shù)據(jù)庫中的記錄.通常對LDAP的添加、刪除、更改、檢索都是以條目為基本對象的.
- dn:每一個條目都有一個唯一的標識名(distinguished Name,DN),如上述中一個 dn:”uid=mac,ou=People,dc=example,dc=cn”.通過DN的層次型語法結(jié)構(gòu),可以方便地表示出條目在LDAP樹中的位置,通常用于檢索.
- rdn:一般指dn逗號最左邊的部分,如cn=baby.它與RootDN不同,RootDN通常與RootPW同時出現(xiàn),特指管理LDAP中信息的最高權限用戶.
- Base DN:LDAP目錄樹的最頂部就是根,也就是所謂的“Base DN”,如”dc=example,dc=com”.
schema
對象類(ObjectClass)、屬性類型(AttributeType)、語法(Syntax)分別約定了條目、屬性、值,他們之間的關系如下圖所示.所以這些構(gòu)成了模式(Schema)——對象類的集合.條目數(shù)據(jù)在導入時通常需要接受模式檢查,它確保了目錄中所有的條目數(shù)據(jù)結(jié)構(gòu)都是一致的.
schema(一般在/etc/ldap/schema/目錄)在導入時要注意前后順序.
對于LDAP目錄中保存的信息,可以使用LDIF(LDAP Interchange Format)格式來保存.這是一種標準文本文件格式,使用這種格式保存得的LDAP服務器數(shù)據(jù)庫中的數(shù)據(jù)可方便讀取和修改,這也是其他大多數(shù)服務配置文件所采取的格式.
Attribute
屬性(Attribute)類似于程序設計中的變量,可以被賦值.在OpenLDAP中聲明了許多常用的Attribute(用戶也可自己定義Attribute).
每個條目都可以有很多屬性(Attribute),比如常見的人都有姓名、地址、電話等屬性.每個屬性都有名稱及對應的值,屬性值可以有單個、多個,比如你有多個郵箱.
屬性不是隨便定義的,需要符合一定的規(guī)則,而這個規(guī)則可以通過schema制定.比如,如果一個entry沒有包含在 inetorgperson 這個 schema 中的objectClass: inetOrgPerson,那么就不能為它指定employeeNumber屬性,因為employeeNumber是在inetOrgPerson中定義的.
LDAP為人員組織機構(gòu)中常見的對象都設計了屬性(比如commonName,surname).下面有一些常用的別名:
| 屬性 | 別名 | 語法 | 描述 | 值(舉例) |
|---|---|---|---|---|
| commonName | cn | Directory String | 姓名 | sean |
| surname | sn | Directory String | 姓 | Chow |
| organizationalUnitName | ou | Directory String | 單位(部門)名稱 | IT |
| organization | o | Directory String | 組織(公司)名稱 | example |
| telephoneNumber | Telephone Number | 電話號碼 | 110 | |
| objectClass | 內(nèi)置熟悉 | top |
常見的Attribute含義如下:
- c:國家.
- cn:common name,指一個對象的名字.如果指人,需要使用其全名.
- dc:domain Component,常用來指一個域名的一部分.
- givenName:指一個人的名字,不能用來指姓.
- l:指一個地名,如一個城市或者其他地理區(qū)域的名字.
- mail:電子信箱地址.
- o:organizationName,指一個組織的名字.
- ou:organizationalUnitName,指一個組織單元的名字.
- sn:surname,指一個人的姓.
- telephoneNumber:電話號碼,應該帶有所在的國家的代碼.
- uid:userid,通常指某個用戶的登錄名,與Linux系統(tǒng)中用戶的uid不同.
ldap命令的使用
增加:ldapadd
選項:
-x 進行簡單認證
-D 用來綁定服務器的DN
-h 目錄服務的地址
-w 綁定DN的密碼
-f 使用ldif文件進行條目添加的文件
exp:
將test.ldif中的數(shù)據(jù)導入ldap
# ldapadd -x -D "cn=root,dc=example,dc=com" -w password -f /root/test.ldif
COPY
刪除:ldapdelete
選項:
-c 連續(xù)運行模式 (運行出錯時跳過繼續(xù)執(zhí)行)
-f file 指定文件
-M 啟用管理DSA IT控制
-P version 協(xié)議版本(default: 3)
-r 遞歸刪除
exp:
# ldapdelete -x -D "cn=Manager,dc=example,dc=com" -w password "uid=test1,ou=People,dc=test,dc=com"
# ldapdelete -x -D 'cn=root,dc=it,dc=com' -w password 'uid=zyx,dc=it,dc=com'
COPY
修改:ldapmodify
選項
-a 添加新的條目.缺省的是修改存在的條目.
-C 自動追蹤引用.
-c 出錯后繼續(xù)執(zhí)行程序并不中止.缺省情況下出錯的立即停止.
-D binddn 指定搜索的用戶名(一般為一dn 值).
-e 設置客戶端證書文件,例: -e cert/client.crt
-E 設置客戶端證書私鑰文件,例: -E cert/client.key
-f file 從文件內(nèi)讀取條目的修改信息而不是從標準輸入讀取.
-H ldapuri 指定連接到服務器uri.常見格式為ldap://hostname:port
-h ldaphost 指定要連接的主機的名稱/ip 地址.它和-p 一起使用.
-p ldapport 指定要連接目錄服務器的端口號.它和-h 一起使用.
-M[M] 打開manage DSA IT 控制. -MM 把該控制設置為重要的.
-n 用于調(diào)試到服務器的通訊.但并不實際執(zhí)行搜索.服務器關閉時,返回錯誤;服務器打開時,常和-v 參數(shù)一起測試到服務器是否是一條通路.
-v 運行在詳細模塊.在標準輸出中打出一些比較詳細的信息.比如:連接到服務器的ip 地址和端口號等.
-V 啟用證書認證功能,目錄服務器使用客戶端證書進行身份驗證,必須與-ZZ 強制啟用TLS 方式配合使用,并且匿名綁定到目錄服務器.
-W 指定了該參數(shù),系統(tǒng)將彈出一提示入用戶的密碼.它和-w 參數(shù)相對使用.
-w bindpasswd 直接指定用戶的密碼. 它和-W 參數(shù)相對使用.
-x 使用簡單認證.
-Z[Z] 使用StartTLS 擴展操作.如果使用-ZZ,命令強制使用StartTLS 握手成功.
exp:
# ldapmodify -x -D "cn=root,dc=it,dc=com" -W -f modify.ldif
# 交互式修改
# ldapmodify -x -D "cn=root,dc=it,dc=com" -W secret
COPY
查詢:ldapsearch
選項
-x 進行簡單認證
-D 用來綁定服務器的DN
-w 綁定DN的密碼
-b 指定要查詢的根節(jié)點
-H 制定要查詢的服務器
exp:
# ldapsearch -x -D "cn=root,dc=kevin,dc=com" -w secret -b "dc=kevin,dc=com"
# 使用簡單認證,用 "cn=root,dc=kevin,dc=com" 進行綁定,要查詢的根是 "dc=kevin,dc=com".這樣會把綁定的用戶能訪問"dc=kevin,dc=com"下的所有數(shù)據(jù)顯示出來.
# ldapsearch -x -W -D "cn=administrator,cn=users,dc=osdn,dc=cn" -b "cn=administrator,cn=users,dc=osdn,dc=cn" -h troy.osdn.zzti.edu.cn
# ldapsearch -b "dc=canon-is,dc=jp" -H ldaps://192.168.10.192:389
COPY
設置密碼:ldappasswd
選項
-x 進行簡單認證
-D 用來綁定服務器的DN
-w 綁定DN的密碼
-S 提示的輸入密碼
-s pass 把密碼設置為pass
-a pass 設置old passwd為pass
-A 提示的設置old passwd
-H 是指要綁定的服務器
-I 使用sasl會話方式
exp:
# ldappasswd -x -D 'cm=root,dc=it,dc=com' -w secret 'uid=zyx,dc=it,dc=com' -S
COPY
數(shù)據(jù)導出: slapcat
選項
-l 表示導出為LDIF文件格式
exp:
# slapcat -l export.ldif