MongoDB認(rèn)證和授權(quán)

MongoDB認(rèn)證和授權(quán)詳解
MongoDB安全介紹及配置身份認(rèn)證
MondoDB安全



要想了解MongoDB的權(quán)限必須先了解如下一些關(guān)鍵字:

  • user:
    用戶践啄,用于提供客戶端連接MongoDB的認(rèn)證賬戶臭胜;

  • role:
    角色逐哈,數(shù)據(jù)權(quán)限的集合饰躲,創(chuàng)建用戶的時(shí)候必須要指定對(duì)應(yīng)的角色,否則用戶無法操作數(shù)據(jù)庫唇牧;

  • resource:
    資源风范,包括database或collection 也可以是database和collection的組合;
    {db:<db>, collection:<collection>}

  • actions:
    權(quán)限操作摹恰,定義了 user 能夠?qū)?resource document 執(zhí)行的操作辫继;
    如 增、刪俗慈、改姑宽、查;

  • privilege:
    權(quán)限闺阱,privilege 是一組 resource 和 action的組合炮车,對(duì)資源擁有什么操作稱為權(quán)限;

  • authenticationDatabase:
    認(rèn)證庫酣溃,及創(chuàng)建角色或用戶時(shí)所在的庫瘦穆;
    如,在admin下創(chuàng)建MongoDB用戶那么登錄的時(shí)候需要指定認(rèn)證庫 admin赊豌;
    在 test 庫下創(chuàng)建的用戶登錄的時(shí)候指定認(rèn)證庫 test扛或;




權(quán)限認(rèn)證

MondoDB單實(shí)例認(rèn)證

MongodDB存儲(chǔ)所有的用戶信息在admin數(shù)據(jù)庫的集合system.users中,保存數(shù)據(jù)庫碘饼、密碼和數(shù)據(jù)庫信息熙兔。MongoDB默認(rèn)不啟用權(quán)限認(rèn)證悲伶,只要能連接到服務(wù)器,就可連接到mongod黔姜。
若要啟用安全認(rèn)證拢切,需要更改配置文件Authorization,也可簡(jiǎn)寫為 auth秆吵』匆或者在命令行啟動(dòng)MongoDB時(shí)加上 -auth參數(shù)啟動(dòng),這樣當(dāng)MongoDB啟動(dòng)后就需要用戶和密碼進(jìn)行認(rèn)證了纳寂。

這是老版本MongoDB2.x中:

vim /etc/mongod.conf
auth = true

MongoDB3.x中:

vim /etc/mongod.conf
security:
    authorization:enabled

但是主穗,不使用用戶名和密碼依然可以連接到數(shù)據(jù)庫。但是將沒有權(quán)限查看數(shù)據(jù)庫毙芜。這里可以認(rèn)證用戶:

mongo
use 庫(如admin)
db.auth("user","pwd")

或直接 mongo 127.0.0.1/admin -u user -p 來連接數(shù)據(jù)庫忽媒。
在MongoDB授權(quán)部分,其中admin數(shù)據(jù)庫中的用戶名可以管理所有的數(shù)據(jù)庫腋粥,其他數(shù)據(jù)庫中的用戶只能管理其所在的數(shù)據(jù)庫晦雨。

MongoDB副本集認(rèn)證

如果在副本集機(jī)制下開啟了 -auth 認(rèn)證,那么此時(shí)MongoDB副本集狀態(tài)就會(huì)變成不健康狀態(tài)隘冲,這就需要另外一個(gè)認(rèn)證方式 KeyFile 闹瞧。
簡(jiǎn)單來說 KeyFile 就是用在副本集群間開啟認(rèn)證的情況下需要的另一種認(rèn)證方式,用來驗(yàn)證集群間身份的展辞。

在各個(gè)節(jié)點(diǎn)的配置文件中加入KeyFile(600):

vim /etc/mongod.conf

security:
    authorization:enabled
    KeyFile:/path/.KeyFile

在副本集模式下奥邮,在整個(gè)配置完成前不要?jiǎng)?chuàng)建任何用戶,當(dāng)認(rèn)證好了之后罗珍,就可以創(chuàng)建用戶了洽腺。


