上層
基于企業(yè)組織關(guān)系進(jìn)行人員認(rèn)證,開箱即用的微服務(wù)
底層存儲(chǔ)
默認(rèn)是嵌入式數(shù)據(jù)庫,最終是寫到文件上
支持多種backend實(shí)現(xiàn)
對于用戶的企業(yè)組織關(guān)系是通過目錄信息樹元信息體現(xiàn)的
- 最小存儲(chǔ)單元是條目
一個(gè)條目就是一個(gè)對象
比如一個(gè)用戶條目對象,一個(gè)組織條目對象
- DN
DN定義了一個(gè)條目對象的【組織層級關(guān)系和主鍵標(biāo)識(shí)】
一個(gè)條目對象通過DN字段來唯一標(biāo)識(shí)
DN字段存儲(chǔ)了【該條目的目錄信息樹】信息,由多個(gè)rdn屬性組成,以路徑的方式顯示定義了從左到右的目錄層級關(guān)系,右側(cè)的rdn是左側(cè)的父級目錄,最右側(cè)的rdn即該條目的目錄信息樹的根節(jié)點(diǎn)!
DN的組成部分:約定俗成的屬性
首先,CN、OU、DC 這些是 LDAP 協(xié)議標(biāo)準(zhǔn)中定義的一些屬性類型,它們有約定的含義:
CN :通用名稱,最常見的是用于用戶(uid)的名稱,例如:cn=John
OU:組織單元。用于在組織內(nèi)創(chuàng)建分支或部門,是構(gòu)建目錄樹的主要方式。例如:ou=People, ou=Groups, ou=Engineering, ou=San Francisco
DC:域組件,目錄樹的根節(jié)點(diǎn),例如域名 example.com 會(huì)轉(zhuǎn)化為 dc=example, dc=com
為什么 DC 作為根成為主流?
與 DNS 天然集成:公司域名(如 company.com)是全球唯一的,這自然保證了 LDAP 目錄命名空間的唯一性
cn和uid的關(guān)系
cn和uid是父子級嗎? 不是,它們是平行的、可供選擇的屬性類型
uid 是用戶的登錄名,通常一生不變。即使用戶從“Alice Smith”改名為“Alice Jones”,她的 cn 屬性可以變,但她的唯一標(biāo)識(shí) uid=alice 和整個(gè)DN保持不變
目錄樹結(jié)構(gòu):需要提前設(shè)計(jì)和創(chuàng)建
雖然屬性類型是標(biāo)準(zhǔn)的,但如何組合它們來形成您公司的目錄信息樹,則完全需要管理員手動(dòng)設(shè)計(jì)
比如一個(gè)三級目錄樹結(jié)構(gòu)
根節(jié)點(diǎn):dc=acme, dc=com (基于公司域名)
一級OU:將用戶(People)、組(Groups)和部門(Engineering, Sales)分開
用戶DN:cn=Alice Smith, ou= Engineering, dc=acme, dc=com
但不需要像在MySQL中那樣,先創(chuàng)建一張包含cn、ou、dc字段的“表結(jié)構(gòu)”,LDAP的目錄樹結(jié)構(gòu)是通過直接創(chuàng)建條目(Entry)本身來隱式定義的
如何查看ldap服務(wù)最全的目錄信息樹結(jié)構(gòu)
1)先查詢根目錄
ldapsearch -x -H ldap://your.ldap.server:389 -b "" -s base "(objectclass=)" namingContexts
在這個(gè)輸出中
【namingContexts】: dc=example,dc=com 就是您需要的主要 Base DN
2)再展開根目錄
ldapsearch -x -H ldap://your.ldap.server:389 -b "dc=example,dc=com" -s sub "(objectclass=)"
需要指定admin賬號才能查詢目錄到情況
ldapsearch -x -H ldap://your.ldap.server:389
-D "cn=admin,dc=example,dc=com" -W \ // 指定具有搜索權(quán)限的賬號
-W \ // 待會(huì)手動(dòng)輸入密碼
-b "dc=example,dc=com" \ // 指定Base DN
-s sub "(objectClass=*)" dn // 搜索結(jié)果只展示dn
-s base查詢當(dāng)前目錄的節(jié)點(diǎn)
-s one查詢當(dāng)前目錄的下一級目錄節(jié)點(diǎn)
-s sub查詢當(dāng)前目錄的遞歸所有子目錄節(jié)點(diǎn)
3)分頁查詢
可以使用 -z 參數(shù)來限制每次返回的條目數(shù),
ldapsearch -x -b "dc=example,dc=com" -s sub "(objectclass=*)" -z 100
為用戶條目設(shè)置密碼
ldappasswd -x -H ldap://10.20.47.231:10389
-D "uid=admin,o=emr" -W -s "123456" "uid=zhangyong,ou=people,o=emr"
驗(yàn)證密碼是否設(shè)置成功
ldapwhoami -x -H ldap://10.20.47.231:10389
-D "uid=zhangyong,ou=people,o=emr"
-w "123456"
- objectClass
objectClass定義了【一個(gè)條目對象所擁有的所有屬性 和 條目類型】
1)定義了條目類型
雖然 objectClass 主要用于定義條目應(yīng)該具備哪些屬性
但它間接地幫助區(qū)分條目類型,這是因?yàn)椤静煌愋偷臈l目】會(huì)選擇【不同的 objectClass】 來表達(dá)
用戶條目
objectClass: inetOrgPerson, person,organizationalPerson
組條目
objectClass: posixGroup(linux ldap)
groupOfNames(windows ldap)
組織單元條目
objectClass: organizationalUnit,organizationalRole
2)一個(gè)條目對象所擁有的所有屬性
定義了該條目對象【所擁有的所有屬性,不包含用戶的組織層級關(guān)系】!??!
objectclass字段存儲(chǔ)了多個(gè)類,即通過這些類間接指定了條目對象所擁有的屬性
具體每個(gè)類的定義需要提前在ldap的配置文件中定義
常見的類有person,inetOrgPerson,groupOfNames,organizationalUnit
// 查詢所有定義的對象類,會(huì)返回大量數(shù)據(jù)
ldapsearch -H ldap://your-ldap-server -x -s base -b "cn=subschema" objectclasses
// 更精確地查詢單個(gè)對象類的定義,例如 inetOrgPerson
ldapsearch -H ldap://your-ldap-server -x -s base -b "cn=subschema" "(objectclasses=inetOrgPerson)"
- 組條目
如何表示組與成員用戶關(guān)系
1)通過dn中包含的組織層級關(guān)系
2)通過組條目對象的memberUid屬性
linux中常見組條目對象定義如下
通過memberUid屬性指定組成員,組成員通過uid唯一標(biāo)識(shí)
dn: cn=developers,ou=groups,dc=example,dc=com
objectClass: top
objectClass: posixGroup
cn: developers // 組的名稱
gidNumber: 1001 // 組的id
// memberUid屬性指定了屬于該組的用戶的 UID
memberUid: user1
memberUid: user2
windows中常見組條目對象定義如下
通過member 屬性指定組成員,組成員通過dn唯一標(biāo)識(shí)
dn: cn=developers,ou=groups,dc=example,dc=com
objectClass: top
objectClass: groupOfNames
cn: developers // 組的名稱
description: Developers group for project X。// 組的描述
// member 屬性指定了組內(nèi)所包含的所有成員的DN
member: uid=jdoe,ou=users,dc=example,dc=com
member: uid=asmith,ou=users,dc=example,dc=com
查詢 posixGroup 類型的組(常見于linux ldap)
ldapsearch -H ldap://10.20.47.231:10389 -x -b "o=emr" -s sub "(objectClass=posixGroup)"
查詢特定組的成員
ldapsearch -H ldap://10.20.47.231:10389 -x -b "ou=groups,o=emr" -s base "(objectClass=*)" memberUid
組合查詢
通過一個(gè)查詢語句查詢某個(gè)用戶,過濾條件是這個(gè)用戶屬于某個(gè)組
1)windows ldap中
Microsoft Active Directory為用戶條目提供了獨(dú)有的memberOf屬性
表示該用戶所屬的組
(&(uid=jdoe)(memberOf=cn=admins,ou=groups,dc=example,dc=com) )
2)linux ldap中
利用posixAccount類型的用戶條目,包含的 gidNumber屬性:這表明用戶的主組 ID
利用 uid 和 gidNumber 組合查詢
( &(uid=jdoe)(gidNumber=1001) )
創(chuàng)建組條目
ldapadd -H ldap://10.20.47.231:10389 -x -D "uid=admin,o=emr" -W -f group.ldif
使用步驟
上游數(shù)據(jù)源
通常是從人事系統(tǒng)中導(dǎo)出公司組織與人員信息
然后寫入ldap服務(wù)ldap生成數(shù)據(jù)
如何插入/更新數(shù)據(jù)
變更請求格式為ldif文件
使用ldapmodify命令執(zhí)行這個(gè)文件
如何實(shí)時(shí)更新數(shù)據(jù)
1)通過定時(shí)調(diào)度監(jiān)控上游源變化執(zhí)行l(wèi)dapmodify命令
2)使用現(xiàn)成的三方工具
apachesyncope
- 服務(wù)對外提供的接口
ldap服務(wù)提供了基于ldap協(xié)議的接口,簡化了數(shù)據(jù)更新/查詢
比如使用java的ldap庫來進(jìn)行rpc調(diào)用接口
- 從ldap用數(shù)認(rèn)證
風(fēng)險(xiǎn)
耦合問題:ldap掛了后,所有服務(wù)無法使用
性能問題:每個(gè)請求都去查下ldap服務(wù)帶來的性能消耗
一致性問題:保持與最新ldap數(shù)據(jù)同步
-》ldap原生支持變更日志機(jī)制
OpenLDAP 有 accesslog 和 auditlog overlays,可以記錄所有變更操作
方案一:直接查詢模式(不推薦)
存在耦合問題
存在性能問題
方案二:緩存模式(最常用、最實(shí)用)
將查詢ldap服務(wù)的用戶組織信息在應(yīng)用微服務(wù)中緩存下來
后續(xù)請求【直接從緩存】讀取用戶組織信息
一致性問題:
-》設(shè)置合理的過期時(shí)間
監(jiān)控到關(guān)鍵變更后及時(shí)【更新緩存】
- 集成
ldap服務(wù)地址
管理員賬號:擁有查詢所有用戶組織信息的權(quán)限
搜索庫:查詢用戶組織信息的底層存儲(chǔ)
搜索屬性:使用用戶的哪個(gè)字段進(jìn)行查找用戶是否存在
傳輸協(xié)議
特有的ldap協(xié)議
原生就是一個(gè)公共服務(wù)
提供單點(diǎn)登陸功能
符合單一職責(zé),完美等同于一個(gè)認(rèn)證微服務(wù)!??!
dolphin自帶集成ldap
3.3.1版本支持LDAPTLS/SSL