使用基于角色的访问控制限制数据库访问 - Amazon DocumentDB
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用基于角色的访问控制限制数据库访问

您可以使用以下方法限制对用户可以在数据库上执行的操作的访问权限基于角色的访问控制Amazon DocumentDB(with MongoDB)。RBAC 的原理是向用户授予一个或多个角色。这些角色决定了用户可以对数据库资源执行的操作。Amazon DocumentDB 目前支持两种以数据库级别为作用域的内置角色,例如read,readWrite,readAnyDatabase,clusterAdmin,以及用户定义的角色,这些角色的范围可以限定为特定操作和精细资源,例如基于您的要求的集合。

RBAC 的常见用例包括通过创建对集群中的数据库或集合具有只读访问权限的用户来强制执行最低权限,以及允许单个用户访问集群中给定数据库或集合的多租户应用程序设计。

注意

所有在 2020 年 3 月 26 日之前创建的新用户都已被授予 dbAdminAnyDatabasereadWriteAnyDatabaseclusterAdmin 角色。建议您重新评估所有现有用户并根据需要修改角色,以便为您的集群强制执行最低权限。

RBAC 概念

以下是与基于角色的访问控制相关的重要术语和概念。有关Amazon DocumentDB(Amazon DB)的角色Amazon DocumentDB 用户.

  • 用户— 可以对数据库进行身份验证并执行操作的单个实体。

  • Password— 用于验证用户身份的密钥。

  • Role— 授权用户对一个或多个数据库执行操作。

  • 管理员数据库— 用于存储和授权用户的数据库。

  • 数据库 (db)— 集群中的命名空间,其中包含用于存储文档的集合。

以下命令创建名为 sample-user 的用户。

db.createUser({user: "sample-user", pwd: "abc123", roles: [{role: "read", db: "sample-database"}]})

在此示例中:

  • user: "sample-user"— 表示用户名。

  • pwd: "abc123"— 表示用户密码。

  • role: "read", "db: "sample-database"— 表示用户sample-user将在中拥有读取权限sample-database.


                代码示例显示 createuser 命令,指示用户名、密码和权限。

以下示例显示您为用户 sample-user 指定 db.getUser(sample-user) 后的输出。在此示例中,用户 sample-user 驻留在 admin 数据库中,但具有 sample-database 数据库的读取角色。

创建用户时,如果省略db字段在指定角色时,Amazon DocumentDB 会将该角色隐式归因于发出连接的数据库。例如,如果您的连接是针对数据库 sample-database 发出的,并且您运行以下命令,则用户 sample-user 将在 admin 数据库中创建并具有对数据库 sample-databasereadWrite 权限。

db.createUser({user: "sample-user", pwd: "abc123", roles: ["readWrite"]})

此操作的输出将类似于下文。

{ "user":"sample-user", "roles":[ { "db":"sample-database", "role":"readWrite" } ] }

创建具有跨所有数据库范围的角色的用户(例如,readAnyDatabase)需要在创建用户时处于 admin 数据库的上下文,或者在创建用户时明确指定角色的数据库。要针对 admin 数据库发出命令,可以使用命令 use admin。有关更多信息,请参阅 常用命令

RBAC 内置角色入门

为帮助您掌握基于角色的访问控制,本部分将向您介绍通过为三个用户创建具有不同职能的角色来强制执行最低权限的示例方案。

  • user1 是一位新上任的经理,需要能够查看和访问集群中的所有数据库。

  • user2 是一位新员工,只需访问同一集群中的一个数据库 sample-database-1

  • user3 是现有员工,需要查看和访问同一集群中其以前无权访问的不同数据库 sample-database-2

在这之后,user1user2 都离开了公司,所以必须撤销他们的访问权限。

要创建用户和授予角色,进入集群用于进行身份验证的用户必须具有可以为 createUsergrantRole 执行操作的关联角色。例如,角色 adminuserAdminAnyDatabase 都可以授予执行上述功能的权限。有关每个角色的操作,请参阅使用基于角色的访问控制限制数据库访问

