MongoDB認證和授權(quán)

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



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

  • user:
    用戶,用于提供客戶端連接MongoDB的認證賬戶;

  • role:
    角色,數(shù)據(jù)權(quán)限的集合,創(chuà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的組合,對資源擁有什么操作稱為權(quán)限;

  • authenticationDatabase:
    認證庫,及創(chuàng)建角色或用戶時所在的庫;
    如,在admin下創(chuàng)建MongoDB用戶那么登錄的時候需要指定認證庫 admin;
    在 test 庫下創(chuàng)建的用戶登錄的時候指定認證庫 test;




權(quán)限認證

MondoDB單實例認證

MongodDB存儲所有的用戶信息在admin數(shù)據(jù)庫的集合system.users中,保存數(shù)據(jù)庫、密碼和數(shù)據(jù)庫信息。MongoDB默認不啟用權(quán)限認證,只要能連接到服務(wù)器,就可連接到mongod。
若要啟用安全認證,需要更改配置文件Authorization,也可簡寫為 auth。或者在命令行啟動MongoDB時加上 -auth參數(shù)啟動,這樣當MongoDB啟動后就需要用戶和密碼進行認證了。

這是老版本MongoDB2.x中:

vim /etc/mongod.conf
auth = true

MongoDB3.x中:

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

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

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副本集認證

如果在副本集機制下開啟了 -auth 認證,那么此時MongoDB副本集狀態(tài)就會變成不健康狀態(tài),這就需要另外一個認證方式 KeyFile 。
簡單來說 KeyFile 就是用在副本集群間開啟認證的情況下需要的另一種認證方式,用來驗證集群間身份的。

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

vim /etc/mongod.conf

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

在副本集模式下,在整個配置完成前不要創(chuàng)建任何用戶,當認證好了之后,就可以創(chuàng)建用戶了。


角色管理

MondoDB支持基于角色的訪問控制(RBAC)來管理對MongoDB系統(tǒng)的訪問。一個用戶可以被授權(quán)一個或多個角色以決定該用戶對數(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:允許用戶進行索引創(chuàng)建、刪除,查看統(tǒng)計或訪問system.profile,但沒有角色和用戶管理的權(quán)限;
userAdmin:提供了在當前數(shù)據(jù)庫中創(chuàng)建和修改角色和用戶的能力;
dbOwner:提供對數(shù)據(jù)庫執(zhí)行任何操作的能力。這個角色組合了readWrite、dbAdmin和userAdmin角色授權(quán)的特權(quán);


3. 集群管理角色

hostManager:提供監(jiān)視和管理服務(wù)器的能力;
clusterManager:在集群上提供管理和監(jiān)視操作。可以訪問配置和本地數(shù)據(jù)庫,這些數(shù)據(jù)庫分別用于分片和復制;
clusterMonitor:提供對監(jiān)控工具的只讀訪問;
clusterAdmin:提供最強大的集群管理訪問(副本集、分片、主從等)。組合了clusterManager、clusterMonitor和hostManager角色的能力,還提供了dropDatabase操作;


4. 備份恢復角色

backup:提供備份數(shù)據(jù)所需的能力;
restore: 提供使用mongorestore恢復數(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. 超級用戶角色

root:超級權(quán)限,只能針對admin庫;


7. 內(nèi)部角色

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




自定義角色

MongoDB內(nèi)置角色一般來說都是夠用的,但當內(nèi)置角色不滿足需求時就可以自定義角色了。使用 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>]}    #定義對這個庫或集合可進行的權(quán)限操作,這是一個數(shù)組
        ],
        roles:[{role:<role_name>, db:<db_name>}]    #是否繼承其他的角色

角色創(chuàng)建完畢后 MongoDB 會在系統(tǒng)庫 admin 下創(chuàng)建一個系統(tǒng) collection 名叫 system.roles,里面存儲的即是角色相關(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:[{    #指定角色名稱以及認證庫
        role:"xxx", db:"xxxx"
    }]
})



認證

vim /etc/mongo.conf

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



查看用戶

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



刪除用戶

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



添加用戶權(quán)限

db.grantRolesToUser()



修改密碼

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


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

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

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容