LDAP基礎知識

基本概念

objectclass:LDAP對象類,是LDAP內置的數據模型。比如我們寫了person這個屬性類,那麼我們就一定需要填寫用戶名等。各種屬性,如果擁有account屬性則必須填寫uid或者userid屬性。 可以擁有多個objectClass但是需要注意有些不能兼容。
Entry:entry可以被稱爲條目,一個entry就是一條記錄,是LDAP中一個基本的存儲單元;也可以被看作是一個DN和一組屬性的集合
DN:Distinguished Name,LDAP中entry的唯一辨別名,一條完整的DN寫法:uid=XX,ou=組織名,dc=xx,dc=xx。LDAP中的entry只有DN是由LDAP Server來保證唯一的。
LDAP Search filter:使用filter對LDAP進行搜索。 Filter一般由 (attribute=value) 這樣的單元組成,比如:(&(uid=ZHANGSAN)(objectclass=person)) 表示搜索用戶中,uid爲ZHANGSAN的LDAP Entry.再比如:(&(|(uid= ZHANGSAN)(uid=LISI))(objectclass=person)),表示搜索uid爲ZHANGSAN, 或者LISI的用戶;也可以使用來表示任意一個值,比如(uid=ZHANGSAN),搜索uid值以 ZHANG開頭SAN結尾的Entry。更進一步,根據不同的LDAP屬性匹配規則,可以有如下的Filter: (&(createtimestamp>=20050301000000)(createtimestamp<=20050302000000)),表示搜索創建時間在20050301000000和20050302000000之間的entry。
Filter中 “&” 表示“與”;“!”表示“非”;“|”表示“或”。根據不同的匹配規則,我們可以使用“=”,“~=”,“>=”以及“<=”,更多關於LDAP Filter讀者可以參考LDAP相關協議。
Base DN:一條Base DN可以是“dc=163,dc=com”,也可以是“dc=People,dc=XX,dc=XX”。執行LDAP Search時一般要指定basedn,由於LDAP是樹狀數據結構,指定basedn後,搜索將從BaseDN開始,我們可以指定Search Scope爲:只搜索basedn(base),basedn直接下級(one level),和basedn全部下級(sub tree level)。
dc: Domain Component,域名的部分,其格式是將完整的域名分爲幾部分,比如example.com,dc=example,dc=com,
uid:User ID 用戶id,隨便取的
ou:Organization Unit 組織單位,類似於Linux文件系統中的字目錄,比如/root 座位base dn ,我們假設root/data下面有一個text.txt文本。 那麼完整的dn寫法爲 dn:uid=text.txt,ou=data,dc=root,dc=com 類似這種意思的
cn:Common Name 類似於公共名稱
sn:真實名稱
rdn:相對辨別名,類似於文件系統中的相對路徑

objectClass介紹

LDAP中,一個條目(Entry)必須包含一個對象類(objectClass)屬性,且需要賦予至少一個值。每一個值將用作一條LDAP條目進行數據存儲的模板;模板中包含了一個條目必須被賦值的屬性和可選的屬性。
objectClass有着嚴格的等級之分,最頂層是top和alias。例如,organizationalPerson這個objectClass就隸屬於person,而person又隸屬於top。
objectClass可分爲以下3類:
結構型(Structural):如account、inetOrgPerson、person和organizationUnit;
輔助型(Auxiliary):如extensibeObject;
抽象型(Abstract):如top,抽象型的objectClass不能直接使用。
每種objectClass有自己的數據結構,比如我們有一種叫“電話薄”的objectClass,肯定會內置很多屬性(attributes),如姓名(uid),身份證號(uidNumber),單位名稱(gid),家庭地址(homeDirectory)等,這些屬性(attributes)中,有些是必填的,例如,account就要求userid是必填項,而inetOrgPerson則要求cn(common name,常用名稱)和sn(sure name,真實名稱)是必填項。
由上可見,accout僅僅預置了幾個必要且實用的屬性(完成登陸驗證肯定是夠了),而inetOrgPerson內置了非常之多的屬性,例如電話號碼、手機號碼、街道地址、郵箱號碼,郵箱地址,房間號碼,頭像,經理,僱員號碼等等。

