第5期 MongoDB配置用戶(hù)名密碼認(rèn)證登錄

一、前言
二、RBAC權(quán)限模型簡(jiǎn)介
RBAC0:這是RBAC的初始形態(tài),也是最原始、最簡(jiǎn)單的RBAC版本; RBAC1:基于RBAC0的優(yōu)化,增加了角色的分層(即:子角色),子角色可以繼承父角色的所有權(quán)限; RBAC2:基于RBAC0的另一種優(yōu)化,增加了對(duì)角色的一些限制:角色互斥、角色容量等; RBAC3: 最復(fù)雜也是最全面的RBAC模型,它在RBAC0的基礎(chǔ)上,將RBAC1和RBAC2中的優(yōu)化部分進(jìn)行了整合;
用戶(hù)(User):系統(tǒng)接口及訪問(wèn)的操作者,即登錄的用戶(hù)本身,有一個(gè)用戶(hù)ID(定義uuid) 角色(Role):具有一類(lèi)相同操作權(quán)限的用戶(hù)的總稱(chēng),即這個(gè)用戶(hù)擁有幾個(gè)身份,一個(gè)用戶(hù)可以有幾個(gè)角色 權(quán)限(Access):能夠訪問(wèn)某接口或者做某操作的授權(quán)資格,Access英語(yǔ)中的含義是訪問(wèn),引申為訪問(wèn)的資源,習(xí)慣上可以稱(chēng)之為權(quán)限
三、MongoDB系統(tǒng)角色(RBAC)
3.1 用戶(hù)
先在admin數(shù)據(jù)庫(kù)中創(chuàng)建角色為userAdmin或userAdminAnyDatabase的用戶(hù)作為管理用戶(hù)的用戶(hù); 啟用訪問(wèn)控制,進(jìn)行登錄用戶(hù)驗(yàn)證,這樣創(chuàng)建用戶(hù)才有意義。
3.2 角色
3.2.1 MongoDB內(nèi)置角色:
數(shù)據(jù)庫(kù)用戶(hù)角色:read、readWrite;
數(shù)據(jù)庫(kù)管理角色:dbAdmin、dbOwner、userAdmin;
集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
備份恢復(fù)角色:backup、restore;
所有數(shù)據(jù)庫(kù)角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
超級(jí)用戶(hù)角色:root
內(nèi)部角色:__system
| 角色 | 權(quán)限描述 |
|---|---|
| read | 可以讀取指定數(shù)據(jù)庫(kù)中任何數(shù)據(jù)。 |
| readWrite | 可以讀寫(xiě)指定數(shù)據(jù)庫(kù)中任何數(shù)據(jù),包括創(chuàng)建、重命名、刪除集合。 |
| readAnyDatabase | 可以讀取所有數(shù)據(jù)庫(kù)中任何數(shù)據(jù)(除了數(shù)據(jù)庫(kù)config和local之外)。 |
| readWriteAnyDatabase | 可以讀寫(xiě)所有數(shù)據(jù)庫(kù)中任何數(shù)據(jù)(除了數(shù)據(jù)庫(kù)config和local之外)。 |
| dbAdmin | 可以讀取指定數(shù)據(jù)庫(kù)以及對(duì)數(shù)據(jù)庫(kù)進(jìn)行清理、修改、壓縮、獲取統(tǒng)計(jì)信息、執(zhí)行檢查等操作。 |
| dbAdminAnyDatabase | 可以讀取任何數(shù)據(jù)庫(kù)以及對(duì)數(shù)據(jù)庫(kù)進(jìn)行清理、修改、壓縮、獲取統(tǒng)計(jì)信息、執(zhí)行檢查等操作(除了數(shù)據(jù)庫(kù)config和local之外)。 |
| clusterAdmin | 可以對(duì)整個(gè)集群或數(shù)據(jù)庫(kù)系統(tǒng)進(jìn)行管理操作。 |
| userAdmin | 可以在指定數(shù)據(jù)庫(kù)創(chuàng)建和修改用戶(hù)。 |
| userAdminAnyDatabase | 可以在指定數(shù)據(jù)庫(kù)創(chuàng)建和修改用戶(hù)(除了數(shù)據(jù)庫(kù)config和local之外)。 |
3.2.1.1 數(shù)據(jù)庫(kù)用戶(hù)角色
readread角色包含讀取所有非系統(tǒng)集合數(shù)據(jù)和訂閱部分系統(tǒng)集合(system.indexes、system.js、system.namespaces)的權(quán)限。
readWritereadWrite角色包含read角色的權(quán)限同時(shí)增加了對(duì)非系統(tǒng)集合數(shù)據(jù)的修改權(quán)限,但只對(duì)系統(tǒng)集合system.js有修改權(quán)限。
3.2.1.2 數(shù)據(jù)庫(kù)管理角色
dbAdmindbAdmin角色包含執(zhí)行某些管理任務(wù)(與schema相關(guān)、索引、收集統(tǒng)計(jì)信息)的權(quán)限,該角色不包含用戶(hù)和角色管理的權(quán)限。
dbOwnerdbOwner角色包含對(duì)數(shù)據(jù)所有的管理操作權(quán)限。即包含角色readWrite、dbAdmin和userAdmin的權(quán)限。 userAdminuserAdmin角色包含對(duì)當(dāng)前數(shù)據(jù)庫(kù)創(chuàng)建和修改角色和用戶(hù)的權(quán)限。該角色允許向其它任何用戶(hù)(包括自身)授予任何權(quán)限,所以這個(gè)角色也提供間接對(duì)超級(jí)用戶(hù)(root)的訪問(wèn)權(quán)限,如果限定在admin數(shù)據(jù)中,也包括集群管理的權(quán)限。
3.2.1.3 集群管理角色
clusterManagerclusterManager角色包含對(duì)集群監(jiān)控和管理操作的權(quán)限。擁有此角色的用戶(hù)能夠訪問(wèn)集群中的config數(shù)據(jù)庫(kù)和local數(shù)據(jù)庫(kù)。
clusterMonitorclusterMonitor角色包含針對(duì)監(jiān)控工具具有只讀操作的權(quán)限。如工具M(jìn)ongoDB Cloud Manager和工具Ops Manager。
對(duì)于整個(gè)集群該角色包含命令操作:checkFreeMonitoringStatus(4.0新增)、connPoolStats、getCmdLineOpts、getLog、getParameter、getShardMap、hostInfo、inprog、listDatabases、listSessions (3.6新增)、listShards、netstat、replSetGetConfig、replSetGetStatus、serverStatus、setFreeMonitoring (4.0新增)、shardingState、top。
對(duì)于集群中所有的數(shù)據(jù)為包含命令操作:collStats、dbStats、getShardVersion、indexStats、useUUID(3.6新增)。
對(duì)于集群中config數(shù)據(jù)庫(kù)和local數(shù)據(jù)庫(kù)包含的命令操作可以參考官方文檔:https://docs.mongodb.com/manual/reference/built-in-roles/#clusterMonitor。
hostManagerhostManager角色包含針對(duì)數(shù)據(jù)庫(kù)服務(wù)器的監(jiān)控和管理操作權(quán)限。
對(duì)于整個(gè)集群該角色包含命令操作:applicationMessage、closeAllDatabases、connPoolSync、cpuProfiler、flushRouterConfig、fsync、invalidateUserCache、killAnyCursor (4.0新增)、killAnySession (3.6新增)、killop、logRotate、resync、setParameter、shutdown、touch、unlock。
clusterAdminclusterAdmin角色包含MongoDB集群管理最高的操作權(quán)限。該角色包含clusterManager、clusterMonitor和hostManager三個(gè)角色的所有權(quán)限,并且還擁有dropDatabase操作命令的權(quán)限。
3.2.1.4 備份恢復(fù)角色
backupbackup角色包含備份MongoDB數(shù)據(jù)最小的權(quán)限。
對(duì)于集群中的所有非系統(tǒng)集合,包括自身的config數(shù)據(jù)庫(kù)和local數(shù)據(jù)庫(kù); 對(duì)于集群中的系統(tǒng)集合:system.indexes、system.namespaces、system.js和system.profile; admin數(shù)據(jù)庫(kù)中的集合:admin.system.users和admin.system.roles; config.settings集合; 2.6版本之前的system.users集合。對(duì)于config.setting集合還有insert和update操作權(quán)限。
restorerestore角色包含從備份文件中還原恢復(fù)MongoDB數(shù)據(jù)(除了system.profile集合)的權(quán)限。
如果備份中包含system.profile集合而恢復(fù)目標(biāo)數(shù)據(jù)庫(kù)沒(méi)有system.profile集合,mongorestore會(huì)嘗試重建該集合。因此執(zhí)行用戶(hù)需要有額外針對(duì)system.profile集合的createCollection和convertToCapped操作權(quán)限; 如果執(zhí)行mongorestore命令時(shí)指定選項(xiàng)--oplogReplay,則restore角色包含的權(quán)限無(wú)法進(jìn)行重放oplog。如果需要進(jìn)行重放oplog,則需要只對(duì)執(zhí)行mongorestore的用戶(hù)授予包含對(duì)實(shí)例中任何資源具有任何權(quán)限的自定義角色。對(duì)于整個(gè)集群包含命令操作:getParameter。
3.2.1.5 所有數(shù)據(jù)庫(kù)角色
以下角色只存在于admin數(shù)據(jù)庫(kù),并且適用于除了config和local之外所有的數(shù)據(jù)庫(kù)。
readAnyDatabasereadAnyDatabase角色包含對(duì)除了config和local之外所有數(shù)據(jù)庫(kù)的只讀權(quán)限。同時(shí)對(duì)于整個(gè)集群包含listDatabases命令操作。
在MongoDB3.4版本之前,該角色包含對(duì)config和local數(shù)據(jù)庫(kù)的讀取權(quán)限。當(dāng)前版本如果需要對(duì)這兩個(gè)數(shù)據(jù)庫(kù)進(jìn)行讀取,則需要在admin數(shù)據(jù)庫(kù)授予用戶(hù)對(duì)這兩個(gè)數(shù)據(jù)庫(kù)的read角色。
readWriteAnyDatabasereadWriteAnyDatabase角色包含對(duì)除了config和local之外所有數(shù)據(jù)庫(kù)的讀寫(xiě)權(quán)限。同時(shí)對(duì)于整個(gè)集群包含listDatabases命令操作。
在MongoDB3.4版本之前,該角色包含對(duì)config和local數(shù)據(jù)庫(kù)的讀寫(xiě)權(quán)限。當(dāng)前版本如果需要對(duì)這兩個(gè)數(shù)據(jù)庫(kù)進(jìn)行讀寫(xiě),則需要在admin數(shù)據(jù)庫(kù)授予用戶(hù)對(duì)這兩個(gè)數(shù)據(jù)庫(kù)的readWrite角色。
userAdminAnyDatabaseuserAdminAnyDatabase角色包含類(lèi)似于userAdmin角色對(duì)于所有數(shù)據(jù)庫(kù)的用戶(hù)管理權(quán)限,除了config數(shù)據(jù)庫(kù)和local數(shù)據(jù)庫(kù)。
對(duì)于集群包含命令操作:authSchemaUpgrade、invalidateUserCache、listDatabases。
對(duì)于系統(tǒng)集合admin.system.users和admin.system.roles包含命令操作:collStats、dbHash、dbStats、find、killCursors、planCacheRead、createIndex、dropIndex。
該角色不會(huì)限制用戶(hù)授予權(quán)限的操作,因此,擁有角色的用戶(hù)也有可能授予超過(guò)角色范圍內(nèi)的權(quán)限給自己或其它用戶(hù),也可以使自己成為超級(jí)用戶(hù),userAdminAnyDatabase角色也可以認(rèn)為是MongoDB中的超級(jí)用戶(hù)角色。
dbAdminAnyDatabasedbAdminAnyDatabase角色包含類(lèi)似于dbAdmin角色對(duì)于所有數(shù)據(jù)庫(kù)管理權(quán)限,除了config數(shù)據(jù)庫(kù)和local數(shù)據(jù)庫(kù)。同時(shí)對(duì)于整個(gè)集群包含listDatabases命令操作。
在MongoDB3.4版本之前,該角色包含對(duì)config和local數(shù)據(jù)庫(kù)的管理權(quán)限。當(dāng)前版本如果需要對(duì)這兩個(gè)數(shù)據(jù)庫(kù)進(jìn)行管理,則需要在admin數(shù)據(jù)庫(kù)授予用戶(hù)對(duì)這兩個(gè)數(shù)據(jù)庫(kù)的dbAdmin角色。
3.2.1.6 超級(jí)用戶(hù)角色
dbOwner角色(作用范圍為admin數(shù)據(jù)庫(kù)) userAdmin角色(作用范圍為admin數(shù)據(jù)庫(kù)) userAdminAnyDatabase角色 以下角色包含數(shù)據(jù)庫(kù)所有資源的所有操作權(quán)限。 rootroot角色包含角色readWriteAnyDatabase、dbAdminAnyDatabase、userAdminAnyDatabase、clusterAdmin、restore和backup聯(lián)合之后所有的權(quán)限。
3.2.1.7 內(nèi)部角色
__system
3.2.2 用戶(hù)自定義角色
3.3 權(quán)限
資源(resource)包括:數(shù)據(jù)庫(kù)、集合、部分集合和集群; 操作(action)包括:對(duì)資源進(jìn)行的增、刪、改、查(CRUD)操作。在角色定義時(shí)可以包含一個(gè)或多個(gè)已存在的角色,新創(chuàng)建的角色會(huì)繼承包含的角色所有的權(quán)限。在同一個(gè)數(shù)據(jù)庫(kù)中,新創(chuàng)建角色可以繼承其他角色的權(quán)限,在admin數(shù)據(jù)庫(kù)中創(chuàng)建的角色可以繼承在其它任意數(shù)據(jù)庫(kù)中角色的權(quán)限。
//進(jìn)入mongo指令平臺(tái)
mongo
// 查詢(xún)當(dāng)前數(shù)據(jù)庫(kù)中的角色權(quán)限
> db.runCommand({ rolesInfo: "<rolename>" })
// 查詢(xún)其它數(shù)據(jù)庫(kù)中指定的角色權(quán)限
> db.runCommand({ rolesInfo: { role: "<rolename>", db: "<database>" } }
// 查詢(xún)多個(gè)角色權(quán)限
> db.runCommand(
{
rolesInfo: [
"<rolename>",
{ role: "<rolename>", db: "<database>" },
...
]
}
)
// 查詢(xún)所有角色權(quán)限(僅用戶(hù)自定義角色)
> db.runCommand({ rolesInfo: 1 })
// 查詢(xún)所有角色權(quán)限(包含內(nèi)置角色)
> db.runCommand({ rolesInfo: 1, showBuiltinRoles: true })
四、賬號(hào)密碼設(shè)置
4.1 創(chuàng)建所有數(shù)據(jù)庫(kù)管理員用戶(hù)密碼認(rèn)證
//進(jìn)入mongo語(yǔ)法環(huán)境
mongo
//查詢(xún)當(dāng)前數(shù)據(jù)庫(kù)
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
// 進(jìn)入admin數(shù)據(jù)庫(kù)
> use admin
switched to db admin
// 添加管理員用戶(hù)(用戶(hù)名admin 和 密碼123456 是可以自定義的 【但是要記牢哦!!】)
db.createUser({
user:"admin",
pwd:"123456",
roles:["root"] // 角色root是超級(jí)管理員
})
4.2 創(chuàng)建單個(gè)數(shù)據(jù)庫(kù)設(shè)置用戶(hù)密碼認(rèn)證
// 給myweb數(shù)據(jù)庫(kù) 創(chuàng)建一個(gè)名為:mupiao 的賬戶(hù),角色為:dbOwner
db.createUser({
user:"kuaizhidao",
pwd: "123456",
roles: [{
role: "dbOwner",
db: "kuaizhidao"
}]
