一、環境簡介
Mongodb enterprise v4.0.16
OpenLDAP v2.4.44
二、Mongodb集成LDAP的授權過程
- 客戶端指定某種外部驗證方式鏈接Mongodb;
- Mongodb根據配置中設置的ip、用戶、密碼等來綁定LDAP服務器;
- Mongodb根據配置的查詢模板構建查詢語句,並向LDAP服務器發送請求獲得驗證用戶所屬的用戶組信息;
- LDAP服務器執行查詢並返回用戶組的信息;
- Mongodb在admin數據庫中查找跟用戶組對應的role,並對應的權限授權給當前用戶;
- 客戶端在授權的數據庫上進行操作;
三、配置過程
在LDAP服務器新建用戶mongodb

在LDAP服務器中新建dbrole組,並通過memberUid進行關聯,這里需要填寫用戶的全限定名

在mongod.conf中新增LDAP的配置
security:
ldap:
servers: "192.168.32.15:389"
authz:
queryTemplate: "dc=mango,dc=com?cn?sub?(&(objectClass=posixGroup)(memberUid={USER}))"
bind:
queryUser: "cn=root,dc=mango,dc=com"
queryPassword: "mango"
method: "simple"
重啟mongdb服務
systemctl restart mongod
在mongodb的admin數據庫中新建角色
use admin
db.createRole({
"role" : "dbrole",
"privileges" : [],
"roles" : [{
"role" : "dbOwner",
"db" : "test"
}]
})
使用mongodb shell連接數據庫
mongo --username uid=mongodb,ou=db,dc=mango,dc=com --password mangodb --authenticationMechanism PLAIN --authenticationDatabase '$external'
四、security.ldap.authz.queryTemplate查詢語法
首先這個查詢模板是LDAP server執行的,所以其最終是滿足LDAP的查詢語法;
[ dn [ ? [attributes] [ ? [scope] [ ? [filter] [ ? [Extensions] ] ] ] ] ]
dn:定義查詢開始的基點對象;
attributes:定義返回命中的條目的哪個字段;如果不定義則返回條目對應的dn;
scope:進一步控制相對基點的搜索范圍,可以取值one、sub、base;
filter:定義過濾條件,LDAP有自己的一套語法;
具體的查詢語法,網上已經比較多,這里只簡單介紹一下mongod.config里配置的查詢語句
dc=mango,dc=com?cn?sub?(&(objectClass=posixGroup)(memberUid={USER}))
在dc=mango,dc=com的節點下,查找objectClass=posixGroup,同時memberUid=當前登錄用戶的節並返回節點的cn字段;
這里的{USER}在查詢之前,mongodb會將它替換為登錄的用戶id;基於當前版本的mongodb的實現機制,這里是不能直接使用常量值;