注意

在 Amazon DocumentDB 中,所有用户和角色操作(例如create,get,drop,grant,revoke,等等)在admin数据库不管你是否在对数据库发出命令admin数据库。

首先,要了解集群中的当前用户和角色,可以运行 show users 命令,如以下示例所示。您将看到两个用户,即集群的 serviceadmin 和主用户。这两个用户始终存在,无法将它们删除。有关更多信息,请参阅 Amazon DocumentDB 用户

show users

对于 user1,使用以下命令创建具有对整个集群中所有数据库的读写访问权限的角色。

db.createUser({user: "user1", pwd: "abc123", roles: [{role: "readWriteAnyDatabase", db: "admin"}]})

此操作的输出将类似于下文。

{ "user":"user1", "roles":[ { "role":"readWriteAnyDatabase", "db":"admin" } ] }

对于 user2,使用以下命令创建对数据库 sample-database-1 具有只读访问权限的角色。

db.createUser({user: "user2", pwd: "abc123", roles: [{role: "read", db: "sample-database-1"}]})

此操作的输出将类似于下文。

{ "user":"user2", "roles":[ { "role":"read", "db":"sample-database-1" } ] }

要模拟 user3 是现有用户的方案,请先创建用户 user3,然后将新角色分配给 user3

db.createUser({user: "user3", pwd: "abc123", roles: [{role: "readWrite", db: "sample-database-1"}]})

此操作的输出将类似于下文。

{ "user":"user3", "roles":[ { "role":"readWrite", "db":"sample-database-1" } ] }

现在已创建了用户 user3,请为 user3 分配可对 sample-database-2 进行 read 的角色。

db.grantRolesToUser("user3", [{role: "read", db: "sample-database-2"}])

最后,user1user2 都离开了公司,需要撤销他们对集群的访问权限。您可以通过删除用户来执行此操作,如下所示。

db.dropUser("user1") db.dropUser("user2")

要确保所有用户都具有适当角色,可使用以下命令列出所有用户。

show users

此操作的输出将类似于下文。

{ "_id":"serviceadmin", "user":"serviceadmin", "db":"admin", "roles":[ { "db":"admin", "role":"root" } ] } { "_id":"master-user", "user":"master-user", "db":"admin", "roles":[ { "db":"admin", "role":"root" } ] } { "_id":"user3", "user":"user3", "db":"admin", "roles":[ { "db":"sample-database-2", "role":"read" }, { "db":"sample-database-1", "role":"readWrite" } ] }

RBAC 用户定义角色入门

为了帮助您开始使用用户定义的角色,本节向您介绍了一个通过为三个具有不同工作职能的用户创建角色来强制执行最低权限的示例场景。

在此示例中,以下项适用:

  • user1 是一位新上任的经理,需要能够查看和访问集群中的所有数据库。

  • user2是一名新员工,只需要对一个数据库执行 “查找” 操作,sample-database-1,在同一个集群中。

  • user3是一名现有员工,需要查看和访问特定的集合,即另一个数据库中的 col2,sample-database-2他们以前无法访问的,在同一个集群中。

  • 对于 user1,使用以下命令创建具有对整个集群中所有数据库的读写访问权限的角色。

db.createUser( { user: "user1", pwd: "abc123", roles: [{role: "readWriteAnyDatabase", db: "admin"}] } )

此操作的输出将类似于下文。

{ "user":"user1", "roles":[ { "role":"readWriteAnyDatabase", "db":"admin" } ] }

对于user2,创建一个对数据库中所有集合具有 “查找” 权限的角色sample-database-1使用以下命令。请注意,此角色将确保任何关联用户只能运行查找查询。

db.createRole( { role: "findRole", privileges: [ { resource: {db: "sample-database-1", collection: ""}, actions: ["find"] }], roles: [] } )

此操作的输出将类似于下文。

{ "role":"findRole", "privileges":[ { "resource":{ "db":"sample-database-1", "collection":"" }, "actions":[ "find" ] } ], "roles":[ ] }

