前言
本文主要給大家介紹了Mongodb認證鑒權的一些相關內(nèi)容,通過設置認證鑒權會對大家的mongodb安全進一步的保障,下面話不多說了,來一起看看詳細的介紹吧。
一、Mongodb 的權限管理
認識權限管理,說明主要概念及關系
與大多數(shù)數(shù)據(jù)庫一樣,Mongodb同樣提供了一套權限管理機制。 為了體驗Mongodb 的權限管理,我們找一臺已經(jīng)安裝好的Mongodb,可以參照這里搭建一個單節(jié)點的Mongodb。
直接打開mongo shell:
./bin/mongo --port=27017
嘗試執(zhí)行stats命令以查看appdb數(shù)據(jù)庫的狀態(tài):
MongoDB Enterprise > use appdb MongoDB Enterprise > db.stats() { "ok" : 0, "errmsg" : "not authorized on nscl to execute command { dbstats: 1.0, scale: undefined }", "code" : 13 }
此時的提示正是說明你當前的操作沒有獲得許可,使用appdb預創(chuàng)建的用戶進行鑒權:
> db.auth('appuser','yourpassword') 1 > db.stats() { "db" : "appdb", "collections" : 0, "views" : 0, "objects" : 0, "avgObjSize" : 0, "dataSize" : 0, "storageSize" : 0, "numExtents" : 0, "indexes" : 0, "indexSize" : 0, "fileSize" : 0, "ok" : 1 }
可以發(fā)現(xiàn),在通過驗明身份之后,stats操作的鑒權獲得了許可。
以上例子可能讓你對數(shù)據(jù)庫鑒權有了點淺顯認識,那么接下來開始說點概念了,大致是叫基于角色的權限控制
[圖-角色權限控制]
先解釋下圖中的幾個實體:
噢,關于圖的簡單解釋: 權限定義了對某些資源的某些操作,角色則可以擁有多個權限; 用戶User可以被賦予多個角色,從而獲得這些角色所擁有的權限以操作某些資源。
對于Mongodb來說,只要開啟鑒權,所有的DB訪問操作都需要通過權限檢查。而大致的操作流程跟下圖類似
[圖-mongo鑒權]
Mongodb 的用戶歸屬于某個數(shù)據(jù)庫,用戶需要在所屬的數(shù)據(jù)庫中進行鑒權;
一旦通過鑒權,當前的會話(連接)中所有操作將按照用戶被賦予的角色權限執(zhí)行檢查。
二、鑒權方式
闡述Mongodb支持的幾種鑒權方式 鑒權方式是指Mongodb如何識別接入用戶,如何檢查權限是否合法的一系列校驗機制。
SCRAM-SHA-1 是當前推薦使用的鑒權方式,既然如此,有必要上圖繼續(xù)解釋:
步驟解讀
可以看到,SCRAM鑒權時也類似SSL/TLS 的握手過程,但相比之下簡單許多,同時在性能方面也要具備優(yōu)勢; 然后我們看看安全性的部分:
另外SCRAM-SHA-1 相比MONGODB-CR的優(yōu)勢還有:
A tunable work factor (iterationCount), 可靈活調(diào)整的安全系數(shù) Per-user random salts rather than server-wide salts 每個用戶有獨立的隨機系數(shù) A cryptographically stronger hash function (SHA-1 rather than MD5), 更安全的hash函數(shù) Authentication of the server to the client as well as the client to the server. 支持雙向認證
對 SCRAM-SHA-1的實現(xiàn)感興趣?戳這里
三、內(nèi)部鑒權
副本集、分片集群內(nèi)鑒權方式
內(nèi)部鑒權是指 Mongo集群內(nèi)部節(jié)點之間進行訪問的鑒權方式,比如副本集內(nèi)主備之間的訪問、分片集群內(nèi)Mongos 與Mongod之間的訪問。 內(nèi)部鑒權目前支持兩種方式:
四、數(shù)據(jù)庫角色
針對Mongodb數(shù)據(jù)庫中的各種角色進行說明
數(shù)據(jù)庫訪問
角色名稱 | 擁有權限 |
---|---|
read | 允許讀取指定數(shù)據(jù)庫的角色 |
readWrite | 允許讀寫指定數(shù)據(jù)庫的角色 |
數(shù)據(jù)庫管理
角色名稱 | 擁有權限 |
---|---|
dbAdmin | 允許用戶在指定數(shù)據(jù)庫中執(zhí)行管理函數(shù),如索引創(chuàng)建、刪除,查看統(tǒng)計或訪問system.profile |
userAdmin | 允許管理當前數(shù)據(jù)庫的用戶,如創(chuàng)建用戶、為用戶授權 |
dbOwner | 數(shù)據(jù)庫擁有者(最高),集合了dbAdmin/userAdmin/readWrite角色權限 |
集群管理
角色名稱 | 擁有權限 |
---|---|
clusterAdmin | 集群最高管理員,集合clusterManager/clusterMonitor/hostManager角色權限 |
clusterManager | 集群管理角色,允許對分片和副本集集群執(zhí)行管理操作,如addShard,resync等 |
clusterMonitor | 集群監(jiān)控角色,允許對分片和副本集集群進行監(jiān)控,如查看serverStatus |
hostManager | 節(jié)點管理角色,允許監(jiān)控和管理節(jié)點,比如killOp、shutdown操作 |
備份恢復
角色名稱 | 擁有權限 |
---|---|
backup | 備份權限,允許執(zhí)行mongodump操作 |
restore | 恢復權限,允許執(zhí)行mongoresotre操作 |
數(shù)據(jù)庫通用角色
角色名稱 | 擁有權限 |
---|---|
readAnyDatabase | 允許讀取所有數(shù)據(jù)庫 |
readWriteAnyDatabase | 允許讀寫所有數(shù)據(jù)庫 |
userAdminAnyDatabase | 允許管理所有數(shù)據(jù)庫的用戶 |
dbAdminAnyDatabase | 允許管理所有數(shù)據(jù)庫 |
特殊角色
角色名稱 | 擁有權限 |
---|---|
root | 超級管理員,擁有所有權限 |
__system | 內(nèi)部角色,用于集群間節(jié)點通訊 |
基本是這些,有興趣可看看官方的內(nèi)置角色 Mongodb 的用戶及角色數(shù)據(jù)一般位于當前實例的 admin數(shù)據(jù)庫,system.users存放了所有數(shù)據(jù); 存在例外的情況是分片集群,應用接入mongos節(jié)點,鑒權數(shù)據(jù)則存放于config節(jié)點。因此有時候為了方便分片集群管理,會單獨為分片內(nèi)部節(jié)點創(chuàng)建獨立的管理操作用戶;
五、相關操作
簡單列舉用戶權限相關的常用操作
授權啟動
./bin/mongod --auth
默認為非授權啟動 也可以通過security.authorization配置指定
創(chuàng)建管理員用戶
use admin db.createUser({ user:'admin',pwd:'admin@2016',roles:[ {role:'clusterAdmin',db:'admin'}, {role:'userAdminAnyDatabase',db:'admin'} ]})
創(chuàng)建用戶
use appdb db.createUser({user:'appuser',pwd:'appuser@2016'})
授予權限
use appdb db.grantRolesToUser("appuser", [{role:'readWrite',db:'appdb'}])
刪除權限
use appdb db.revokeRolesFromUser("appuser",[{ role: "read", db: "appdb" }])
更多操作
六、常見問題
shell 操作提示錯誤
use appdb MongoDB Enterprise > db.stats() { "ok" : 0, "errmsg" : "not authorized on appdb to execute command { dbstats: 1.0, scale: undefined }", "code" : 13 }
原因:當前連接未鑒權或用戶沒有操作權限 解決:為用戶分配適當權限,并執(zhí)行auth操作,如下:
db.auth('appuser','yourpassword');
無法執(zhí)行 eval 操作
db.eval() 是一個全局操作,可執(zhí)行任意數(shù)據(jù)庫腳本; 執(zhí)行該命令需要擁有anyAction或anyResource的權限,通常不建議為數(shù)據(jù)庫用戶賦予這樣的權限。 該命令存在安全風險,已不建議使用(mongodb 3.0之后已經(jīng)過期)。
總結
以上就是這篇文章的全部內(nèi)容了,本文還有許多不足,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
擴展閱讀
Mongodb 鑒權機制 https://docs.mongodb.com/manual/core/authentication/
Mongodb 內(nèi)置角色介紹 https://docs.mongodb.com/manual/reference/built-in-roles/#database-user-roles
Mongodb 權限操作介紹 https://docs.mongodb.com/manual/reference/privilege-actions/#security-user-actions
運維-Mongodb鑒權介紹 http://www.ywnds.com/?p=5635