簡介
授權是用戶管理和存取控制的重要組成部分,它定義了每個用戶在系統上被允許執行的操作策略。決定適當的策略並在資料庫中實施它們,可確保用戶可以與他們需要的資源互動,同時防止不當行為。
在本指南中,我們將介紹授權在 MongoDB 中的運作方式。我們將了解 MongoDB 如何概念化存取管理、可以授予用戶哪些類型的權限,以及如何將策略附加到用戶帳戶。
如果您正在使用 MongoDB,請查看 Prisma 的MongoDB 連接器!您可以使用 Prisma Client 來自信地管理生產環境 MongoDB 資料庫。
若要開始使用 MongoDB 和 Prisma,請查看我們的從頭開始入門指南,或如何新增至現有專案。
先決條件
若要跟著本指南操作,您需要一個具有適當權限的 MongoDB 伺服器帳戶。
若要調整 MongoDB 的組態並在資料庫上啟用授權,您需要在伺服器上具有 root
層級的存取權限。
此外,在 MongoDB 內,您需要一個至少具有 userAdmin
角色的帳戶,以便可以設定基於角色的授權策略。包含 userAdmin
角色的角色,從最狹隘的焦點到最廣泛的權限層級依序為
userAdmin
dbOwner
userAdminAnyDatabase
root
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 | 集合 | 讓使用者在 4.2 之前的 MongoDB 版本中終止自己的游標 |
killAnyCursor | 集合 | 讓使用者終止其他使用者的游標 |
revokeRole | 資料庫 | 允許使用者從系統中的任何使用者移除角色 |
setAuthenticationRestriction | 資料庫 | 允許使用者設定使用者和角色的身份驗證需求 |
unlock | 叢集 | 讓使用者減少叢集上的寫入鎖定數量 |
viewRole | 資料庫 | 允許檢視資料庫中角色的詳細資訊 |
viewUser | 資料庫 | 允許檢視資料庫中使用者的詳細資訊 |
authSchemaUpgrade | 叢集 | 允許使用者升級 MongoDB 版本之間的身份驗證機制 |
cleanupOrphaned | 叢集 | 讓使用者在 4.4 之前的 MongoDB 版本中清理孤立文件 |
cpuProfiler | 叢集 | 允許使用者啟用 CPU 分析 |
inprog | 叢集 | 讓使用者檢視其他使用者正在進行或排隊操作的資訊 |
invalidateUserCache | 叢集 | 讓使用者手動從快取中刷新使用者詳細資訊 |
killop | 叢集 | 允許使用者終止其他使用者的操作 |
planCacheRead | 資料庫或集合 | 讓使用者檢視有關快取查詢計畫的資訊 |
planCacheWrite | 資料庫或集合 | 允許使用者刪除快取查詢計畫 |
storageDetails | 資料庫或集合 | 已棄用 |
changeStream | 集合、資料庫或叢集 | 允許使用者從非系統集合存取即時變更資料 |
appendOpLogNote | 叢集 | 讓使用者將附註新增至 oplog |
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
:提供對非系統集合的讀取權限- 動作
changeStream
collStats
dbHash
dbStats
find
killCursors
listIndexes
listCollections
- 動作
readWrite
:提供對非系統集合的讀取和寫入權限- 動作
collStats
convertToCapped
createCollection
dbHash
dbStats
dropCollection
createIndex
dropIndex
find
insert
killCursors
listIndexes
listCollections
remove
renameCollectionSameDB
update
- 動作
dbAdmin
:提供資料庫層級管理任務的存取權限,但不包括角色和使用者管理system.profile
集合內的動作changeStream
collStats
convertToCapped
createCollection
dbHash
dbStats
dropCollection
find
killCursors
listCollections
listIndexes
planCacheRead
- 非系統集合中的動作
bypassDocumentValidation
collMod
collStats
compact
convertToCapped
createCollection
createIndex
dbStats
dropCollection
dropDatabase
dropIndex
enableProfiler
listCollections
listIndexes
planCacheIndexFilter
planCacheRead
planCacheWrite
reIndex
renameCollectionSameDB
storageDetails
validate
userAdmin
:提供建立和修改使用者與角色的存取權限- 動作
changeCustomData
changePassword
createRole
createUser
dropRole
dropUser
grantRole
revokeRole
setAuthenticationRestriction
viewRole
viewUser
- 動作
dbOwner
:提供資料庫的管理存取權限,包括角色和使用者管理- 此角色繼承的角色
readWrite
dbAdmin
userAdmin
- 此角色繼承的角色
clusterMonitor
:提供對叢集的讀取權限- 整個叢集的動作
checkFreeMonitoringStatus
connPoolStats
getCmdLineOpts
getDefaultRWConcern
getLog
getParameter
getShardMap
hostInfo
inprog
listDatabases
listSessions
listShards
netstat
replSetGetConfig
replSetGetStatus
serverStatus
setFreeMonitoring
shardingState
top
- 叢集中所有資料庫的動作
collStats
dbStats
getShardVersion
indexStats
useUUID
- 所有
system.profile
集合的動作find
config
資料庫中非系統集合的動作collStats
dbHash
dbStats
find
getShardVersion
indexStats
killCursors
listCollections
listIndexes
planCacheRead
config
資料庫中system.js
集合的動作collStats
dbHash
dbStats
find
killCursors
listCollections
listIndexes
planCacheRead
local
資料庫中所有集合的動作collStats
dbHash
dbStats
find
getShardVersion
indexStats
killCursors
listCollections
listIndexes
planCacheRead
local
資料庫中system.js
集合的動作collStats
dbHash
dbStats
find
killCursors
listCollections
listIndexes
planCacheRead
local
資料庫中system.replset
和system.profile
集合的動作find
- 整個叢集的動作
clusterManager
:透過config
和local
資料庫提供叢集的監控和管理存取權限- 整個叢集的動作
addShard
appendOplogNote
applicationMessage
cleanupOrphaned
flushRouterConfig
getDefaultRWConcern
listSessions
listShards
removeShard
replSetConfigure
replSetGetConfig
replSetGetStatus
replSetStateChange
resync
setDefaultRWConcern
setFeatureCompatibilityVersion
setFreeMonitoring
- 叢集中所有資料庫的動作
clearJumboFlag
enableSharding
refineCollectionShardKey
moveChunk
splitChunk
splitVector
config
資料庫中非系統集合的動作collStats
dbHash
dbStats
enableSharding
find
insert
killCursors
listCollections
listIndexes
moveChunk
planCacheRead
remove
splitChunk
splitVector
update
config
資料庫中system.js
集合的動作collStats
dbHash
dbStats
find
killCursors
listCollections
listIndexes
planCacheRead
local
資料庫中所有非系統集合的動作enableSharding
insert
moveChunk
remove
splitChunk
splitVector
update
local
資料庫中system.replset
集合的動作collStats
dbHash
dbStats
find
killCursors
listCollections
listIndexes
planCacheRead
- 整個叢集的動作
hostManager
:提供監控和管理伺服器的能力。- 整個叢集的動作
applicationMessage
closeAllDatabases
connPoolSync
flushRouterConfig
fsync
invalidateUserCache
killAnyCursor
KillAnySession
killop
logRotate
resync
setParameter
shutdown
touch
unlock
- 整個叢集的動作
clusterAdmin
:提供所有叢集管理存取權限- 此角色繼承的角色
clusterManager
clusterMonitor
hostManager
- 其他動作
dropDatabase
- 此角色繼承的角色
backup
:提供備份資料所需的權限- 所有資源的動作
listDatabases
listCollections
listIndexes
- 整個叢集的動作
appendOplogNote
getParameter
listDatabases
serverStatus
- 非系統集合、
system.js
和system.profile
集合、admin.system.users
和admin.system.roles
集合,以及config.settings
集合的動作find
config.settings
集合的動作insert
update
- 所有資源的動作
restore
:提供將資料還原到叢集的權限- 整個叢集的動作
getParameter
- 非系統集合的動作
bypassDocumentValidation
changeCustomData
changePassword
collMod
convertToCapped
createCollection
createIndex
createRole
createUser
dropCollection
dropRole
dropUser
grantRole
insert
revokeRole
viewRole
viewUser
system.js
集合的動作bypassDocumentValidation
collMod
createCollection
createIndex
dropCollection
insert
- 任何資源的動作
listCollections
config
和local
資料庫中非系統集合的動作bypassDocumentValidation
collMod
createCollection
createIndex
dropCollection
insert
admin.system.version
集合的動作bypassDocumentValidation
collMod
createCollection
createIndex
dropCollection
find
insert
admin.system.roles
集合的動作createIndex
admin.system.users
集合的動作bypassDocumentValidation
collMod
createCollection
createIndex
dropCollection
find
insert
remove
update
- 整個叢集的動作
readAnyDatabase
:提供與read
相同的權限給所有資料庫,除了local
和config
之外- 整個叢集的其他動作
listDatabases
- 整個叢集的其他動作
readWriteAnyDatabase
:提供與readWrite
相同的權限給所有資料庫,除了local
和config
之外- 整個叢集的其他動作
listDatabases
- 整個叢集的其他動作
userAdminAnyDatabase
:提供與userAdmin
相同的權限給所有資料庫,除了local
和config
之外。- 整個叢集的其他動作
authSchemaUpgrade
invalidateUserCache
listDatabases
admin
資料庫中system.users
和system.roles
叢集的其他動作collStats
dbHash
dbStats
find
killCursors
planCacheRead
- 整個叢集的其他動作
dbAdminAnyDatabase
:提供與dbAdmin
相同的權限給所有資料庫,除了local
和config
之外。- 整個叢集的其他動作
listDatabases
- 整個叢集的其他動作
root
:提供對整個系統的完整存取權限。- 此角色繼承的角色
readWriteAnyDatabase
dbAdminAnyDatabase
userAdminAnyDatabase
clusterAdmin
restore
backup
system
集合的其他動作validate
- 此角色繼承的角色
如何在 MongoDB 中啟用授權
在 MongoDB 可以使用授權來管理使用者權限之前,您必須在伺服器或叢集上啟用此功能。若要執行此操作,您必須使用 root
或其他管理員權限登入伺服器。
注意:在啟用授權之前,請仔細檢查以確保您至少可以存取一個具有管理角色所需權限的角色。
透過以管理員身分在文字編輯器中開啟 /etc/mongod.conf
檔案來修改 MongoDB 伺服器的組態。此命令將使用 EDITOR
環境變數中定義的文字編輯器開啟檔案,並回退到幾乎所有系統上都可用的 vi
sudo ${EDITOR:-vi} /etc/mongod.conf
MongoDB 組態檔使用 YAML 序列化格式來定義組態。取消註解或將 security:
區段鍵新增至檔案。在此鍵下方,使用空格縮排一行(YAML 中不允許使用 Tab 鍵),並將 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
角色使用 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
角色提供對以下角色組合的所有操作和資源的存取權:
readWriteAnyDatabase
dbAdminAnyDatabase
userAdminAnyDatabase
clusterAdmin
restore
backup
MongoDB 採用 RBAC 來管理對 MongoDB 系統的存取。RBAC 是一種安全策略,它根據使用者被指派的角色來限制允許使用者的操作。
如果使用者沒有被指派角色,MongoDB 不允許操作或存取資料庫。