MongoDB管理用戶和角色

本教程提供了MongoDB授權模式下的用戶和角色管理示例。學習如何向MongoDB添加新用戶。

創建用戶定義的角色

角色授權用戶訪問MongoDB資源。 MongoDB提供了許多內置的角色,管理員可以使用它們來控制對MongoDB系統的訪問。 但是,如果這些角色無法描述所需的許可權集,則可以在特定資料庫中創建新角色。

除了在管理資料庫中創建的角色外,角色只能包含適用於其資料庫的許可權,並且只能繼承其資料庫中的其他角色。

在管理資料庫中創建的角色可以包括適用於管理資料庫,其他資料庫或群集資源的許可權,並且可以從其他資料庫中的角色以及管理資料庫繼承。

要創建新角色,可使用db.createRole()方法,指定permissions數組中的許可權和roles數組中的繼承角色。

MongoDB使用資料庫名稱和角色名稱的組合來唯一定義角色。 每個角色的範圍限定在創建角色的資料庫中,但MongoDB將所有角色資訊存儲在admin資料庫的admin.system.roles集合中。

先決條件

要在資料庫中創建角色,您必須具有:

  • 對該資料庫資源的createRole操作。
  • 對該資料庫的grantRole操作指定新角色的許可權以及指定要繼承的角色。

內置角色 userAdminuserAdminAnyDatabase 在其各自的資源上提供 createRolegrantRole 操作。

創建角色來管理當前操作

以下示例創建一個名為 manageOpRole 的角色,該角色僅提供運行 db.currentOp()db.killOp()的許可權。

第一步:使用相應的許可權連接到MongoDB

使用“先決條件”部分指定的許可權連接到 mongodmongos

以下過程使用在“啟用認證”中創建的用戶:myUserAdmin

$ mongo --port 27017 -u "myUserAdmin" -p "abc123" --authenticationDatabase "admin"

myUserAdmin具有在管理員以及其他資料庫中創建角色的許可權。

第二步:創建一個新角色來管理當前操作

manageOpRole具有對多個數據庫以及群集資源的許可權。 因此,您必須在管理資料庫中創建該角色。

use admin
db.createRole(
   {
     role: "manageOpRole",
     privileges: [
       { resource: { cluster: true }, actions: [ "killop", "inprog" ] },
       { resource: { db: "", collection: "" }, actions: [ "killCursors" ] }
     ],
     roles: []
   }
)

新角色授予殺死/終止任何操作的許可權。

警告: 終止運行操作非常小心。只能使用db.killOp()方法或killOp命令終止客戶端發起的操作,並且不會終止內部資料庫操作。

創建角色用來運行 mongostat

以下示例創建一個名為 mongostatRole 的角色,該角色僅提供運行 mongostat 的許可權。

第一步:使用相應的許可權連接到MongoDB

使用“先決條件”部分指定的許可權連接到 mongod 或 mongos 。

以下過程使用在啟用認證中創建的用戶:myUserAdmin

$ mongo --port 27017 -u "myUserAdmin" -p "abc123" --authenticationDatabase "admin"

myUserAdmin具有在管理員以及其他資料庫中創建角色的許可權。

第二步:創建一個新角色來管理當前的操作

mongostatRole具有作用於群集資源的許可權。 因此,您必須在管理資料庫中創建該角色。

use admin
db.createRole(
   {
     role: "mongostatRole",
     privileges: [
       { resource: { cluster: true }, actions: [ "serverStatus" ] }
     ],
     roles: []
   }
)

修改現有用戶的訪問許可權

先決條件

  • 必須對數據庫具有grantRole操作才能在該資料庫上授予角色。
  • 必須在資料庫上具有revokeRole操作以撤銷該資料庫上的角色。
  • 要查看角色的資訊,必須明確授予該角色,或必須對該角色的資料庫具有viewRole操作。

執行步驟

第一步:使用相應的許可權連接到MongoDB

以具有先決條件部分中指定的許可權的用戶身份連接到 mongodmongos

以下過程使用在啟用認證中創建的用戶:myUserAdmin

$ mongo --port 27017 -u "myUserAdmin" -p "abc123" --authenticationDatabase "admin"

第二步:識別用戶的角色和許可權

要顯示要修改的用戶的角色和許可權,請使用db.getUser()db.getRole()方法。

例如,要查看在示例中創建的 reportsUser 的角色,執行以下命令:

use reporting
db.getUser("reportsUser")

要顯示在 “accounts” 資料庫上由 readWrite 角色授予用戶的許可權,請執行以下操作:

use accounts
db.getRole( "readWrite", { showPrivileges: true } )

第三步:確定授予或撤銷的許可權

如果用戶需要額外的許可權,則向用戶授予具有所需許可權集的角色或角色。 如果此類角色不存在,請使用適當的許可權集創建新角色。

