大型網(wǎng)站設(shè)計公司站長素材音效
整理MongoDB文檔:身份驗證
個人博客,求關(guān)注。
文章概敘
本文主要講MongoDB在單機(jī)狀態(tài)下的賬戶配置。理解了MongoDB的語法,對于如何配置用戶權(quán)限會知道怎么配置,但是請注意給誰配置什么權(quán)限才是最重要的。
最小權(quán)限原則
系統(tǒng)的每個程序或者用戶應(yīng)該使用完成工作所需的最小權(quán)限工作
在MongoDB中,最小權(quán)限原則指的用戶的訪問、操作權(quán)限應(yīng)限制為僅執(zhí)行日常授權(quán)活動絕對需要的那些資源。
如一個標(biāo)準(zhǔn)的開發(fā)者,你應(yīng)該給予的是開發(fā)環(huán)境下的特定庫的讀寫權(quán)限,甚至必要情況下給予admin的權(quán)限,以免影響到開發(fā)的進(jìn)度。
但對一個生產(chǎn)環(huán)境的數(shù)據(jù)庫,應(yīng)該只給予開發(fā)者查看數(shù)據(jù)的權(quán)限,最好不要給予修改數(shù)據(jù)甚至是admin的權(quán)限,不然人家刪庫跑路,或者遇到新手修改了數(shù)據(jù)庫結(jié)構(gòu)導(dǎo)致線上爆炸,我想你可能過不了一個好年了。。。
MongoDB用戶角色
在 MongoDB 中,用戶角色用于控制用戶對數(shù)據(jù)庫和集合的訪問權(quán)限。
在MongoDB中,訪問權(quán)限并不是針對整個系統(tǒng)的,而是針對數(shù)據(jù)庫的。也就是說你給一個開發(fā)者分配了一個賬號,并不是說這個開發(fā)者可以直接登陸我們的DB,并且訪問所有的DB,而是給這個開發(fā)者a庫以及b庫的權(quán)限,然后他可以在指定的兩個庫中進(jìn)行操作,但是無法到c庫中進(jìn)行為所欲為的操作。
除了從數(shù)據(jù)庫的層面進(jìn)行管控,還對權(quán)限方面進(jìn)行區(qū)分以及管控,如前面所提的,開發(fā)者在生產(chǎn)環(huán)境下,應(yīng)該只對數(shù)據(jù)庫有查看的權(quán)限,不應(yīng)該對其有修改的權(quán)限,也就是說查看以及修改兩者是分開的。
接下來用一兩個例子,通過對MongoDB的語法來了解角色權(quán)限這一塊。
內(nèi)置角色
https://www.mongodb.com/docs/manual/reference/built-in-roles/
MongoDB為我們創(chuàng)建了一堆的角色,被稱為內(nèi)置角色。而每一個內(nèi)置角色的權(quán)限都不相同,當(dāng)前的版本是依據(jù)7.x,上述已經(jīng)將文章的原鏈接放上去了,強(qiáng)烈建議大家去查看。
下面先列出所有的角色類別。
數(shù)據(jù)庫用戶角色
數(shù)據(jù)庫用戶角色擁有read 以及readWriter權(quán)限。
read 提供讀取所有非系統(tǒng)集合上的數(shù)據(jù)的能力。即除了config、local、admin的表。
readWriter 提供在read的能力上外加修改所有非系統(tǒng)集合的能力。
數(shù)據(jù)庫管理角色
數(shù)據(jù)庫管理角色擁有dbAdmin, dbOwner, userAdmin權(quán)限。
dbAdmin提供執(zhí)行管理任務(wù)的能力,例如與架構(gòu)相關(guān)的任務(wù)、索引和收集統(tǒng)計信息。此角色不授予用戶和角色管理權(quán)限。
userAdmin提供在當(dāng)前數(shù)據(jù)庫,即可以在當(dāng)前的數(shù)據(jù)庫中修改人員的權(quán)限。
dbOwner數(shù)據(jù)庫所有者可以對數(shù)據(jù)庫執(zhí)行任何管理操作。此角色結(jié)合了由readWrite, dbAdmin和userAdmin角色。
群集管理角色
集群管理角色擁有clusterAdmin, clusterManager, clusterMonitor, hostManager的權(quán)限。
clusterManager提供對群集的管理和監(jiān)視操作,一個具有此角色的用戶可以訪問和數(shù)據(jù)庫,這些數(shù)據(jù)庫用于分片和復(fù)制。
clusterMonitor提供對監(jiān)視工具的只讀訪問權(quán)限。
hostManager提供監(jiān)視和管理服務(wù)器的功能。
clusterAdmin提供最大的群集管理訪問權(quán)限。此角色結(jié)合了 授予的特權(quán)clusterManager, clusterMonitor和hostManager角色。此外,該角色還提供dropDatabase行動。
備份和還原角色
備份和還原角色擁有backup、restore。
backup提供備份數(shù)據(jù)所需的最小權(quán)限。
restore提供從備份還原數(shù)據(jù)的權(quán)限。
全數(shù)據(jù)庫角色
全數(shù)據(jù)庫角色擁有readAnyDatabase, readWriteAnyDatabase, userAdminAnyDatabase, dbAdminAnyDatabase的權(quán)限。
readAnyDatabase提供除了admin, config, local庫之外的所有數(shù)據(jù)庫的讀取權(quán)限。
readWriteAnyDatabase在readAnyDatabase的基礎(chǔ)上,外加提供除了admin, config, local庫之外的所有數(shù)據(jù)庫的編輯權(quán)限。
userAdminAnyDatabase提供除了admin, config, local庫之外的所有數(shù)據(jù)庫的用戶管理操作訪問權(quán)限。
dbAdminAnyDatabase提供除了admin, config, local庫之外的所有數(shù)據(jù)庫的管理員管理操作訪問權(quán)限。
超級用戶角色
超級用戶角色擁有root 權(quán)限。
root為角色提供為任何用戶分配任何權(quán)限的功能、任何數(shù)據(jù)庫,這意味著具有這些角色之一的用戶可以為自己分配對任何數(shù)據(jù)庫的任何特權(quán)。
內(nèi)部角色
內(nèi)部角色擁有的是__system權(quán)限,一般不會使用到,也超級不建議分配出去。所以不做介紹。
創(chuàng)建用戶
當(dāng)了解了MongoDB的各個角色后,我們就進(jìn)入到創(chuàng)建角色的篇章,基于前面所提及的最小權(quán)限原則,我們創(chuàng)建一個root賬號作為后門,以及創(chuàng)建一個在test的只讀賬號還有在test的讀寫賬號做測試,首先我們需要進(jìn)入到admin庫中。
use admin
db.createUser({user: 'root',pwd: 'root',roles: ['root']})
創(chuàng)建完了root權(quán)限后,再創(chuàng)建兩個上述的用戶。
db.createUser({user: "testRead",pwd: passwordPrompt(),roles: [{ role: "readWrite", db: "test" }]}
)
db.createUser({user: "testReadWrite",pwd: passwordPrompt(),roles: [{ role: "readWrite", db: "test" }]}
)
使用passwordPrompt()來代替原本的文字輸入,畢竟這樣子畢竟正經(jīng)點。
列出用戶
當(dāng)前創(chuàng)建了三個用戶,但是在繼續(xù)操作之前,我們需要將其打印出來,以防止你在測試的時候有問題,但是自己不知道,在admin的庫下,輸入下方的指令。
db.system.users.find({},{ "user": 1, "roles": 1 })
此時可以看到,不小心將testRead的權(quán)限寫錯了,應(yīng)該為read權(quán)限,所以后續(xù)我們要修改它,但是現(xiàn)在先記下來,不做任何改動。
啟用訪問控制
在MongoDB部署上啟用訪問控制會強(qiáng)制執(zhí)行身份驗證。啟用訪問控制后,用戶需要標(biāo)識自己的身份并且只能執(zhí)行符合授予的權(quán)限的操作分配給其用戶的角色。
啟動訪問控制的方式有兩種。
一種在命令行中啟,需要在命令行選項中增加 --auth:
mongod --auth --port 27017
第二種方式是使用配置文件啟動MongoDB,在配置文件中增加security.authorization設(shè)置
security:authorization: enabled
由于本人喜歡用net start mongodb來啟動單機(jī)服務(wù),所以就直接使用第二種來啟動賬號驗證了。
驗證權(quán)限
現(xiàn)在我們重新啟動,并且進(jìn)入到服務(wù)中了,因此我們需要調(diào)用下面的方法來輸入我們的賬號密碼,先拿個root賬號試試
db.auth("root","root")
接著,我們想起了之前設(shè)置錯誤的賬號–test庫下面的testRead,此時,可以使用下面的語法進(jìn)行更新(正常情況下,都是在admin賬號下進(jìn)行的操作,不會在未開啟auth的時候進(jìn)行修改,所以此時才進(jìn)行修改,盡可能的模擬出開發(fā)環(huán)境
db.updateUse("testRead",{roles: [{ role: "read", db: "test" }]})
修改成功,接下來查看testRead賬號是否只有權(quán)限查看test下的數(shù)據(jù)。當(dāng)然了,修改密碼,也是可以這么設(shè)置的,只是參數(shù)修改為password。
可以看到,當(dāng)更改為了testRead賬號之后,只能執(zhí)行查看test庫下的數(shù)據(jù),無法進(jìn)行任何的修改操作。
刪除角色
對于角色的操作,有了增、改、查,那么就剩下刪除的api了,而對于刪除,我們需要使用到之前的root賬號,并且在admin庫下進(jìn)行修改。
刪除角色比較簡單,需要注意的是在admin庫中進(jìn)行刪除,并且需要有管理員權(quán)限。可以使用
db.system.users.remove({ "user": "testRead" })
至此,單機(jī)模式下的mongodb 賬號驗證就完成了,更多的是需要注意每一個role代表的是什么,如果無法滿足角色要求,還有一個更加詳細(xì)的自定義角色涉及到集合,但是很少用到,太細(xì)致的權(quán)限反而會加大開發(fā)成本,總不能每加一個集合,都要考慮分配給誰誰誰權(quán)限吧?
可視化工具中訪問
mongodb://username:password@localhost:27017
mongodb://root:root@localhost:27017