接下来,创建用户 (user2) 并附上最近创建的角色findRole给用户。

db.createUser( { user: "user2", pwd: "abc123", roles: [] }) db.grantRolesToUser("user2",["findRole"])

为了模拟这样的场景user3是现有用户,首先创建用户user3,然后创建一个名为 CollectionRole 的新角色,我们将在下一步中将其分配给user3.

现在,您可以将新角色分配给user3. 这个新角色将允许user3为了能够插入、更新、删除和查找对一个特定集合的访问权限 col2sample-database-2.

db.createUser( { user: "user3", pwd: "abc123", roles: [] }) db.createRole( { role: "collectionRole", privileges: [ { resource: {db: "sample-database-2", collection: "col2"}, actions: ["find", "update", "insert", "remove"] }], roles: [] } )

此操作的输出将类似于下文。

{ "role":"collectionRole", "privileges":[ { "resource":{ "db":"sample-database-2", "collection":"col2" }, "actions":[ "find", "update", "insert", "remove" ] } ], "roles":[ ] }

现在,用户user3已创建,你可以授予user3角色collectionFind.

db.grantRolesToUser("user3",["collectionRole"])

最后,user1user2 都离开了公司,需要撤销他们对集群的访问权限。您可以通过删除用户来执行此操作,如下所示。

db.dropUser("user1") db.dropUser("user2")

要确保所有用户都具有适当角色,可使用以下命令列出所有用户。

show users

此操作的输出将类似于下文。

{ "_id":"serviceadmin", "user":"serviceadmin", "db":"admin", "roles":[ { "db":"admin", "role":"root" } ] } { "_id":"master-user", "user":"master-user", "db":"admin", "roles":[ { "db":"admin", "role":"root" } ] } { "_id":"user3", "user":"user3", "db":"admin", "roles":[ { "db":"admin", "role":"collectionRole" } ] }

以用户身份连接到Amazon DocumentDB B

连接到 Amazon DocumentDB 集群时,您将在特定数据库的上下文中进行连接。默认情况下,如果未在连接字符串中指定数据库,则会在 test 数据库上下文中自动连接到集群。所有集合级别命令(如 insertfind)都是针对 test 数据库中的集合发出的。

要查看你所处的数据库,或者换句话说,要发布针对的命令,请使用dbmongo shell 中的命令,如下所示。

查询:

db

输出:

test

尽管默认连接可能位于 test 数据库的上下文中,但这并不一定意味着与连接关联的用户有权对 test 数据库执行操作。在上述示例方案中,如果您用于进行身份验证的用户 user3 是具有对 sample-database-1 数据库的 readWrite 权限的角色,则连接的默认上下文是 test 数据库。但是,如果您尝试将文档插入 test 数据库中的集合中,您将收到 Authorization failure (授权失败) 错误消息。这是因为该用户未获得对该数据库执行该命令的授权,如下所示。

查询:

db

输出:

test

查询:

db.col.insert({x:1})

输出:

WriteCommandError({ "ok" : 0, "code" : 13, "errmsg" : "Authorization failure" })

如果您将连接上下文更改为 sample-database-1 数据库,则可以写入到集合中,因为该用户具有执行此操作的授权。

查询:

use sample-database-1

输出:

switched to db sample-database-1

查询:

db.col.insert({x:1})

输出:

WriteResult({ "nInserted" : 1})

使用特定用户对集群进行身份验证时,还可以在连接字符串中指定数据库。如果这样做,则用户在通过 admin 数据库的身份验证后,不再需要执行 use 命令。

以下连接字符串根据 admin 数据库对用户进行身份验证,但连接上下文则是 sample-database-1 数据库。

mongo "mongodb://user3:abc123@sample-cluster.node.us-east-1.docdb.amazonaws.com:27017/sample-database-2"

常用命令

本节提供了在 Amazon DocumentDB 中使用基于角色的访问控制的常用命令示例。您必须位于 admin 数据库的上下文中,才能创建和修改用户和角色。您可以使用 use admin 命令切换到 admin 数据库。

