簡介
授權是使用者管理和訪問控制的重要組成部分,它定義了每個使用者被允許在系統上執行哪些操作的策略。決定適當的策略並在資料庫中實施這些策略,可以確保使用者能夠與他們所需的資源進行互動,同時防止不當行為。
在本指南中,我們將介紹 MongoDB 中的授權工作原理。我們將瞭解 MongoDB 如何概念化訪問管理、可以授予使用者哪些型別的許可權以及如何將策略附加到使用者帳戶。
如果您正在使用 MongoDB,請檢視 Prisma 的 MongoDB 聯結器!您可以使用 Prisma Client 自信地管理生產環境中的 MongoDB 資料庫。
要開始使用 MongoDB 和 Prisma,請檢視我們的從零開始入門指南或如何新增到現有專案。
先決條件
要跟隨本指南,您需要一個擁有適當許可權的 MongoDB 伺服器帳戶。
要調整 MongoDB 的配置並啟用資料庫授權,您需要伺服器的 root 級別訪問許可權。
此外,在 MongoDB 內部,您需要一個至少擁有 userAdmin 角色的帳戶,以便可以設定基於角色的授權策略。包含 userAdmin 角色的角色,從最窄的焦點到最廣泛的許可權級別列出如下:
userAdmindbOwneruserAdminAnyDatabaseroot
MongoDB 中的授權如何工作?
MongoDB 中的授權和許可權管理是使用基於角色的訪問控制(RBAC)實現的。在此係統中,不同級別的訪問許可權與單個角色相關聯。要授予使用者執行某個操作的許可權,您可以授予他們擁有適當許可權的角色的成員身份。
MongoDB 中的角色可以巢狀。這意味著角色可以授予其他角色。包含另一個角色的角色會繼承子角色的所有許可權。這使得透過適當組合角色來建立具有所需許可權的新角色成為可能。
許可權本身由操作和資源的組合定義。操作元件描述了許可權允許的行為型別,而資源指示了操作的目標或範圍。
MongoDB 中有哪些可用資源?
在 MongoDB 的訪問控制模型中,操作的目標或範圍被稱為“資源”。每個操作只能應用於特定型別的資源。配置許可權時,您需要指定該許可權應該作用於的確切資源。
我們可以按從最窄焦點到最廣焦點的順序列出可用資源。
許可權最窄的定義是將其作用於叢集中特定資料庫內的特定集合。在同一個資料庫中,不同的集合可以指定不同的許可權。這允許您為不同型別的資料實施精細策略。
您可以對其執行策略的下一個最大資源是資料庫。在資料庫級別管理許可權允許您提供影響整個資料庫及其所有集合的通用策略。
您還可以設定適用於所有資料庫中同名集合的策略。這允許您使用命名約定來為整個系統中的特定集合實施訪問控制。更廣泛的版本是將策略應用於系統上的所有資料庫和非系統集合。
最後,您可以對整個叢集應用策略。針對叢集的操作會影響通用系統,而不是直接管理的資料。叢集級別的策略通常側重於管理操作。
MongoDB 中有哪些可用操作?
MongoDB 中有大量的操作可用,這些操作與通用使用、資料庫管理和系統管理有關。通常,操作對應於 MongoDB 中的一個或多個命令或方法。
要檢視 MongoDB 中可用的操作及其功能列表,請展開以下部分:
| 操作 | 範圍 | 描述 |
|---|---|---|
find | 資料庫或集合 | 允許對資料庫執行讀取操作 |
insert | 資料庫或集合 | 允許對資料庫執行寫入操作 |
remove | 資料庫或集合 | 允許對資料庫執行刪除操作 |
update | 資料庫或集合 | 允許對資料庫執行替換操作 |
bypassDocumentValidation | 資料庫或集合 | 允許使用者忽略文件的資料驗證策略。 |
useUUID | 叢集 | 允許使用者使用 UUID 值查詢文件 |
changeCustomData | 資料庫 | 使用者可以修改資料庫中任何使用者關聯的自定義資料 |
changeOwnCustomData | 資料庫 | 允許使用者更改與其自身使用者關聯的自定義資料 |
changeOwnPassword | 資料庫 | 允許使用者更改自己的帳戶密碼 |
changePassword | 資料庫 | 允許使用者更改資料庫中任何使用者的密碼 |
createCollection | 資料庫或集合 | 允許使用者在資料庫中建立集合 |
createIndex | 資料庫或集合 | 允許使用者為資料庫建立索引 |
createRole | 資料庫 | 允許使用者在資料庫中建立自定義角色 |
createUser | 資料庫 | 允許使用者定義新使用者帳戶 |
dropCollection | 資料庫或集合 | 允許使用者刪除集合 |
dropRole | 資料庫 | 允許使用者刪除角色 |
dropUser | 資料庫 | 允許使用者刪除使用者 |
enableProfiler | 資料庫 | 允許使用者啟用效能分析 |
grantRole | 資料庫 | 允許使用者將與資料庫關聯的角色授予系統上的任何使用者 |
killCursors | 集合 | 在 MongoDB 4.2 之前的版本中,允許使用者終止自己的遊標 |
killAnyCursor | 集合 | 允許使用者終止其他使用者的遊標 |
revokeRole | 資料庫 | 允許使用者從系統中的任何使用者移除角色 |
setAuthenticationRestriction | 資料庫 | 允許使用者為使用者和角色設定認證要求 |
unlock | 叢集 | 允許使用者減少叢集上的寫入鎖數量 |
viewRole | 資料庫 | 允許檢視資料庫中角色的詳細資訊 |
viewUser | 資料庫 | 允許檢視資料庫中使用者的詳細資訊 |
authSchemaUpgrade | 叢集 | 允許使用者在 MongoDB 版本之間升級認證機制 |
cleanupOrphaned | 叢集 | 允許使用者在 MongoDB 4.4 之前的版本中清理孤立文件 |
cpuProfiler | 叢集 | 允許使用者啟用 CPU 分析 |
inprog | 叢集 | 允許使用者檢視其他使用者正在進行或排隊的操作資訊 |
invalidateUserCache | 叢集 | 允許使用者手動從快取中重新整理使用者詳細資訊 |
killop | 叢集 | 允許使用者終止其他使用者的操作 |
planCacheRead | 資料庫或集合 | 允許使用者檢視有關快取查詢計劃的資訊 |
planCacheWrite | 資料庫或集合 | 允許使用者刪除快取的查詢計劃 |
storageDetails | 資料庫或集合 | 已棄用 |
changeStream | 集合、資料庫或叢集 | 允許使用者從非系統集合訪問即時變更資料 |
appendOpLogNote | 叢集 | 允許使用者向操作日誌新增備註 |
replSetConfigure | 叢集 | 允許配置副本集 |
replSetGetConfig | 叢集 | 允許使用者檢視當前副本集配置 |
replSetGetStatus | 叢集 | 允許使用者查詢副本集的當前狀態 |
replSetHeartbeat | 叢集 | 已棄用 |
replSetStateChange | 叢集 | 允許使用者管理叢集副本集的狀態 |
resync | 叢集 | 已棄用 |
addShard | 叢集 | 允許使用者向分片叢集新增分片副本 |
clearJumboFlag | 資料庫或集合 | 允許使用者清理分片中超大塊 |
enableSharding | 叢集、資料庫或集合 | 允許使用者在叢集和資料庫上啟用分片,或在叢集級別管理分片 |
refineCollectionShardKey | 資料庫或集合 | 允許使用者向現有分片鍵新增額外欄位 |
flushRouterConfig | 叢集 | 允許使用者將快取的路由表標記為已過時 |
getShardVersion | 資料庫 | 內部命令 |
listShards | 叢集 | 允許使用者檢視叢集的已配置分片列表 |
moveChunk | 資料庫或集合 | 允許使用者將資料塊移動到新分片 |
removeShard | 叢集 | 允許使用者從分片中抽走資料塊,然後從叢集中移除該分片 |
shardingState | 叢集 | 允許使用者檢視 MongoDB 伺服器是否是分片叢集的一部分 |
splitChunk | 資料庫或集合 | 允許使用者在分片中合併或拆分資料塊 |
splitVector | 資料庫或集合 | 內部命令 |
applicationMessage | 叢集 | 允許使用者向審計日誌新增自定義訊息 |
closeAllDatabases | 叢集 | 已棄用 |
collMod | 資料庫或集合 | 允許使用者修改與集合關聯的選項 |
compact | 資料庫或集合 | 允許使用者對集合中的資料和索引進行碎片整理 |
connPoolSync | 叢集 | 內部命令 |
convertToCapped | 資料庫或集合 | 允許使用者將集合轉換為具有固定最大大小的封頂集合 |
dropConnections | 叢集 | 允許使用者從 MongoDB 刪除到指定主機的出站連線 |
dropDatabase | 資料庫 | 允許使用者刪除當前資料庫 |
dropIndex | 資料庫或集合 | 允許使用者刪除索引 |
forceUUID | 叢集 | 允許使用者使用全域性唯一 UUID 定義集合 |
fsync | 叢集 | 允許使用者將所有待寫入重新整理到儲存並鎖定叢集以進行寫入 |
getDefaultRWConcern | 叢集 | 允許使用者檢視預設的讀寫一致性和隔離設定 |
getParameter | 叢集 | 允許使用者查詢引數的值 |
hostInfo | 叢集 | 允許使用者檢視執行 MongoDB 例項的伺服器資訊 |
logRotate | 叢集 | 允許使用者觸發日誌輪換 |
reIndex | 資料庫或集合 | 允許使用者重建集合的索引 |
renameCollectionSameDB | 資料庫 | 允許使用者重新命名當前資料庫中的集合 |
setDefaultRWConcern | 叢集 | 允許使用者指定預設的讀寫一致性和隔離設定 |
setParameter | 叢集 | 允許使用者定義引數的值 |
shutdown | 叢集 | 允許使用者關閉 MongoDB 例項 |
touch | 叢集 | 已棄用 |
impersonate | 叢集 | 允許使用者終止與其他使用者和角色關聯的會話 |
listSessions | 叢集 | 允許使用者列出所有使用者的所有會話 |
killAnySession | 叢集 | 允許使用者終止特定使用者或模式的所有會話 |
checkFreeMonitoringStatus | 叢集 | 允許使用者檢視雲監控功能的當前狀態 |
setFreeMonitoring | 叢集 | 允許使用者啟用或停用雲監控功能 |
collStats | 資料庫或集合 | 允許使用者檢視有關集合的統計資訊 |
connPoolStats | 叢集 | 允許使用者檢視 MongoDB 例項出站連線的狀態 |
dbHash | 資料庫或集合 | 允許使用者查詢資料庫中集合的雜湊值 |
dbStats | 資料庫 | 允許使用者檢視儲存統計資訊 |
getCmdLineOpts | 叢集 | 允許使用者檢視用於啟動 MongoDB 例項的命令列選項 |
getLog | 叢集 | 允許使用者檢視最新的 MongoDB 事件 |
listDatabases | 叢集 | 允許使用者檢視所有資料庫的列表 |
listCollections | 資料庫 | 允許使用者檢視資料庫中的集合和檢視列表 |
listIndexes | 資料庫或集合 | 允許使用者檢視與特定集合關聯的索引 |
netstat | 叢集 | 內部命令 |
serverStatus | 叢集 | 允許使用者檢視資料庫當前狀態的資訊 |
validate | 資料庫或集合 | 允許使用者檢查集合資料和索引的正確性 |
top | 叢集 | 允許使用者檢視集合的使用統計資訊 |
MongoDB 預設有哪些可用角色?
MongoDB 包含許多有用的角色,它們將相似的許可權組合在一起。這些角色允許您以簡潔的方式授予和撤銷對資料庫資源的許可權。
要檢視 MongoDB 中可用的操作及其功能列表,請展開以下部分:
read:提供對非系統集合的讀取訪問許可權- 操作
changeStreamcollStatsdbHashdbStatsfindkillCursorslistIndexeslistCollections
- 操作
readWrite:提供對非系統集合的讀寫訪問許可權- 操作
collStatsconvertToCappedcreateCollectiondbHashdbStatsdropCollectioncreateIndexdropIndexfindinsertkillCursorslistIndexeslistCollectionsremoverenameCollectionSameDBupdate
- 操作
dbAdmin:提供資料庫級別的管理任務訪問許可權,不包括角色和使用者管理system.profile集合中的操作changeStreamcollStatsconvertToCappedcreateCollectiondbHashdbStatsdropCollectionfindkillCursorslistCollectionslistIndexesplanCacheRead
- 非系統集合中的操作
bypassDocumentValidationcollModcollStatscompactconvertToCappedcreateCollectioncreateIndexdbStatsdropCollectiondropDatabasedropIndexenableProfilerlistCollectionslistIndexesplanCacheIndexFilterplanCacheReadplanCacheWritereIndexrenameCollectionSameDBstorageDetailsvalidate
userAdmin:提供建立和修改使用者及角色的訪問許可權- 操作
changeCustomDatachangePasswordcreateRolecreateUserdropRoledropUsergrantRolerevokeRolesetAuthenticationRestrictionviewRoleviewUser
- 操作
dbOwner:提供資料庫的管理訪問許可權,包括角色和使用者管理- 此角色繼承的角色
readWritedbAdminuserAdmin
- 此角色繼承的角色
clusterMonitor:提供對叢集的只讀訪問許可權- 整個叢集的操作
checkFreeMonitoringStatusconnPoolStatsgetCmdLineOptsgetDefaultRWConcerngetLoggetParametergetShardMaphostInfoinproglistDatabaseslistSessionslistShardsnetstatreplSetGetConfigreplSetGetStatusserverStatussetFreeMonitoringshardingStatetop
- 叢集內所有資料庫的操作
collStatsdbStatsgetShardVersionindexStatsuseUUID
- 所有
system.profile集合的操作find
config資料庫中非系統集合的操作collStatsdbHashdbStatsfindgetShardVersionindexStatskillCursorslistCollectionslistIndexesplanCacheRead
config資料庫中system.js集合的操作collStatsdbHashdbStatsfindkillCursorslistCollectionslistIndexesplanCacheRead
local資料庫中所有集合的操作collStatsdbHashdbStatsfindgetShardVersionindexStatskillCursorslistCollectionslistIndexesplanCacheRead
local資料庫中system.js集合的操作collStatsdbHashdbStatsfindkillCursorslistCollectionslistIndexesplanCacheRead
local資料庫中system.replset和system.profile集合的操作find
- 整個叢集的操作
clusterManager:透過config和local資料庫提供對叢集的監控和管理訪問- 整個叢集的操作
addShardappendOplogNoteapplicationMessagecleanupOrphanedflushRouterConfiggetDefaultRWConcernlistSessionslistShardsremoveShardreplSetConfigurereplSetGetConfigreplSetGetStatusreplSetStateChangeresyncsetDefaultRWConcernsetFeatureCompatibilityVersionsetFreeMonitoring
- 叢集內所有資料庫的操作
clearJumboFlagenableShardingrefineCollectionShardKeymoveChunksplitChunksplitVector
config資料庫中非系統集合的操作collStatsdbHashdbStatsenableShardingfindinsertkillCursorslistCollectionslistIndexesmoveChunkplanCacheReadremovesplitChunksplitVectorupdate
config資料庫中system.js集合的操作collStatsdbHashdbStatsfindkillCursorslistCollectionslistIndexesplanCacheRead
local資料庫中所有非系統集合的操作enableShardinginsertmoveChunkremovesplitChunksplitVectorupdate
local資料庫中system.replset集合的操作collStatsdbHashdbStatsfindkillCursorslistCollectionslistIndexesplanCacheRead
- 整個叢集的操作
hostManager:提供監控和管理伺服器的能力。- 整個叢集的操作
applicationMessagecloseAllDatabasesconnPoolSyncflushRouterConfigfsyncinvalidateUserCachekillAnyCursorKillAnySessionkilloplogRotateresyncsetParametershutdowntouchunlock
- 整個叢集的操作
clusterAdmin:提供所有叢集管理訪問許可權- 此角色繼承的角色
clusterManagerclusterMonitorhostManager
- 額外操作
dropDatabase
- 此角色繼承的角色
backup:提供備份資料所需的許可權- 所有資源的操作
listDatabaseslistCollectionslistIndexes
- 整個叢集的操作
appendOplogNotegetParameterlistDatabasesserverStatus
- 對非系統集合、
system.js和system.profile集合、admin.system.users和admin.system.roles集合以及config.settings集合的操作find
- 對
config.settings集合的操作insertupdate
- 所有資源的操作
restore:提供將資料恢復到叢集的許可權- 整個叢集的操作
getParameter
- 對非系統集合的操作
bypassDocumentValidationchangeCustomDatachangePasswordcollModconvertToCappedcreateCollectioncreateIndexcreateRolecreateUserdropCollectiondropRoledropUsergrantRoleinsertrevokeRoleviewRoleviewUser
- 對
system.js集合的操作bypassDocumentValidationcollModcreateCollectioncreateIndexdropCollectioninsert
- 對任何資源的操作
listCollections
- 對
config和local資料庫中非系統集合的操作bypassDocumentValidationcollModcreateCollectioncreateIndexdropCollectioninsert
- 對
admin.system.version集合的操作bypassDocumentValidationcollModcreateCollectioncreateIndexdropCollectionfindinsert
- 對
admin.system.roles集合的操作createIndex
- 對
admin.system.users集合的操作bypassDocumentValidationcollModcreateCollectioncreateIndexdropCollectionfindinsertremoveupdate
- 整個叢集的操作
readAnyDatabase:提供與read相同的許可權,適用於除local和config以外的所有資料庫- 整個叢集的額外操作
listDatabases
- 整個叢集的額外操作
readWriteAnyDatabase:提供與readWrite相同的許可權,適用於除local和config以外的所有資料庫- 整個叢集的額外操作
listDatabases
- 整個叢集的額外操作
userAdminAnyDatabase:提供與userAdmin相同的許可權,適用於除local和config以外的所有資料庫。- 整個叢集的額外操作
authSchemaUpgradeinvalidateUserCachelistDatabases
admin資料庫中system.users和system.roles叢集的額外操作collStatsdbHashdbStatsfindkillCursorsplanCacheRead
- 整個叢集的額外操作
dbAdminAnyDatabase:提供與dbAdmin相同的許可權,適用於除local和config以外的所有資料庫。- 整個叢集的額外操作
listDatabases
- 整個叢集的額外操作
root:提供對整個系統的完全訪問許可權。- 此角色繼承的角色
readWriteAnyDatabasedbAdminAnyDatabaseuserAdminAnyDatabaseclusterAdminrestorebackup
system集合的額外操作validate
- 此角色繼承的角色
如何在 MongoDB 中啟用授權
在 MongoDB 使用授權來管理使用者許可權之前,您必須在伺服器或叢集上啟用該功能。為此,您必須使用 root 或其他管理許可權登入到伺服器。
注意:在啟用授權之前,請仔細檢查以確保您至少擁有一個具有管理角色所需許可權的角色。
以管理員身份開啟 /etc/mongod.conf 檔案,修改 MongoDB 伺服器的配置。此命令將使用 EDITOR 環境變數中定義的文字編輯器開啟檔案,如果未定義則回退到 vi,vi 在幾乎所有系統上都可用。
sudo ${EDITOR:-vi} /etc/mongod.conf
MongoDB 配置檔案使用 YAML 序列化格式來定義配置。取消註釋或新增 security: 部分鍵到檔案中。在該鍵下方,使用空格縮排一行(YAML 中不允許使用製表符),並將 authorization 設定為 enabled。
. . .security:authorization: enabled. . .
完成後儲存並關閉檔案。
要啟用新設定,請重新啟動 MongoDB 伺服器程序。如果您的 MongoDB 伺服器執行在 Linux 主機上,操作如下:
sudo systemctl restart mongod.service
程序重新啟動後,MongoDB 的授權框架應已在資料庫中啟用。
檢視許可權和角色
在開始為使用者分配角色之前,最好先熟悉如何在系統中檢視有關許可權和角色的資訊。
要檢視系統上所有可用的角色,包括所有內建角色及其相關許可權,請使用 db.getRoles() 方法並將 showPrivileges 和 showBuiltinRoles 選項設定為 true。
db.getRoles({rolesInfo: 1,showPrivileges: true,showBuiltinRoles: true})
返回的列表將包含關於每個角色及其在系統各種資源上所擁有許可權的大量巢狀資訊。
要獲取特定角色的資訊,請改用 db.getRole() 方法。您必須在定義使用者的資料庫上才能執行此命令。
use admindb.getRole("root",{showPrivileges: true,showBuiltinRoles: true})
要檢查已授予每個使用者的角色,請切換到您感興趣的資料庫並使用 db.getUsers() 方法。
use admindb.getUsers()
要檢查與特定使用者關聯的角色,請改用 db.getUser()。
use admindb.getUser("root")
為使用者分配和撤銷角色
要授予使用者額外的許可權,您必須授予他們對現有角色的訪問許可權。
db.grantRolesToUser() 方法允許您指定要新增到使用者的額外角色。它的第一個引數是您希望授予額外許可權的使用者,第二個引數是您希望新增的額外角色陣列。
db.grantRolesToUser("sally",["read","backup"])
如果角色在當前資料庫中定義,您可以使用上述速記方式,只需按名稱指定角色而無需提及資料庫。
要授予與不同資料庫關聯的角色或更明確地指定,請將角色指定為定義 role 和 db 的文件。
db.grantRolesToUser("sally",[{ role: "read", db: "sales"},{ role: "readWrite", db: "callLogs"}])
要從使用者撤銷角色,您可以使用配套方法 db.revokeRolesFromUser()。引數語法完全相同,但這次命令將從指定帳戶中移除角色。
要刪除當前資料庫中定義的角色,您可以直接使用角色名稱,無需提及資料庫。
db.revokeRolesFromUser("sally",["read","backup"])
要指定與其他資料庫關聯的角色,請使用長格式,透過在文件中指定 role 和 db。
db.revokeRolesFromUser("sally",[{ role: "read", db: "sales"},{ role: "readWrite", db: "callLogs"}])
建立和管理自定義角色
有時,系統的內建角色無法完全匹配您需要分配的許可權型別。在這些情況下,您可以建立自己的自定義角色。
建立新角色
db.createRole() 方法允許您定義一個新角色,您可以為其分配許可權和其他角色。然後,您可以將新角色授予使用者,以賦予他們您定義的特定許可權。
db.createRole() 方法的基本語法涉及傳遞一個定義角色特徵的文件。該文件可以包含以下欄位:
role:您想為角色指定的名稱privileges:一個數組,包含您想分配給角色的鬆散許可權集。每個許可權都在一個巢狀文件中定義,該文件定義了一個resource文件(指定此許可權適用於哪些資源)以及一個正在授予的actions陣列。roles:此角色應繼承的附加角色陣列。新角色將獲得此處列出的任何角色所授予的所有許可權。authenticationRestrictions:一個數組,指定對角色認證的任何限制。這允許您在使用者未以角色批准的方式認證時拒絕其角色的許可權。
前三個欄位是建立每個新角色的必需欄位。
例如,我們來建立一個名為 salesMonitor 的角色,它提供對 sales 資料庫的只讀訪問許可權。
db.createRole({role: "salesMonitor",privileges: [],roles: [{role: "read",db: "sales"}],})
我們可以使用 privileges 欄位而不是 read 角色來表達一個類似(但更有限)的角色,方法是輸入:
db.createRole({role: "salesMonitor",privileges: [{resource: { db: "sales", collection: "" },actions: [ "find" ]}],roles: []})
檢視自定義角色資訊
和之前一樣,您可以使用 db.getRole() 方法獲取角色的資訊。
db.getRole("salesMonitor",{showPrivileges: true})
向自定義角色授予額外許可權
要向現有使用者定義的角色授予額外許可權,您可以使用 db.grantPrivilegesToRole() 方法。它接受一個許可權陣列,這些許可權由包含 resource 文件和 actions 陣列的文件定義,就像我們上面在 db.createRole() 中看到的那樣。
例如,要將 listCollections 許可權新增到 salesMonitor 角色,您可以輸入:
db.grantPrivilegesToRole("salesMonitor",[{resource: { db: "sales", collection: "" },actions: [ "listCollections" ]}])
從自定義角色撤銷許可權
如果您改變主意,可以使用 db.revokePrivilegesFromRole() 方法以相同的格式移除 listCollections 操作。
db.revokePrivilegesFromRole("salesMonitor",[{resource: { db: "sales", collection: "" },actions: [ "listCollections" ]}])
將角色授予自定義角色
要將某個角色定義的許可權新增到另一個角色,您可以使用 db.grantRolesToRole() 方法。該方法接受您要修改的角色以及您要新增到該角色的角色陣列作為引數。
要指定您最終希望 salesMonitor 角色使用 sales 資料庫上的 read 角色,您可以輸入:
db.grantRolesToRole("salesMonitor",["read"])
從自定義角色撤銷角色
如果您再次改變主意,可以使用 db.revokeRolesFromRole() 方法撤銷角色訪問許可權,該方法使用相同的引數語法。
db.revokeRolesFromRole("salesMonitor",["read"])
替換自定義角色的值
要重新定義使用者定義角色的特徵,您可以使用 db.updateRole() 命令。它的工作方式是替換它指定的欄位,而不是追加或截斷它們。因此,在發出命令時要小心,以免意外覆蓋重要資訊。
db.updateRole() 命令的語法包括將角色名稱作為第一個引數傳遞,將指定要替換的欄位的文件作為第二個引數傳遞。可以替換的欄位包括 privileges 陣列、roles 陣列和 authenticationRestrictions 陣列。這些欄位中至少一個必須包含在文件中。
例如,一旦我們最終決定 salesMonitor 角色使用 sales 資料庫上的 read 角色,我們可能希望重新定義角色的許可權和角色陣列,以清理我們實驗中留下的任何額外許可權。您可以透過使用要設定的新資訊更新角色來完成此操作。
db.updateRole("salesMonitor",{privileges: [],roles: [{role: "read",db: "sales"}]})
刪除使用者定義角色
您可以使用 db.dropRole() 方法刪除不必要的角色。
要刪除角色,只需將其名稱傳遞給方法即可。
db.dropRole()
該角色將從系統中移除,透過該角色授予使用者的任何許可權將不再可訪問。
結論
在本文中,我們深入探討了 MongoDB 如何實現訪問控制和許可權管理。我們瞭解了系統的概念基礎,查看了管理員可用的角色、操作和資源,然後學習瞭如何使用角色系統來配置整個系統的授權。
這些技能對於為使用者提供完成所需任務所需的資源訪問許可權,同時限制對系統不相關部分的暴露至關重要。學習如何定義和利用角色將增強您在管理 MongoDB 系統時提供細粒度訪問控制的能力。
如果您正在使用 MongoDB,請檢視 Prisma 的 MongoDB 聯結器!您可以使用 Prisma Client 自信地管理生產環境中的 MongoDB 資料庫。
要開始使用 MongoDB 和 Prisma,請檢視我們的從零開始入門指南或如何新增到現有專案。
常見問題解答
MongoDB 中有兩個用於只讀使用者的內建角色。使用者可以被分配到 read 角色或 readAnyDatabase 角色。
read 提供對所有非系統集合的讀取資料能力。
readAnyDatabase 提供與 read 相同的功能,不同之處在於它還提供在整個叢集上使用 listDatabases 操作的能力。
clusterMonitor 角色提供對監控工具的只讀訪問,例如 MongoDB Cloud Manager 和 Ops Manager 監控代理。
backup 角色提供備份資料所需的最小許可權。此角色提供足夠的許可權來使用 MongoDB Cloud 和 Ops Manager 備份代理。
它還擁有在 admin、settings 和 config 資料庫的備份集合上執行 insert 和 update 操作的許可權。
MongoDB 中的 root 角色提供對以下角色組合的所有操作和資源的訪問許可權:
readWriteAnyDatabasedbAdminAnyDatabaseuserAdminAnyDatabaseclusterAdminrestorebackup
MongoDB 採用 RBAC 來管理對 MongoDB 系統的訪問。RBAC 是一種安全策略,它根據使用者分配的角色來限制允許使用者執行的操作。
如果使用者沒有被分配角色,MongoDB 不允許對資料庫進行操作或訪問。
