一、環境簡介

Mongodb enterprise v4.0.16

OpenLDAP v2.4.44

二、Mongodb整合LDAP的授權過程

  1. 客戶端指定某種外部驗證方式連結Mongodb;
  2. Mongodb根據配置中設定的ip、使用者、密碼等來繫結LDAP伺服器;
  3. Mongodb根據配置的查詢模板構建查詢語句,並向LDAP伺服器傳送請求獲得驗證使用者所屬的使用者組資訊;
  4. LDAP伺服器執行查詢並返回使用者組的資訊;
  5. Mongodb在admin資料庫中查詢跟使用者組對應的role,並對應的許可權授權給當前使用者;
  6. 客戶端在授權的資料庫上進行操作;

三、配置過程

在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的實現機制,這裡是不能直接使用常量值;