注意

对用户和角色的修改将隐式发生在 admin 数据库中。创建具有跨所有数据库范围的角色的用户(例如,readAnyDatabase)需要在创建用户时处于 admin 数据库上下文(即 use admin),或者在创建用户时明确指定角色的数据库(如本节的示例 2 所示)。

示例 1:使用的用户read数据库的角色foo.

db.createUser({user: "readInFooBar", pwd: "abc123", roles: [{role: "read", db: "foo"}]})

此操作的输出将类似于下文。

{ "user":"readInFooBar", "roles":[ { "role":"read", "db":"foo" } ] }

示例 2:创建对所有数据库具有读取权限的用户。

db.createUser({user: "readAllDBs", pwd: "abc123", roles: [{role: "readAnyDatabase", db: "admin"}]})

此操作的输出将类似于下文。

{ "user":"readAllDBs", "roles":[ { "role":"readAnyDatabase", "db":"admin" } ] }

示例 3:Granread角色分配给新数据库中的现有用户。

db.grantRolesToUser("readInFooBar", [{role: "read", db: "bar"}])

示例 4:更新用户角色。

db.updateUser("readInFooBar", {roles: [{role: "read", db: "foo"}, {role: "read", db: "baz"}]})

示例 5:撤消用户对数据库的访问权限。

db.revokeRolesFromUser("readInFooBar", [{role: "read", db: "baz"}])

示例 6:描述内置角色。

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

此操作的输出将类似于下文。