角色管理

MondoDB支持基于角色的訪問控制(RBAC)來管理對(duì)MongoDB系統(tǒng)的訪問。一個(gè)用戶可以被授權(quán)一個(gè)或多個(gè)角色以決定該用戶對(duì)數(shù)據(jù)庫資源和操作的訪問權(quán)限覆旱。在權(quán)限以外蘸朋,用戶是無法訪問系統(tǒng)的。
數(shù)據(jù)庫角色在創(chuàng)建用戶的role參數(shù)中設(shè)置扣唱。角色分為內(nèi)建角色和自定義角色度液。

內(nèi)建角色

MongoDB內(nèi)建角色包括以下幾類:

1. 數(shù)據(jù)庫用戶角色

read:允許用戶讀取指定數(shù)據(jù)庫;
readWrite:允許用戶讀寫指定數(shù)據(jù)庫画舌;


2. 數(shù)據(jù)庫管理員角色

dbAdmin:允許用戶進(jìn)行索引創(chuàng)建堕担、刪除,查看統(tǒng)計(jì)或訪問system.profile曲聂,但沒有角色和用戶管理的權(quán)限霹购;
userAdmin:提供了在當(dāng)前數(shù)據(jù)庫中創(chuàng)建和修改角色和用戶的能力;
dbOwner:提供對(duì)數(shù)據(jù)庫執(zhí)行任何操作的能力朋腋。這個(gè)角色組合了readWrite齐疙、dbAdmin和userAdmin角色授權(quán)的特權(quán)膜楷;


3. 集群管理角色

hostManager:提供監(jiān)視和管理服務(wù)器的能力;
clusterManager:在集群上提供管理和監(jiān)視操作贞奋《奶可以訪問配置和本地?cái)?shù)據(jù)庫,這些數(shù)據(jù)庫分別用于分片和復(fù)制轿塔;
clusterMonitor:提供對(duì)監(jiān)控工具的只讀訪問特愿;
clusterAdmin:提供最強(qiáng)大的集群管理訪問(副本集、分片勾缭、主從等)揍障。組合了clusterManager、clusterMonitor和hostManager角色的能力俩由,還提供了dropDatabase操作毒嫡;


4. 備份恢復(fù)角色

backup:提供備份數(shù)據(jù)所需的能力;
restore: 提供使用mongorestore恢復(fù)數(shù)據(jù)的能力幻梯;


5. 所有數(shù)據(jù)庫角色

readAnyDatabase:只在admin數(shù)據(jù)庫中可用兜畸,賦予用戶所有數(shù)據(jù)庫的讀權(quán)限;
readWriteAnyDatabase:只在admin數(shù)據(jù)庫中可用碘梢,賦予用戶所有數(shù)據(jù)庫的讀寫權(quán)限咬摇;
userAdminAnyDatabase:只在admin數(shù)據(jù)庫中可用,賦予用戶所有數(shù)據(jù)庫的userAdmin權(quán)限痘系;
dbAdminAnyDataBase:只在admin數(shù)據(jù)庫中可用菲嘴,賦予用戶所有數(shù)據(jù)庫的adAdmin權(quán)限饿自;


6. 超級(jí)用戶角色

root:超級(jí)權(quán)限汰翠,只能針對(duì)admin庫;


7. 內(nèi)部角色

__system:提供對(duì)數(shù)據(jù)庫中任何對(duì)象的任何操作的特權(quán)昭雌;




自定義角色

MongoDB內(nèi)置角色一般來說都是夠用的复唤,但當(dāng)內(nèi)置角色不滿足需求時(shí)就可以自定義角色了。使用 db.createRole() 方法來自定義角色烛卧。
只能在 admin庫 中創(chuàng)建角色佛纫;

