關(guān)于Mongodb 認(rèn)證鑒權(quán)你需要知道的一些事
前言
本文主要給大家介紹了Mongodb認(rèn)證鑒權(quán)的一些相關(guān)內(nèi)容,通過設(shè)置認(rèn)證鑒權(quán)會對大家的mongodb安全進(jìn)一步的保障,下面話不多說了,來一起看看詳細(xì)的介紹吧。
一、Mongodb 的權(quán)限管理
認(rèn)識權(quán)限管理,說明主要概念及關(guān)系
與大多數(shù)數(shù)據(jù)庫一樣,Mongodb同樣提供了一套權(quán)限管理機(jī)制。 為了體驗(yàn)Mongodb 的權(quán)限管理,我們找一臺已經(jīng)安裝好的Mongodb,可以參照這里搭建一個(gè)單節(jié)點(diǎn)的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 }
此時(shí)的提示正是說明你當(dāng)前的操作沒有獲得許可,使用appdb預(yù)創(chuàng)建的用戶進(jìn)行鑒權(quán):
> 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),在通過驗(yàn)明身份之后,stats操作的鑒權(quán)獲得了許可。
以上例子可能讓你對數(shù)據(jù)庫鑒權(quán)有了點(diǎn)淺顯認(rèn)識,那么接下來開始說點(diǎn)概念了,大致是叫基于角色的權(quán)限控制
[圖-角色權(quán)限控制]
先解釋下圖中的幾個(gè)實(shí)體:
- Resource,資源 一個(gè)資源可以是一個(gè)數(shù)據(jù)庫、集合、或者一個(gè)集群..往大了說,任何可能被操作的事物都可以被當(dāng)做資源。
- Action,動(dòng)作 動(dòng)作是指對資源的一個(gè)執(zhí)行行為,比如讀取表、讀取數(shù)據(jù)庫,其中讀取便是一個(gè)動(dòng)作。
- Privilege,權(quán)限 權(quán)限指的是對某類或某一些資源執(zhí)行某些動(dòng)作的允許,與Permission的意義一致。
- Role,角色 系統(tǒng)中的角色,通常是代表了一種權(quán)力等級的象征,比如論壇中的管理員、版主、游客等等,就是角色; 系統(tǒng)定義中,角色往往代表一組權(quán)限的集合。
- User,用戶 可登錄系統(tǒng)的實(shí)體,一個(gè)用戶通??杀毁x予多個(gè)角色。
噢,關(guān)于圖的簡單解釋: 權(quán)限定義了對某些資源的某些操作,角色則可以擁有多個(gè)權(quán)限; 用戶User可以被賦予多個(gè)角色,從而獲得這些角色所擁有的權(quán)限以操作某些資源。
對于Mongodb來說,只要開啟鑒權(quán),所有的DB訪問操作都需要通過權(quán)限檢查。而大致的操作流程跟下圖類似
[圖-mongo鑒權(quán)]
Mongodb 的用戶歸屬于某個(gè)數(shù)據(jù)庫,用戶需要在所屬的數(shù)據(jù)庫中進(jìn)行鑒權(quán);
一旦通過鑒權(quán),當(dāng)前的會話(連接)中所有操作將按照用戶被賦予的角色權(quán)限執(zhí)行檢查。
二、鑒權(quán)方式
闡述Mongodb支持的幾種鑒權(quán)方式 鑒權(quán)方式是指Mongodb如何識別接入用戶,如何檢查權(quán)限是否合法的一系列校驗(yàn)機(jī)制。
- SCRAM-SHA-1 SCRAM-SHA-1 是默認(rèn)的鑒權(quán)機(jī)制,定義于 IETF standard, RFC 5802 是一種安全性較高的"挑戰(zhàn)-應(yīng)答"鑒權(quán)機(jī)制。關(guān)于"挑戰(zhàn)-應(yīng)答"可以參考維基百科
- MongoDB Challenge and Response (MONGODB-CR) 3.0 以前采用的機(jī)制,已經(jīng)廢棄
- x.509 Certificate Authentication. 基于證書的鑒權(quán),采用該方式可建立 SSL/TLS 加密連接
- LDAP proxy authentication 基于LDAP 系統(tǒng)的鑒權(quán),僅企業(yè)版支持
- Kerberos authentication 基于Kerberos 的鑒權(quán),僅企業(yè)版支持
SCRAM-SHA-1 是當(dāng)前推薦使用的鑒權(quán)方式,既然如此,有必要上圖繼續(xù)解釋:
步驟解讀
- 客戶端發(fā)起一個(gè)SCRAM鑒權(quán)請求; 鑒權(quán)參數(shù)中帶上用戶名、客戶端隨機(jī)字符串(防止重放攻擊);
- 服務(wù)端發(fā)出一個(gè)挑戰(zhàn)響應(yīng); 服務(wù)側(cè)先檢查用戶名,通過后生成一個(gè)salt因子、迭代數(shù)、合并字符串(包含客戶端隨機(jī)串和服務(wù)端隨機(jī)串)
- 客戶端響應(yīng)一個(gè)proof(證明數(shù)據(jù))和合并字符串; 響應(yīng)的 proof數(shù)據(jù)根據(jù)服務(wù)所給的隨機(jī)參數(shù)以及客戶端密鑰生成,是一個(gè)客戶端簽名與密鑰異或計(jì)算后的結(jié)果;
- 服務(wù)端將存儲的密鑰結(jié)合隨機(jī)參數(shù),使用同樣的算法生成簽名并校驗(yàn)客戶端 proof數(shù)據(jù); 若校驗(yàn)通過,服務(wù)端采用類似方式發(fā)送自己的簽名;
- 客戶端校驗(yàn)服務(wù)端簽名數(shù)據(jù)。
可以看到,SCRAM鑒權(quán)時(shí)也類似SSL/TLS 的握手過程,但相比之下簡單許多,同時(shí)在性能方面也要具備優(yōu)勢; 然后我們看看安全性的部分:
- 信息竊聽,傳輸過程中全部采用動(dòng)態(tài)簽名,保證密碼不會被傳輸;
- 重放攻擊,由于使用了隨機(jī)數(shù),每次生成的數(shù)據(jù)都不一樣,可避免重復(fù)數(shù)據(jù)攻擊;
- 服務(wù)假冒,鑒權(quán)過程是雙向的,即客戶端會校驗(yàn)服務(wù)端身份,而服務(wù)端密鑰也根據(jù)密碼生成,中間人無法仿造;
- 存儲安全,密碼在數(shù)據(jù)庫中均沒有明文存儲,都通過不可逆的算法加密存儲。
另外SCRAM-SHA-1 相比MONGODB-CR的優(yōu)勢還有:
A tunable work factor (iterationCount), 可靈活調(diào)整的安全系數(shù) Per-user random salts rather than server-wide salts 每個(gè)用戶有獨(dú)立的隨機(jī)系數(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. 支持雙向認(rèn)證
對 SCRAM-SHA-1的實(shí)現(xiàn)感興趣?戳這里
三、內(nèi)部鑒權(quán)
副本集、分片集群內(nèi)鑒權(quán)方式
內(nèi)部鑒權(quán)是指 Mongo集群內(nèi)部節(jié)點(diǎn)之間進(jìn)行訪問的鑒權(quán)方式,比如副本集內(nèi)主備之間的訪問、分片集群內(nèi)Mongos 與Mongod之間的訪問。 內(nèi)部鑒權(quán)目前支持兩種方式:
- KeyFiles 密鑰文件方式,采用SCAM-SHA-1 的鑒權(quán)機(jī)制,文件內(nèi)包含了一個(gè)共享密鑰,由集群內(nèi)所有成員共同持有。 通常,密鑰的長度在6-1024字符內(nèi),采用Base64編碼。如何使用?
- X.509 證書 證書鑒權(quán),用于SSL/TLS加密連接通道。 如何使用?
四、數(shù)據(jù)庫角色
針對Mongodb數(shù)據(jù)庫中的各種角色進(jìn)行說明
數(shù)據(jù)庫訪問
角色名稱 | 擁有權(quán)限 |
---|---|
read | 允許讀取指定數(shù)據(jù)庫的角色 |
readWrite | 允許讀寫指定數(shù)據(jù)庫的角色 |
數(shù)據(jù)庫管理
角色名稱 | 擁有權(quán)限 |
---|---|
dbAdmin | 允許用戶在指定數(shù)據(jù)庫中執(zhí)行管理函數(shù),如索引創(chuàng)建、刪除,查看統(tǒng)計(jì)或訪問system.profile |
userAdmin | 允許管理當(dāng)前數(shù)據(jù)庫的用戶,如創(chuàng)建用戶、為用戶授權(quán) |
dbOwner | 數(shù)據(jù)庫擁有者(最高),集合了dbAdmin/userAdmin/readWrite角色權(quán)限 |
集群管理
角色名稱 | 擁有權(quán)限 |
---|---|
clusterAdmin | 集群最高管理員,集合clusterManager/clusterMonitor/hostManager角色權(quán)限 |
clusterManager | 集群管理角色,允許對分片和副本集集群執(zhí)行管理操作,如addShard,resync等 |
clusterMonitor | 集群監(jiān)控角色,允許對分片和副本集集群進(jìn)行監(jiān)控,如查看serverStatus |
hostManager | 節(jié)點(diǎn)管理角色,允許監(jiān)控和管理節(jié)點(diǎn),比如killOp、shutdown操作 |
備份恢復(fù)
角色名稱 | 擁有權(quán)限 |
---|---|
backup | 備份權(quán)限,允許執(zhí)行mongodump操作 |
restore | 恢復(fù)權(quán)限,允許執(zhí)行mongoresotre操作 |
數(shù)據(jù)庫通用角色
角色名稱 | 擁有權(quán)限 |
---|---|
readAnyDatabase | 允許讀取所有數(shù)據(jù)庫 |
readWriteAnyDatabase | 允許讀寫所有數(shù)據(jù)庫 |
userAdminAnyDatabase | 允許管理所有數(shù)據(jù)庫的用戶 |
dbAdminAnyDatabase | 允許管理所有數(shù)據(jù)庫 |
特殊角色
角色名稱 | 擁有權(quán)限 |
---|---|
root | 超級管理員,擁有所有權(quán)限 |
__system | 內(nèi)部角色,用于集群間節(jié)點(diǎn)通訊 |
基本是這些,有興趣可看看官方的內(nèi)置角色 Mongodb 的用戶及角色數(shù)據(jù)一般位于當(dāng)前實(shí)例的 admin數(shù)據(jù)庫,system.users存放了所有數(shù)據(jù); 存在例外的情況是分片集群,應(yīng)用接入mongos節(jié)點(diǎn),鑒權(quán)數(shù)據(jù)則存放于config節(jié)點(diǎn)。因此有時(shí)候?yàn)榱朔奖惴制汗芾?,會單?dú)為分片內(nèi)部節(jié)點(diǎn)創(chuàng)建獨(dú)立的管理操作用戶;
五、相關(guān)操作
簡單列舉用戶權(quán)限相關(guān)的常用操作
授權(quán)啟動(dòng)
./bin/mongod --auth
默認(rèn)為非授權(quán)啟動(dòng) 也可以通過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'})
授予權(quán)限
use appdb db.grantRolesToUser("appuser", [{role:'readWrite',db:'appdb'}])
刪除權(quán)限
use appdb db.revokeRolesFromUser("appuser",[{ role: "read", db: "appdb" }])
六、常見問題
shell 操作提示錯(cuò)誤
use appdb MongoDB Enterprise > db.stats() { "ok" : 0, "errmsg" : "not authorized on appdb to execute command { dbstats: 1.0, scale: undefined }", "code" : 13 }
原因:當(dāng)前連接未鑒權(quán)或用戶沒有操作權(quán)限 解決:為用戶分配適當(dāng)權(quán)限,并執(zhí)行auth操作,如下:
db.auth('appuser','yourpassword');
無法執(zhí)行 eval 操作
db.eval() 是一個(gè)全局操作,可執(zhí)行任意數(shù)據(jù)庫腳本; 執(zhí)行該命令需要擁有anyAction或anyResource的權(quán)限,通常不建議為數(shù)據(jù)庫用戶賦予這樣的權(quán)限。 該命令存在安全風(fēng)險(xiǎn),已不建議使用(mongodb 3.0之后已經(jīng)過期)。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,本文還有許多不足,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
擴(kuò)展閱讀
Mongodb 鑒權(quán)機(jī)制 https://docs.mongodb.com/manual/core/authentication/
Mongodb 內(nèi)置角色介紹 https://docs.mongodb.com/manual/reference/built-in-roles/#database-user-roles
Mongodb 權(quán)限操作介紹 https://docs.mongodb.com/manual/reference/privilege-actions/#security-user-actions
運(yùn)維-Mongodb鑒權(quán)介紹 http://www.ywnds.com/?p=5635
- 基于Docker的MongoDB實(shí)現(xiàn)授權(quán)訪問的方法
- 淺析MongoDB之安全認(rèn)證
- python連接mongodb密碼認(rèn)證實(shí)例
- MongoDB開啟權(quán)限認(rèn)證的方法步驟詳解
- Java開發(fā)之spring security實(shí)現(xiàn)基于MongoDB的認(rèn)證功能
- Mongodb 3.2.9開啟用戶權(quán)限認(rèn)證問題的步驟詳解
- MongoDB安全及身份認(rèn)證(實(shí)例講解)
- mongodb 3.4下遠(yuǎn)程連接認(rèn)證失敗的解決方法
- MongoDB數(shù)據(jù)庫授權(quán)認(rèn)證的實(shí)現(xiàn)
相關(guān)文章
mongodb使用c#驅(qū)動(dòng)數(shù)據(jù)插入demo
今天小編就為大家分享一篇關(guān)于mongodb使用c#驅(qū)動(dòng)數(shù)據(jù)插入demo,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-01-01MongoDB快速入門筆記(三)之MongoDB插入文檔操作
這篇文章主要介紹了MongoDB快速入門筆記(三)之MongoDB插入文檔操作 的相關(guān)資料,非常不錯(cuò)具有參考借鑒價(jià)值,需要的朋友可以參考下2016-06-06MongoDB性能篇之創(chuàng)建索引,組合索引,唯一索引,刪除索引和explain執(zhí)行計(jì)劃
這篇文章主要介紹了MongoDB性能篇之創(chuàng)建索引,組合索引,唯一索引,刪除索引和explain執(zhí)行計(jì)劃的相關(guān)資料,需要的朋友可以參考下2016-02-02解決MongoDB占用內(nèi)存過大頻繁死機(jī)的方法詳解
這篇文章主要介紹了解決MongoDB占用內(nèi)存過大頻繁死機(jī)的方法詳解,需要的朋友可以參考下2020-02-02mongoDB 多重?cái)?shù)組查詢(AngularJS綁定顯示 nodejs)
這篇文章主要介紹了mongoDB 多重?cái)?shù)組查詢(AngularJS綁定顯示 nodejs),需要的朋友可以參考下2017-06-06CentOS 6.5系統(tǒng)中使用yum安裝MongoDB 2.6 教程
這篇文章主要介紹了CentOS 6.5系統(tǒng)中使用yum安裝MongoDB 2.6 教程,本文共分5個(gè)步驟完成MongoDB的安裝,需要的朋友可以參考下2015-01-01Mongo復(fù)制集同步驗(yàn)證的實(shí)例詳解
這篇文章主要介紹了mongo復(fù)制集同步驗(yàn)證的實(shí)例詳解的相關(guān)資料,這里提供實(shí)現(xiàn)的方法及示例代碼,幫助大家學(xué)習(xí)理解,需要的朋友可以參考下2017-07-07