{ "role":"read", "db":"sample-database-1", "isBuiltin":true, "roles":[ ], "inheritedRoles":[ ], "privileges":[ { "resource":{ "db":"sample-database-1", "collection":"" }, "actions":[ "changeStream", "collStats", "dbStats", "find", "killCursors", "listCollections", "listIndexes" ] } ], "inheritedPrivileges":[ { "resource":{ "db":"sample-database-1", "collection":"" }, "actions":[ "changeStream", "collStats", "dbStats", "find", "killCursors", "listCollections", "listIndexes" ] } }

示例 7.:将用户从集群中删除。

db.dropUser("readInFooBar")

此操作的输出将类似于下文。

true

示例 8:创建对特定集合进行读写访问的角色

db.createRole( { role: "collectionRole", privileges: [ { resource: {db: "sample-database-2", collection: "col2"}, actions: ["find", "update", "insert", "remove"] }], roles: [] } )

此操作的输出将类似于下文。

{ "role":"collectionRole", "privileges":[ { "resource":{ "db":"sample-database-2", "collection":"col2" }, "actions":[ "find", "update", "insert", "remove" ] } ], "roles":[ ] }

示例 9:创建用户并分配用户定义的角色

db.createUser( { user: "user3", pwd: "abc123", roles: [] }) db.grantRolesToUser("user3",["collectionRole"])

示例 10.:向用户定义的角色,授予其他权限

db.grantPrivilegesToRole( "collectionRole", [ { resource: { db: "sample-database-1", collection: "col1" }, actions: ["find", "update", "insert", "remove"] } ] )

示例 11.:移除用户定义角色的权限

db.revokePrivilegesFromRole( "collectionRole", [ { resource: { db: "sample-database-1", collection: "col2" }, actions: ["find", "update", "insert", "remove"] } ] )

示例 12.:更新现有的用户定义角色

db.updateRole( "collectionRole", { privileges: [ { resource: {db: "sample-database-3", collection: "sample-collection-3"}, actions: ["find", "update", "insert", "remove"] }], roles: [] } )

功能差异

在 Amazon DocumentDB 中,用户和角色定义存储在admin数据库和用户已通过身份验证admin数据库。此功能与 MongoDB 社区版不同,但与 MongoDB Atlas 一致。

Amazon DocumentDB 还支持变更流,变更流提供集群集合中发生的变更事件按时间顺序排列。这些区域有:listChangeStreams操作应用于集群级别(即所有数据库),并且modifyChangeStreams操作可以在数据库级别和集群级别上应用。

限制

下表包含 Amazon DocumentDB 中基于角色的访问控制的限制。

描述 限制
每个集群的用户数 1000
与用户关联的角色数 1000
用户定义的角色 100
与权限关联的资源数量 100

使用基于角色的访问控制限制数据库访问

借助基于角色的访问控制,您可以创建一个用户并向其授予一个或多个角色,以确定该用户可以在数据库或集群中执行哪些操作。

以下是 Amazon DocumentDB 目前支持的内置角色列表。

注意

在Amazon DocumentDB B 4.0 中,ListCollectionListDatabase命令可以选择使用authorizedCollectionsauthorizedDatabases参数列出用户有权访问的集合和数据库,需要listCollectionslistDatabase角色,分别为。此外,用户现在可以在不需要KillCursor角色.

角色类型 角色名称 描述 操作
数据库用户 read 授予用户对指定数据库的读取权限。

changeStreams

collStats

dbStats

find

killCursors

listIndexes

listCollections

readWrite 授予用户对指定数据库的读取和写入访问权限。

使用 read 权限的所有操作。

createCollection

dropCollection

createIndex

dropIndex

insert

killCursors

listIndexes

listCollections

remove

update

集群用户 readAnyDatabase 授予用户对集群中所有数据库的读取权限。

使用 read 权限的所有操作。

listChangeStreams

listDatabases

readWriteAnyDatabase 授予用户对集群中所有数据库的读写权限。

使用 readWrite 权限的所有操作。

listChangeStreams

listDatabases

userAdminAnyDatabase 授予用户为所有用户分配或修改对指定数据库的角色或权限的能力。

changeCustomData

changePassword

createUser

dropRole

dropUser

grantRole

listDatabases

revokeRole

viewRole

viewUser

dbAdminAnyDatabase 授予用户对所有指定数据库执行数据库管理角色的能力。

使用 dbAdmin 权限的所有操作。

dropCollection

listDatabases

listChangeStreams

modifyChangeStreams

Superuser root 授予用户对以下所有角色的合并资源和操作的访问权限: readWriteAnyDatabasedbAdminAnyDatabaseuserAdminAnyDatabaseclusterAdminrestorebackup

使用 readWriteAnyDatabasedbAdminAnyDatabaseuserAdminAnyDatabaseclusterAdminrestorebackup 的所有操作。

数据库管理 dbAdmin 授予用户对指定数据库执行管理任务的能力。

collMod

collStats

createCollection

createIndex

dropCollection

dropDatabase

dropIndex

dbStats

find

killCursors

listIndexes

listCollections

modifyChangeStreams

dbOwner 通过合并角色 dbAdminreadWrite 授予用户对指定数据库执行任何管理任务的能力。

使用 dbAdminreadWrite 的所有操作。

集群管理 clusterAdmin 通过合并 clusterManagerclusterMonitorhostManager 角色授予用户最大的集群管理访问权限。

使用 clusterManagerclusterMonitorhostManager 的所有操作。

listChangeStreams

dropDatabase

modifyChangeStreams

clusterManager 授予用户对指定集群执行管理和监控操作的能力。

listChangeStreams

listSessions

modifyChangeStreams

replSetGetConfig

clusterMonitor 授予用户对监控工具可具有只读访问权限的能力。

collStats

dbStats

find

getParameter

hostInfo

indexStats

killCursors

listChangeStreams

listCollections

listDatabases

listIndexes

listSessions

replSetGetConfig

serverStatus

top

hostManager 授予用户监视和管理服务器的能力。

killCursors

killAnyCursor

killAnySession

killop

备份管理 backup 授予用户备份数据所需的访问权限。

getParameter

insert

find

listChangeStreams

listCollections

listDatabases

listIndexes

update

restore 授予用户还原数据所需的访问权限。

changeCustomData

changePassword

collMod

createCollection

createIndex

createUser

dropCollection

dropRole

dropUser

getParameter

grantRole

find

insert

listCollections

modifyChangeStreams

revokeRole

remove

viewRole

viewUser

update