標籤:ldap
Directory Services(目錄服務)
我們知道,當區域網路的規模變的越來越大時,為了方便主機管理,我們使用DHCP來實現IP地址、乙太網路地址、主機名稱和拓撲結構等的集中管理和統一分配。同 樣,如果一個區域網路內有許多的其它資源時,如印表機、共用資料夾等等,為了方便的定位及尋找它們,一種集中定位管理的方式或許是較好的選擇,DNS和 NIS都是用來實作類別似管理的方法。對於區域網路內的一個使用者來講,工作等其它應用需要,我們必須憑帳號登入主機、用帳號收發E-mail,甚至為了管理需要公司還需要維護一個電子號碼簿來儲存 員工的姓名、地址、電話號碼等資訊。隨著時間的增長,我們會為這些越來越多的帳號和密碼弄的頭暈腦脹。同時,如果一個員工離開,管理員就不得不翻遍所有的記錄帳號資訊的檔案把離職員工的資訊刪除。這些將是一個繁瑣而效率低下的工作。那麼,如果能將此些帳號資訊等統一到一個檔案中進行管理,無疑會大大提高員 工及管理員的工作效率。目錄服務(LDAP是其實現的一種)正是基於這些應用實現的。
LDAP :寫——比較慢;讀——很快
LDAP是 Lightweight Directory Access Protocol的縮寫,顧名思義,它是指輕量級目錄訪問協議(這個主要是相對另一目錄訪問協議X.500而言的;LDAP略去了x.500中許多不太常 用的功能,且以TCP/IP協議為基礎)。目錄服務和資料庫很類似,但又有著很大的不同之處。資料庫設計為方便讀寫,但目錄服務專門進行了讀取最佳化的設計, 因此不太適合於經常有寫操作的資料存放區。同時,LDAP只是一個協議,它沒有涉及到如何儲存這些資訊,因此還需要一個後端資料庫組件來實現。這些後端可以 是bdb(BerkeleyDB)、ldbm、shell和passwd等。
LDAP 目錄以樹狀的階層來儲存資料(這很類同於DNS),最頂層即根部稱作“基準DN”,形如"dc=mydomain,dc=org"或者"o= mydomain.org",前一種方式更為靈活也是Windows AD中使用的方式。在根目錄的下面有很多的檔案和目錄,為了把這些大量的資料從邏輯上分開,LDAP像其它的目錄服務協議一樣使用OU (Organization Unit),可以用來表示公司內部機構,如部門等,也可以用來表示裝置、人員等。同時OU還可以有子OU,用來表示更為細緻的分類。
LDAP中 每一條記錄都有一個唯一的區別於其它記錄的名字DN(Distinguished Name),其處在“葉子”位置的部分稱作RDN;如dn:cn=tom,ou=animals,dc=mydomain,dc=org中tom即為 RDN;RDN在一個OU中必須是唯一的。
因為LDAP資料是“樹”狀的,而且這棵樹是可以無限延伸的,假設你要樹上的一個蘋果(一條記錄),你怎麼告訴園丁它的位置呢?當然首先要說明是哪一棵樹 (dc,相當於MYSQL的DB),然後是從樹根到那個蘋果所經過的所有“分叉”(ou,呵呵MYSQL裡面好象沒有這 DD),最後就是這個蘋果的名字(uid,記得我們設計MYSQL或其它資料庫表時,通常為了方便管理而加上一個‘id’欄位嗎?)。好了!這時我們可以 清晰的指明這個蘋果的位置了,就是那棵“歪脖樹”的東邊那個分叉上的靠西邊那個分叉的再靠北邊的分叉上的半紅半綠的……,暈了!你直接爬上去吧!我還是說 說LDAP裡要怎麼定義一個欄位的位置吧,樹(dc=waibo,dc=com),分叉(ou=bei,ou=xi,ou= dong),蘋果(cn=honglv),好了!位置出來了:
dn:cn=honglv,ou=bei,ou=xi,ou=dong,dc=waibo,dc=com
LDAP的 可擴充性和靈活性
LDAP 協議既是跨平台的也是基於標準的。這意味著幾乎在任何電腦平台上啟動並執行任何應用程式都可以從LDAP目錄擷取資訊。另外,無論什麼伺服器作業系統、檔案系統或平台對於客戶機都是無關緊要的。
LDAP目錄幾乎可以儲存所有類型的資料:電子郵件地址、DNS 資訊、NIS 對應、安全性密鑰、連絡人資訊列表和電腦名稱等。如果需要專門的組織單元或項,則可以根據具體實現來定製控制給定欄位可以儲存哪種資訊的規則(稱為
模式,稍後將詳細討論)。
大多數 LDAP 伺服器的安裝和配置相對比較簡單,並且可以在很少或沒有維護的情況下運行多年,而且很容易為特定類型的訪問而進行最佳化。 可以容易地配置 LDAP 目錄來複製部分或所有分類樹(使用推(push)或拉(pull)方法)。這可以使系統管理員不必擔心出現單點故障的情況。 可以通過 ACL(存取控制表,Access Control List)來控制對目錄的訪問。例如,管理員可以根據給定組或位置中的成員資格來限制誰可以看到哪些內容,或者給予特殊使用者在其自己記錄中修改所選欄位的 能力。ACL 提供極其細粒度的存取控制,而且 ACL 將這種控制與 LDAP 安裝結合在一起,而不是與請求資訊的客戶機結合在一起。此外,可以容易地將 LDAP 與大多數現有的安全性層和/或認證系統(例如 SSL、Kerberos 和 PAM 等)整合在一起。
LDIF
LDIF(LDAP Interchange Format)是指儲存LDAP配置資訊及目錄內容的標準文字檔格式,之所以使用文字檔來格式來儲存這些資訊是為了方便讀取和修改,這也是其它大多數 服務組態檔所採取的格式。LDIF檔案常用來向目錄匯入或更改記錄資訊,這些資訊需要按照LDAP中schema的格式進行組織,並會接受schema 的檢查,如果不符合其要求的格式將會出現報錯資訊。LDIF檔案範例如下:
dn:cn=stan,ou=linux,ou=computer,dc=ourschool,dc=org
objectClass:organizationalPerson
cn:stan
cn:czm
sn:czm
其中,以“#”號開頭的為注釋行;第二行起的行中,冒號左邊為屬性,右邊是屬性的值,這類同於編程中的變數及為其所賦的值,但屬性可以被重複賦值。
注意:同一個屬性可以有一個或者多個值,ldap在定址時,可以根據同一個屬性的不同值進行定址,例如上例中可以根據cn屬性的stan和czm進行定址,這樣速度更快。
objectClass
對象類由 LDAP 目錄使用來定義給定類型的對象可以有哪些屬性。對象類還定義項必須有什麼屬性,以及項可以有什麼屬性。所有對象類都從其父物件類繼承需求,然後添加它們自己的需求。
對象類有五個組件:OID(對象標識)、唯一名稱、父物件(SUP)、任何需要 的屬性(MUST)和允許的屬性列表(MAY)。OID是由LDAP目錄的內部資料庫機制使用的資料標識符。從概念上講,它們與IP地址相似,因為每個對象類都必須有一個唯一數字。並且象DNS和IP之間的關係那樣,由建立它們的個人進行註冊,並由這些人“擁有”。 在LDAP中objectClass分為三種:Abstract,Structural,AUXIALIARY。要定義一個Entry必須包含一個Structural類型的ObjectClass, 其他兩個類型可包括0或多個。其中Top是一個頂級ObjectClass,裡面定義了一個MUST Attribute:ObjectClass,於是也就決定了必須有 一個其它的Structural ObjectClass才能定義一個Entry.其中ObjectClass又可以存在繼承關係,子ObjectClass會繼承父ObjectClass中的 全部Attribute.該繼承關係於Java中有點相似. 在LDAP中每一個ObjectClass都定義了一些Attribute,其 Attribute仍然可以是ObjectClass。在這些Attriubte中分為兩種類型MUST,MAY, MUST表示這個Entry必須包括的屬性,MAY為可選。一個ObjectClass的Attribute也包括所有繼承自父ObjectClass和 自身定義的ObjectClass。
下面用一個類型進行說明:
objectclass ( 2.5.6.0 NAME ‘top‘ ABSTRACT
MUST objectClass )
objectclass ( 1.3.6.1.4.1.1466.344 NAME ‘dcObject‘
DESC ‘RFC2247: domain component object‘
SUP top AUXILIARY
MUST dc )
上面是兩個objectclass的定義,其中top為ABSTRACT,dcObject為AUXILIARY,這兩個類型都不能定義Entry.
下面這個LDIF檔案在匯入到LDAP時會出錯:
dn: dc=java,dc=com
objectClass:dcObject
dc: java.com
要定義這個Entry必須找到一個STRUCTURAL類型的ObjectClass。
objectClasses: ( 2.5.6.4 NAME ‘organization‘
DESC ‘RFC2256: an organization‘ SUP top STRUCTURAL
MUST o
MAY ( userPassword $ searchGuide $ seeAlso $ businessCategory
$ x121Address $ registeredAddress $ destinationIndicator
$ preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier
$ telephoneNumber $ internationaliSDNNumber $ facsimileTelephoneNumber
$ street $ postOfficeBox $ postalCode $ postalAddress
$ physicalDeliveryOfficeName $ st $ l $ description ) )
這個objectClass的類型為STRUCTURAL,因此可以用來定義Entry.具體定義如下
dn: dc=java,dc=com
objectClass:dcObject
objectClass:organization
dc: java.com
o: java.com
Attribute
Attribute 類同於程式設計語言中的變數,它可以被賦值,就像是可以存放一個單一類型資訊的容器。官方聲明了許多常用的 Attribute,如果其中沒有你所需要的,你可以自己定義,但要避免重名。objectClass是一種特殊的Attribute,
它包含其它用到的 Attribute以及它自身。常見的Attribute如下:
schema
LDAP 中,schema用來指定一個目錄中所包含的objects的類型 (objectClass)以及每一個objectClass中的各個必備(mandatory)和可選(optional)的屬性 (attribute)。因此,Schema是一個資料模型,它被用來決定資料怎樣被儲存,被跟蹤的資料的是什麼類型,儲存在不同的Entry下的資料之 間的關係。schema 需要在主設定檔slapd.conf中指定,以用來決定本目錄中使用到的objectClass。管理員可以自己設計制定schema,一般包括屬性定 義(AttributeDefinition)、類定義(ClassDefinition)以及文法定義(SyntaxDefinition)等部分.LDAP V3中在x.500標準的基礎上定義了一個包含了網路中大多常見對象的schema,這些對象包括國家、所在地、組織、人員、小組以及裝置等。同時,LDAP V3中可以很方便的從目錄中提取出schema,它正是一條記錄中關於屬性的聲明部分。
物件識別碼
物件識別碼 ( Object Identifiers )是被LDAP內部資料庫引用的數位識別碼。Attribute的名字是設計為方便人們讀取的,但為了方便電腦的處理,通常使用 一組數字來標識這些對象,這類同於SNMP中的MIB2。例如,當電腦接收到dc這個Attribute時,它會將這個名字轉換為對應的OID: 1.3.6.1.4.1.1466.115.121.1.26。
瞭解Attribute屬性
(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不同。提示:objectClass是一種特殊的Attribute,它包含其他用到的Attribute以及其自身。對於不同的objectClass,通常具有一些必設屬性值和一些可選屬性值。例如,可使用person這個objectClass來表示系統中一個使用者的條目,對於系統中使用者通常需要有這樣一些資訊:姓名、電話、密碼、描述等。14-6所示,對於person,通過cn和sn設定使用者的名和姓,這是必須設定的,而其他屬性則是可選的。
下面列出部分常用objectClass要求必設的屬性。account:userid。organization:o。person:cn和sn。organizationalPerson:與person相同。organizationalRole:cn。organizationUnit:ou。posixGroup:cn、gidNumber。
posixAccount:cn、gidNumber、homeDirectory、uid、uidNumber。
本文出自 “蔡超” 部落格,轉載請與作者聯絡!
Linux中的LDAP認證