本教學提供了MongoDB授權模式下的使用者和角色管理範例。學習如何向MongoDB新增新使用者。
角色授權使用者存取MongoDB資源。 MongoDB提供了許多內建的角色,管理員可以使用它們來控制對MongoDB系統的存取。 但是,如果這些角色無法描述所需的許可權集,則可以在特定資料庫中建立新角色。
除了在管理資料庫中建立的角色外,角色只能包含適用於其資料庫的許可權,並且只能繼承其資料庫中的其他角色。
在管理資料庫中建立的角色可以包括適用於管理資料庫,其他資料庫或群集資源的許可權,並且可以從其他資料庫中的角色以及管理資料庫繼承。
要建立新角色,可使用db.createRole()
方法,指定permissions
陣列中的許可權和roles
陣列中的繼承角色。
MongoDB使用資料庫名稱和角色名稱的組合來唯一定義角色。 每個角色的範圍限定在建立角色的資料庫中,但MongoDB將所有角色資訊儲存在admin
資料庫的admin.system.roles
集合中。
先決條件
要在資料庫中建立角色,您必須具有:
createRole
操作。grantRole
操作指定新角色的許可權以及指定要繼承的角色。內建角色 userAdmin
和 userAdminAnyDatabase
在其各自的資源上提供 createRole
和 grantRole
操作。
以下範例建立一個名為 manageOpRole
的角色,該角色僅提供執行 db.currentOp()
和db.killOp()
的許可權。
第一步:使用相應的許可權連線到MongoDB
使用「先決條件」部分指定的許可權連線到 mongod
或 mongos
。
以下過程使用在「啟用認證」中建立的使用者: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
命令終止用戶端發起的操作,並且不會終止內部資料庫操作。
以下範例建立一個名為 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
以具有先決條件部分中指定的許可權的使用者身份連線到 mongod
或 mongos
。
以下過程使用在啟用認證中建立的使用者: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
資料庫上刪除使用者reportsUser
的 readWrite
角色:
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
以具有先決條件部分中指定的許可權的使用者身份連線到 mongod
或 mongos
。
以下過程使用在啟用認證中建立的使用者:myUserAdmin
。
$ mongo --port 27017 -u "myUserAdmin" -p "abc123" --authenticationDatabase "admin"
第二步:更改密碼
將使用者的使用者名和新密碼傳遞給db.changeUserPassword()
方法。
以下操作將reporting
使用者的密碼更改為:SOh3TbYhxuLiW8ypJPxmt1oOfL
:
db.changeUserPassword("reporting", "SOh3TbYhxuLiW8ypJPxmt1oOfL")
先決條件
要檢視其他使用者的資訊,您必須對其他使用者的資料庫具有viewUser
操作。
使用者可以檢視自己的資訊。
第一步:使用相應的許可權連線到MongoDB
以具有先決條件部分中指定的許可權的使用者身份連線到 mongod
或 mongos
。
以下過程使用在啟用認證中建立的使用者: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
以具有先決條件部分中指定的許可權的使用者身份連線到 mongod
或 mongos
。
以下過程使用在啟用認證中建立的使用者:myUserAdmin
。
$ mongo --port 27017 -u "myUserAdmin" -p "abc123" --authenticationDatabase "admin"
第二步:檢視角色授予的許可權
對於給定的角色,請使用db.getRole()
方法或rolesInfo
命令與showPrivileges
選項一起執行:
例如,要檢視在product
資料庫上由讀取角色授予的許可權,請使用以下操作,問題如下:
use products
db.getRole( "read", { showPrivileges: true } )
在返回的文件中,有兩個陣列:privileges
和inheritedPrivileges
。許可權列出了角色指定的許可權,並排除了從其他角色繼承的許可權。 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" ]
}
]