1. 程式人生 > >Linux中的LDAP認證

Linux中的LDAP認證

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認證