因此,在配置LDAP時,如果僅僅是基於驗證登陸的目的,建議將objectClass類型設置爲accout,而如果希望打造一個大而全的員工信息寶庫,建議將objectClass設置爲inetOrgPerson。
上面已經寫出,account的必要屬性是userid,而
posixAccount的必要屬性是cn、gidNumber、homeDirectory、uid、uidNumber;
shadowAccount的必要屬性是uid,可選屬性有shadowExpire、shadowInactive、shadowMax、shadowMin、userPassword等;
top必要屬性是objectClass(可見,top和其它objectClass是繼承的關係)。

示例介紹

添加組織示例
dn: ou=Person, dc=test,dc=com
changetype: add
objectclass: top
objectclass: organizationalUnit
ou: Person
添加用戶到Person組織示例
dn: uid=xx,ou=People,dc=test,dc=com
objectClass: person
objectClass: posixaccount
objectClass: inetOrgPerson
objectClass: organizationalPerson
homeDirectory: /home/xx
loginShell: /bin/bash
uid: xx
cn: xx
userPassword: 123456
uidNumber: 10006
gidNumber: 10002
sn: xx
ldapadd -x -H ldap://你自己的域名或者ldap服務器IP -D “cn=Manager,dc=test,dc=com(這一段需要與你自己的配置相同)” -W -f xx.ldif

自定義schema

我們可能會想假設上面的屬性不夠用了怎麼辦,那麼我們就需要自定義schema
下面給出一個例子
1 首先新建一個myschema.schema,填入一下內容
attributetype ( 1.3.6.1.4.1.7914.1.2.1.1
NAME ( ‘username’ )
DESC ‘RFC3280: legacy attribute for email addresses in DNs’
EQUALITY caseIgnoreIA5Match
SUBSTR caseIgnoreIA5SubstringsMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{128} )
objectclass ( 1.3.6.1.4.1.7914.1.2.2.1 NAME ‘myUser’
DESC ‘LDAP User’ SUP top STRUCTURAL
MUST ( username $ cn )
MAY (sn) )
定義了一個objectClass對象myUser。 MUST 必須填寫的 username和cn
我們可能發現username的屬性由attributetype填寫,NAME 自定義屬性名稱
DESC 描述
SYNTAX是表示字段的數據類型。這個admin guide裏面也有說明。 每個數據類型的值是固定的
SINGLE-value表示這個屬性只有一個值,有些屬性可以有多個值,比如聯繫地址等。默認的話,是多值的。
caseIgnoreIA5Match 忽略大小寫
MAY可選
2 創建一個myconf.conf文件
填入以下內容
include /etc/openldap/schema/core.schema
include /etc/ldap/schema/myschema.schema 注意這是你自己的路勁
3 編譯
slapcat -f /tmp/myconf.conf(你自己的myconf.conf的路徑) -F /tmp/ -n0
然後到/tmp/cn=config/cn=schema這個文件下面你會發現兩個ldif文件
1個是myschema{1}.ldif和core{0}.ldif。 然後將這些文件替換掉/etc/openldap/slapd.d/cn=config/cn=schema裏面的core{1}.ldif。這裏要注意大括號裏面的數值,core的與core的要一樣,myschema裏面的大括號要與裏面的文件的不能重複。你就依次命名一下。 然後重啓服務
如果可以重啓成功,最起碼說明你寫的沒問題
4.創建ou ,上面說過ou需要是已經定義過的objectClass,vim 創建一個ldif文件將下面的內容複製。
dn: ou=myUser, dc=xx,dc=com
changetype: add
objectclass: top
objectclass: organizationalUnit
ou: myUser
然後執行
ldapadd -x -H ldap://xx.com -D “cn=Manager,dc=xx,dc=com” -W -f xx.ldif。
用ldap web界面工具查看你會發現自己已經成功定義了一個myUser。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章