本教程提供了MongoDB授權(quán)模式下的用戶和角色管理示例。學(xué)習(xí)如何向MongoDB添加新用戶。
角色授權(quán)用戶訪問MongoDB資源。 MongoDB提供了許多內(nèi)置的角色,管理員可以使用它們來控制對MongoDB系統(tǒng)的訪問。 但是,如果這些角色無法描述所需的權(quán)限集,則可以在特定數(shù)據(jù)庫中創(chuàng)建新角色。
除了在管理數(shù)據(jù)庫中創(chuàng)建的角色外,角色只能包含適用于其數(shù)據(jù)庫的權(quán)限,并且只能繼承其數(shù)據(jù)庫中的其他角色。
在管理數(shù)據(jù)庫中創(chuàng)建的角色可以包括適用于管理數(shù)據(jù)庫,其他數(shù)據(jù)庫或群集資源的權(quán)限,并且可以從其他數(shù)據(jù)庫中的角色以及管理數(shù)據(jù)庫繼承。
要?jiǎng)?chuàng)建新角色,可使用db.createRole()方法,指定permissions數(shù)組中的權(quán)限和roles數(shù)組中的繼承角色。
MongoDB使用數(shù)據(jù)庫名稱和角色名稱的組合來唯一定義角色。 每個(gè)角色的范圍限定在創(chuàng)建角色的數(shù)據(jù)庫中,但MongoDB將所有角色信息存儲在admin數(shù)據(jù)庫的admin.system.roles集合中。
先決條件
要在數(shù)據(jù)庫中創(chuàng)建角色,您必須具有:
createRole操作。grantRole操作指定新角色的權(quán)限以及指定要繼承的角色。內(nèi)置角色 userAdmin 和 userAdminAnyDatabase 在其各自的資源上提供 createRole 和 grantRole 操作。
以下示例創(chuàng)建一個(gè)名為 manageOpRole 的角色,該角色僅提供運(yùn)行 db.currentOp()和db.killOp()的權(quán)限。
第一步:使用相應(yīng)的權(quán)限連接到MongoDB
使用“先決條件”部分指定的權(quán)限連接到 mongod 或 mongos 。
以下過程使用在“啟用認(rèn)證”中創(chuàng)建的用戶:myUserAdmin。
$ mongo --port 27017 -u "myUserAdmin" -p "abc123" --authenticationDatabase "admin"
myUserAdmin具有在管理員以及其他數(shù)據(jù)庫中創(chuàng)建角色的權(quán)限。
第二步:創(chuàng)建一個(gè)新角色來管理當(dāng)前操作
manageOpRole具有對多個(gè)數(shù)據(jù)庫以及群集資源的權(quán)限。 因此,您必須在管理數(shù)據(jù)庫中創(chuàng)建該角色。
use admin
db.createRole(
{
role: "manageOpRole",
privileges: [
{ resource: { cluster: true }, actions: [ "killop", "inprog" ] },
{ resource: { db: "", collection: "" }, actions: [ "killCursors" ] }
],
roles: []
}
)
新角色授予殺死/終止任何操作的權(quán)限。
警告: 終止運(yùn)行操作非常小心。只能使用
db.killOp()方法或killOp命令終止客戶端發(fā)起的操作,并且不會(huì)終止內(nèi)部數(shù)據(jù)庫操作。
以下示例創(chuàng)建一個(gè)名為 mongostatRole 的角色,該角色僅提供運(yùn)行 mongostat 的權(quán)限。
第一步:使用相應(yīng)的權(quán)限連接到MongoDB
使用“先決條件”部分指定的權(quán)限連接到 mongod 或 mongos 。
以下過程使用在啟用認(rèn)證中創(chuàng)建的用戶:myUserAdmin。
$ mongo --port 27017 -u "myUserAdmin" -p "abc123" --authenticationDatabase "admin"
myUserAdmin具有在管理員以及其他數(shù)據(jù)庫中創(chuàng)建角色的權(quán)限。
第二步:創(chuàng)建一個(gè)新角色來管理當(dāng)前的操作
mongostatRole具有作用于群集資源的權(quán)限。 因此,您必須在管理數(shù)據(jù)庫中創(chuàng)建該角色。
use admin
db.createRole(
{
role: "mongostatRole",
privileges: [
{ resource: { cluster: true }, actions: [ "serverStatus" ] }
],
roles: []
}
)
先決條件
grantRole操作才能在該數(shù)據(jù)庫上授予角色。revokeRole操作以撤銷該數(shù)據(jù)庫上的角色。viewRole操作。執(zhí)行步驟
第一步:使用相應(yīng)的權(quán)限連接到MongoDB
以具有先決條件部分中指定的權(quán)限的用戶身份連接到 mongod 或 mongos 。
以下過程使用在啟用認(rèn)證中創(chuàng)建的用戶:myUserAdmin。
$ mongo --port 27017 -u "myUserAdmin" -p "abc123" --authenticationDatabase "admin"
第二步:識別用戶的角色和權(quán)限
要顯示要修改的用戶的角色和權(quán)限,請使用db.getUser()和db.getRole()方法。
例如,要查看在示例中創(chuàng)建的 reportsUser 的角色,執(zhí)行以下命令:
use reporting
db.getUser("reportsUser")
要顯示在 “accounts” 數(shù)據(jù)庫上由 readWrite 角色授予用戶的權(quán)限,請執(zhí)行以下操作:
use accounts
db.getRole( "readWrite", { showPrivileges: true } )
第三步:確定授予或撤銷的權(quán)限
如果用戶需要額外的權(quán)限,則向用戶授予具有所需權(quán)限集的角色或角色。 如果此類角色不存在,請使用適當(dāng)?shù)臋?quán)限集創(chuàng)建新角色。
撤銷由現(xiàn)有角色提供的特權(quán)子集:撤銷原始角色并授予僅包含所需權(quán)限的角色。如果角色不存在,您需要?jiǎng)?chuàng)建新角色。
第四步:修改用戶的訪問權(quán)限
4.1. 撤銷角色
使用db.revokeRolesFromUser()方法撤銷角色。以下示例操作從account數(shù)據(jù)庫上刪除用戶reportsUser 的 readWrite 角色:
use reporting
db.revokeRolesFromUser(
"reportsUser",
[
{ role: "readWrite", db: "accounts" }
]
)
4.2. 授予角色
使用db.grantRolesToUser()方法授予角色。 例如,以下操作授予reportsUser用戶account數(shù)據(jù)庫上的讀取角色:
use reporting
db.grantRolesToUser(
"reportsUser",
[
{ role: "read", db: "accounts" }
]
)
對于分片集群,用戶的更改將在命令運(yùn)行的 mongos 上即時(shí)生效。但是,對于群集中的其他mongos 實(shí)例,用戶緩存可能會(huì)等待10分鐘才能刷新。請參閱userCacheInvalidationIntervalSecs。
先決條件
要修改數(shù)據(jù)庫上另一個(gè)用戶的密碼,您必須對該數(shù)據(jù)庫具有changeAnyPassword操作。
操作步驟:
第一步:使用相應(yīng)的權(quán)限連接到MongoDB
以具有先決條件部分中指定的權(quán)限的用戶身份連接到 mongod 或 mongos 。
以下過程使用在啟用認(rèn)證中創(chuàng)建的用戶:myUserAdmin。
$ mongo --port 27017 -u "myUserAdmin" -p "abc123" --authenticationDatabase "admin"
第二步:更改密碼
將用戶的用戶名和新密碼傳遞給db.changeUserPassword()方法。
以下操作將reporting用戶的密碼更改為:SOh3TbYhxuLiW8ypJPxmt1oOfL:
db.changeUserPassword("reporting", "SOh3TbYhxuLiW8ypJPxmt1oOfL")
先決條件
要查看其他用戶的信息,您必須對其他用戶的數(shù)據(jù)庫具有viewUser操作。
用戶可以查看自己的信息。
第一步:使用相應(yīng)的權(quán)限連接到MongoDB
以具有先決條件部分中指定的權(quán)限的用戶身份連接到 mongod 或 mongos 。
以下過程使用在啟用認(rèn)證中創(chuàng)建的用戶:myUserAdmin。
$ mongo --port 27017 -u "myUserAdmin" -p "abc123" --authenticationDatabase "admin"
第二步:查看用戶的角色
使用usersInfo命令或db.getUser()方法顯示用戶信息。
例如,要查看在示例中創(chuàng)建的 reportsUser 的角色,請發(fā)出:
use reporting
db.getUser("reportsUser")
在返回的文檔中,roles字段顯示reportsUser的所有角色:
...
"roles" : [
{ "role" : "readWrite", "db" : "accounts" },
{ "role" : "read", "db" : "reporting" },
{ "role" : "read", "db" : "products" },
{ "role" : "read", "db" : "sales" }
]
先決條件
要查看角色的信息,您必須明確授予該角色,或必須對該角色的數(shù)據(jù)庫具有 viewRole 操作。
第一步:使用相應(yīng)的權(quán)限連接到MongoDB
以具有先決條件部分中指定的權(quán)限的用戶身份連接到 mongod 或 mongos 。
以下過程使用在啟用認(rèn)證中創(chuàng)建的用戶:myUserAdmin。
$ mongo --port 27017 -u "myUserAdmin" -p "abc123" --authenticationDatabase "admin"
第二步:查看角色授予的權(quán)限
對于給定的角色,請使用db.getRole()方法或rolesInfo命令與showPrivileges選項(xiàng)一起執(zhí)行:
例如,要查看在product數(shù)據(jù)庫上由讀取角色授予的權(quán)限,請使用以下操作,問題如下:
use products
db.getRole( "read", { showPrivileges: true } )
在返回的文檔中,有兩個(gè)數(shù)組:privileges和inheritedPrivileges。權(quán)限列出了角色指定的權(quán)限,并排除了從其他角色繼承的權(quán)限。 inheritedPrivileges列出了由此角色授予的所有權(quán)限,這兩個(gè)角色都是直接指定的并被繼承。 如果該角色不能從其他角色繼承,則兩個(gè)字段是相同的。
...
"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" ]
}
]