分享到

簡介

授權是用戶管理和存取控制的重要組成部分,它定義了每個用戶在系統上被允許執行的操作策略。決定適當的策略並在資料庫中實施它們,可確保用戶可以與他們需要的資源互動,同時防止不當行為。

在本指南中,我們將介紹授權在 MongoDB 中的運作方式。我們將了解 MongoDB 如何概念化存取管理、可以授予用戶哪些類型的權限,以及如何將策略附加到用戶帳戶。

先決條件

若要跟著本指南操作,您需要一個具有適當權限的 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.replsetsystem.profile 集合的動作
      • find
  • clusterManager:透過 configlocal 資料庫提供叢集的監控和管理存取權限
    • 整個叢集的動作
      • 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.jssystem.profile 集合、admin.system.usersadmin.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
    • configlocal 資料庫中非系統集合的動作
      • 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 相同的權限給所有資料庫,除了 localconfig 之外
    • 整個叢集的其他動作
      • listDatabases
  • readWriteAnyDatabase:提供與 readWrite 相同的權限給所有資料庫,除了 localconfig 之外
    • 整個叢集的其他動作
      • listDatabases
  • userAdminAnyDatabase:提供與 userAdmin 相同的權限給所有資料庫,除了 localconfig 之外。
    • 整個叢集的其他動作
      • authSchemaUpgrade
      • invalidateUserCache
      • listDatabases
    • admin 資料庫中 system.userssystem.roles 叢集的其他動作
      • collStats
      • dbHash
      • dbStats
      • find
      • killCursors
      • planCacheRead
  • dbAdminAnyDatabase:提供與 dbAdmin 相同的權限給所有資料庫,除了 localconfig 之外。
    • 整個叢集的其他動作
      • 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() 方法,並將 showPrivilegesshowBuiltinRoles 選項設定為 true

db.getRoles({
rolesInfo: 1,
showPrivileges: true,
showBuiltinRoles: true
})

傳回的清單將包含關於每個角色的完整巢狀資訊,以及它們在整個系統中各種資源上擁有的權限。

若要取得關於特定角色的資訊,請改用 db.getRole() 方法。您必須先位於使用者定義所在的資料庫,才能執行此命令。

use admin
db.getRole(
"root",
{
showPrivileges: true,
showBuiltinRoles: true
}
)

若要檢查哪些角色已授予給每個使用者,請切換到您感興趣的資料庫,並使用 db.getUsers() 方法。

use admin
db.getUsers()

若要檢查與特定使用者相關聯的角色,請改用 db.getUser()

use admin
db.getUser("root")

從使用者指派與撤銷角色

若要授予使用者額外的權限,您必須授予他們存取現有角色的權限。

db.grantRolesToUser() 方法可讓您指定要新增至使用者的其他角色。它的第一個引數是您希望授予額外權限的使用者,第二個引數是您希望新增的其他角色陣列。

db.grantRolesToUser(
"sally",
[
"read",
"backup"
]
)

如果角色是在目前的資料庫中定義的,您可以使用上面的簡寫,透過名稱指定角色,而無需提及資料庫。

若要授予與不同資料庫相關聯的角色,或更明確地表示,請將角色指定為定義 roledb 的文件。

db.grantRolesToUser(
"sally",
[
{ role: "read", db: "sales"},
{ role: "readWrite", db: "callLogs"}
]
)

若要從使用者撤銷角色,您可以使用稱為 db.revokeRolesFromUser() 的配套方法。引數語法完全相同,但這次,命令會從指定的帳戶中移除角色。

若要移除在目前資料庫中定義的角色,您可以使用角色名稱,而無需提及資料庫。

db.revokeRolesFromUser(
"sally",
[
"read",
"backup"
]
)

若要指定與其他資料庫相關聯的角色,請使用長格式,方法是在文件中指定 roledb

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 中有兩個用於唯讀使用者的內建角色。使用者可以被指派到 read 角色或 readAnyDatabase 角色。

read 提供讀取所有非系統集合資料的能力。

readAnyDatabase 提供與 read 相同的功能,但它也提供在整個叢集上使用 listDatabases 動作的能力。

clusterMonitor 角色提供對監控工具的唯讀存取權,例如 MongoDB Cloud Manager 和 Ops Manager 監控代理程式。

backup 角色提供備份資料所需的最低權限。此角色提供足夠的權限來使用 MongoDB Cloud 和 Ops Manager 備份代理程式。

它還具有在 adminsettingsconfig 資料庫中的備份集合上執行 insertupdate 動作的權限。

MongoDB 中的 root 角色提供對以下角色組合的所有操作和資源的存取權:

  • readWriteAnyDatabase
  • dbAdminAnyDatabase
  • userAdminAnyDatabase
  • clusterAdmin
  • restore
  • backup

MongoDB 採用 RBAC 來管理對 MongoDB 系統的存取。RBAC 是一種安全策略,它根據使用者被指派的角色來限制允許使用者的操作。

如果使用者沒有被指派角色,MongoDB 不允許操作或存取資料庫。

關於作者
Justin Ellingwood

Justin Ellingwood

Justin 自 2013 年以來一直撰寫關於資料庫、Linux、基礎架構和開發人員工具的文章。他目前與妻子和兩隻兔子住在柏林。他通常不必以第三人稱寫作,這對所有相關方來說都是一種解脫。