撤銷由現有角色提供的特權子集:撤銷原始角色並授予僅包含所需許可權的角色。如果角色不存在,您需要創建新角色。

第四步:修改用戶的訪問許可權

4.1. 撤銷角色

使用db.revokeRolesFromUser()方法撤銷角色。以下示例操作從account資料庫上刪除用戶reportsUserreadWrite 角色:

use reporting
db.revokeRolesFromUser(
    "reportsUser",
    [
      { role: "readWrite", db: "accounts" }
    ]
)

4.2. 授予角色

使用db.grantRolesToUser()方法授予角色。 例如,以下操作授予reportsUser用戶account資料庫上的讀取角色:

use reporting
db.grantRolesToUser(
    "reportsUser",
    [
      { role: "read", db: "accounts" }
    ]
)

對於分片集群,用戶的更改將在命令運行的 mongos 上即時生效。但是,對於群集中的其他mongos 實例,用戶緩存可能會等待10分鐘才能刷新。請參閱userCacheInvalidationIntervalSecs

修改現有用戶的密碼

先決條件

要修改資料庫上另一個用戶的密碼,您必須對該資料庫具有changeAnyPassword操作。

操作步驟:

第一步:使用相應的許可權連接到MongoDB

以具有先決條件部分中指定的許可權的用戶身份連接到 mongodmongos

以下過程使用在啟用認證中創建的用戶:myUserAdmin

$ mongo --port 27017 -u "myUserAdmin" -p "abc123" --authenticationDatabase "admin"

第二步:更改密碼

將用戶的用戶名和新密碼傳遞給db.changeUserPassword()方法。

以下操作將reporting用戶的密碼更改為:SOh3TbYhxuLiW8ypJPxmt1oOfL

db.changeUserPassword("reporting", "SOh3TbYhxuLiW8ypJPxmt1oOfL")

查看用戶的角色

先決條件

要查看其他用戶的資訊,您必須對其他用戶的資料庫具有viewUser操作。

用戶可以查看自己的資訊。

第一步:使用相應的許可權連接到MongoDB

以具有先決條件部分中指定的許可權的用戶身份連接到 mongodmongos

以下過程使用在啟用認證中創建的用戶:myUserAdmin

$ mongo --port 27017 -u "myUserAdmin" -p "abc123" --authenticationDatabase "admin"

第二步:查看用戶的角色

使用usersInfo命令或db.getUser()方法顯示用戶資訊。

例如,要查看在示例中創建的 reportsUser 的角色,請發出:

use reporting
db.getUser("reportsUser")

在返回的文檔中,roles字段顯示reportsUser的所有角色:

...
"roles" : [
   { "role" : "readWrite", "db" : "accounts" },
   { "role" : "read", "db" : "reporting" },
   { "role" : "read", "db" : "products" },
   { "role" : "read", "db" : "sales" }
]

查看角色的許可權

先決條件

要查看角色的資訊,您必須明確授予該角色,或必須對該角色的資料庫具有 viewRole 操作。

第一步:使用相應的許可權連接到MongoDB

以具有先決條件部分中指定的許可權的用戶身份連接到 mongodmongos

以下過程使用在啟用認證中創建的用戶:myUserAdmin

$ mongo --port 27017 -u "myUserAdmin" -p "abc123" --authenticationDatabase "admin"

第二步:查看角色授予的許可權

對於給定的角色,請使用db.getRole()方法或rolesInfo命令與showPrivileges選項一起執行:

例如,要查看在product資料庫上由讀取角色授予的許可權,請使用以下操作,問題如下:

use products
db.getRole( "read", { showPrivileges: true } )

在返回的文檔中,有兩個數組:privilegesinheritedPrivileges。許可權列出了角色指定的許可權,並排除了從其他角色繼承的許可權。 inheritedPrivileges列出了由此角色授予的所有權限,這兩個角色都是直接指定的並被繼承。 如果該角色不能從其他角色繼承,則兩個字段是相同的。

...
"privileges" : [
  {
    "resource": { "db" : "products", "collection" : "" },
    "actions": [ "collStats","dbHash","dbStats","find","killCursors","planCacheRead" ]
  },
  {
    "resource" : { "db" : "products", "collection" : "system.js" },
    "actions": [ "collStats","dbHash","dbStats","find","killCursors","planCacheRead" ]
  }
],
"inheritedPrivileges" : [
  {
    "resource": { "db" : "products", "collection" : "" },
    "actions": [ "collStats","dbHash","dbStats","find","killCursors","planCacheRead" ]
  },
  {
    "resource" : { "db" : "products", "collection" : "system.js" },
    "actions": [ "collStats","dbHash","dbStats","find","killCursors","planCacheRead" ]
  }
]

上一篇: MongoDB啟用身份驗證 下一篇: MongoDB更改用戶密碼和自定義數據