use admin
db.createRole(
    {
        role:<role_name>,    #定義角色名稱
        privilege:[    #權(quán)限集
            {resource:{cluster:true, actions:[<action_name>]},
            {resource: {db:<db_name>, collection:<coll_name>},
             actions:[<action_name>]}    #定義對(duì)這個(gè)庫或集合可進(jìn)行的權(quán)限操作总放,這是一個(gè)數(shù)組
        ],
        roles:[{role:<role_name>, db:<db_name>}]    #是否繼承其他的角色

角色創(chuàng)建完畢后 MongoDB 會(huì)在系統(tǒng)庫 admin 下創(chuàng)建一個(gè)系統(tǒng) collection 名叫 system.roles呈宇,里面存儲(chǔ)的即是角色相關(guān)的信息。使用如下命令查看:

db.system.roles.find()


操作角色

查看角色
db.getRole()
角色繼承
db.grantRolesToRole()    #角色授權(quán)
db.revokeRolesfromRole()    #角色移權(quán)




用戶管理

創(chuàng)建用戶

db.createUser({
    user:"xxx", pwd:"xxxx", customDate:"xxx",
    roles:[{    #指定角色名稱以及認(rèn)證庫
        role:"xxx", db:"xxxx"
    }]
})



認(rèn)證

vim /etc/mongo.conf

security:
    authorization:enabled
db.auth("user","passwd")    #在use db后
或
mongo -u user -p passwd --authenticationDatabase xxx    
#在哪個(gè)庫創(chuàng)建的用戶就需要使用哪個(gè)庫進(jìn)行認(rèn)證



查看用戶

db.getUser("user")
db.system.users.find()



刪除用戶

db.dropUser("user")
db.dropAllUsers()    #刪除當(dāng)前庫所有用戶



添加用戶權(quán)限

db.grantRolesToUser()



修改密碼

db.changeUserPassword("user","new_passwd")


關(guān)閉MongoDB局雄,千萬不要 kill -9 pid甥啄,使用 db.shutdownServer()

在MongoDB中刪除庫和集合并不會(huì)級(jí)聯(lián)刪除對(duì)應(yīng)的角色和用戶炬搭。因此如果想徹底刪除對(duì)應(yīng)的業(yè)務(wù)應(yīng)該先刪除庫與其對(duì)應(yīng)的角色和用戶蜈漓。

如果既想實(shí)現(xiàn)精細(xì)化權(quán)限控制又想簡(jiǎn)化用戶管理穆桂,原則上建議只給開發(fā)創(chuàng)建一個(gè)賬戶,并且使用admin做認(rèn)證庫融虽,這樣可以避免清理過期業(yè)務(wù)庫而導(dǎo)致無法登陸的問題享完。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市有额,隨后出現(xiàn)的幾起案子般又,更是在濱河造成了極大的恐慌,老刑警劉巖谆吴,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件倒源,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡句狼,警方通過查閱死者的電腦和手機(jī)笋熬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來腻菇,“玉大人胳螟,你說我怎么就攤上這事〕锿拢” “怎么了糖耸?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)丘薛。 經(jīng)常有香客問我嘉竟,道長(zhǎng),這世上最難降的妖魔是什么洋侨? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任舍扰,我火速辦了婚禮,結(jié)果婚禮上希坚,老公的妹妹穿的比我還像新娘边苹。我一直安慰自己,他們只是感情好裁僧,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布个束。 她就那樣靜靜地躺著,像睡著了一般聊疲。 火紅的嫁衣襯著肌膚如雪茬底。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天获洲,我揣著相機(jī)與錄音阱表,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛捶枢,可吹牛的內(nèi)容都是我干的握截。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼烂叔,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼谨胞!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蒜鸡,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤胯努,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后逢防,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體叶沛,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年忘朝,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了灰署。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡局嘁,死狀恐怖溉箕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情悦昵,我是刑警寧澤肴茄,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站但指,受9級(jí)特大地震影響寡痰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜棋凳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一拦坠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧贫橙,春花似錦贪婉、人聲如沸反粥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽才顿。三九已至莫湘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間郑气,已是汗流浹背幅垮。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留尾组,地道東北人忙芒。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓示弓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親呵萨。 傳聞我的和親對(duì)象是個(gè)殘疾皇子奏属,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354