DAX 访问控制
DynamoDB Accelerator (DAX) 设计为与 DynamoDB 结合使用,以将缓存层无缝添加到您的应用程序。但是,DAX 和 DynamoDB 具有单独的访问控制机制。这两种服务都使用 AWS Identity and Access Management (IAM) 实施其各自的安全策略,但 DAX 和 DynamoDB 的安全模型不同。
强烈建议了解这两种安全模型,为使用 DAX 的应用程序实施正确的安全措施。
本节介绍 DAX 提供的访问控制机制,提供可根据需求定制的示例 IAM 策略。
利用 DynamoDB 可以创建 IAM 策略,限制用户可对各个 DynamoDB 资源执行的操作。例如,可以创建仅允许用户对特定 DynamoDB 表执行只读操作的用户角色。(有关更多信息,请参阅 适用于 Amazon DynamoDB 的 Identity and Access Management。) 相比之下,DAX 安全模型专注于集群安全,以及集群代表您执行 DynamoDB API 操作的能力。
警告
如果目前使用 IAM 角色和策略限制对 DynamoDB 表数据的访问,那么使用 DAX 可以推翻这些策略。例如,用户可以通过 DAX 访问 DynamoDB 表,但没有直接访问 DynamoDB 的同一表的显式访问权限。有关更多信息,请参阅 适用于 Amazon DynamoDB 的 Identity and Access Management。
DAX 不会强制对 DynamoDB 中的数据执行用户级隔离。相反,用户在访问 DAX 集群时将继承该集群的 IAM 策略的权限。因此,通过 DAX 访问 DynamoDB 表,唯一有效的访问控制是 DAX 集群的 IAM 策略中的权限。其他任何权限都不受认可。
如果需要隔离,我们建议创建额外 DAX 集群并相应地为每个集群确定 IAM 策略的范围。例如,可以创建多个 DAX 集群并允许每个集群只访问单个表。
适用于 DAX 的 IAM 服务角色
创建 DAX 集群时,必须将该集群与 IAM 角色关联。这称为该集群的服务角色。
假设要创建一个名为 DAXCluster01 的新 DAX 集群。可以创建一个名为 DAXServiceRole 的服务角色,并将该角色与 DAXCluster01 关联。DAXServiceRole 策略定义 DAXCluster01 可以代表与 DAXCluster01 交互的用户执行的 DynamoDB 操作。
创建服务角色时,必须指定 DAXServiceRole 与 DAX 服务本身之间的信任关系。信任关系用于确定可担任某个角色并利用其权限的实体。下面是 DAXServiceRole 的示例信任关系文档:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "dax.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
此信任关系允许 DAX 集群代入 DAXServiceRole 并代表您执行 DynamoDB API 调用。
允许的 DynamoDB API 操作在附加到 DAXServiceRole 的 IAM 策略文档中介绍。下面是示例策略文档。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "DaxAccessPolicy", "Effect": "Allow", "Action": [ "dynamodb:DescribeTable", "dynamodb:PutItem", "dynamodb:GetItem", "dynamodb:UpdateItem", "dynamodb:DeleteItem", "dynamodb:Query", "dynamodb:Scan", "dynamodb:BatchGetItem", "dynamodb:BatchWriteItem", "dynamodb:ConditionCheckItem" ], "Resource": [ "arn:aws:dynamodb:us-west-2:123456789012:table/Books" ] } ] }
此策略允许 DAX 对 DynamoDB 表执行必要的 DynamoDB API 操作。dynamodb:DescribeTable
操作是 DAX 维护表元数据所必需的,其他操作是对表的项目执行的读取和写入操作。该表 Books
位于 us-west-2 区域,由 AWS 账户 ID 123456789012
拥有。
注意
DAX 支持防止跨服务访问期间出现混淆代理问题的机制。有关更多信息,请参阅《IAM 用户指南》中的混淆代理人问题。
允许 DAX 集群访问权限的 IAM 策略
创建 DAX 集群后,需要为用户授权,使其可访问 DAX 集群。
例如,假设要将 DAXCluster01 的访问权限授予名为 Alice 的用户。首先创建一个 IAM 策略(AliceAccessPolicy),该策略定义了接收方可以访问的 DAX 集群和 DAX API 操作。然后将此策略附加到 Alice 用户,授予访问权限。
以下策略文档为接收方提供对 DAXCluster01 的完全访问权限。
{ "Version": "2012-10-17", "Statement": [ { "Action": [ "dax:*" ], "Effect": "Allow", "Resource": [ "arn:aws:dax:us-west-2:123456789012:cache/DAXCluster01" ] } ] }
策略文档允许访问 DAX 集群,但不授予任何 DynamoDB 权限。(DynamoDB 权限由 DAX 服务角色授予。)
对于用户 Alice,先用前面所示的策略文档创建 AliceAccessPolicy
。然后将该策略附加到 Alice。
注意
可以将该策略附加到 IAM 角色,而不是用户。这样,担任该角色的所有用户都将具有您在策略中定义的权限。
该用户策略将与 DAX 服务角色共同确定接收方可通过 DAX 访问的 DynamoDB 资源和 API 操作。
案例研究:DynamoDB 和 DAX 访问权限
以下场景可帮助您进一步了解用于 DAX 的 IAM 策略。(本节的其余部分将引用此场景。) 下图高度概括了此场景。
在此场景中,存在以下实体:
-
用户(Bob)。
-
IAM 角色 (
BobUserRole
)。Bob 在运行时担任此角色。 -
IAM 策略(
BobAccessPolicy
)。此策略附加到BobUserRole
。BobAccessPolicy
定义允许BobUserRole
访问的 DynamoDB 和 DAX 资源。 -
DAX 集群 (
DAXCluster01
)。 -
IAM 服务角色 (
DAXServiceRole
)。此角色允许DAXCluster01
访问 DynamoDB。 -
IAM 策略(
DAXAccessPolicy
)。此策略附加到DAXServiceRole
。DAXAccessPolicy
定义允许DAXCluster01
访问的 DynamoDB API 和资源。 -
DynamoDB 表 (
Books
)。
BobAccessPolicy
和 DAXAccessPolicy
中的策略语句组合确定 Bob 可以对 Books
表执行的操作。例如,Bob 可以直接访问(使用 DynamoDB 端点)、间接访问(使用 DAX 集群)或者同时直接和间接访问 Books
。Bob 或许还可以从 Books
读取数据,向 Books
写入数据,或者同时都执行。
DynamoDB 访问权限,但使用 DAX 时无访问权限
可以允许直接访问 DynamoDB 表,同时阻止使用 DAX 集群间接访问。要直接访问 DynamoDB,BobAccessPolicy
(附加到角色)决定 BobUserRole
的权限。
DynamoDB 只读访权问限(仅)
Bob 可以用 BobUserRole
访问 DynamoDB。附加到此角色 (BobAccessPolicy
) 的 IAM 策略决定 BobUserRole
可以访问的 DynamoDB 表以及 BobUserRole
可以调用的 API。
请考虑 BobAccessPolicy
的以下策略文档。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "DynamoDBAccessStmt", "Effect": "Allow", "Action": [ "dynamodb:GetItem", "dynamodb:BatchGetItem", "dynamodb:Query", "dynamodb:Scan" ], "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Books" } ] }
此文档附加到 BobAccessPolicy
后,将允许 BobUserRole
访问 DynamoDB 端点并对 Books
表执行只读操作。
DAX 未显示在此策略中,因此拒绝通过 DAX 访问。
DynamoDB 读写访问权限(仅)
如果 BobUserRole
需要对 DynamoDB 的读写访问权限,则以下策略将适用。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "DynamoDBAccessStmt", "Effect": "Allow", "Action": [ "dynamodb:GetItem", "dynamodb:BatchGetItem", "dynamodb:Query", "dynamodb:Scan", "dynamodb:PutItem", "dynamodb:UpdateItem", "dynamodb:DeleteItem", "dynamodb:BatchWriteItem", "dynamodb:ConditionCheckItem" ], "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Books" } ] }
DAX 未显示在此策略中,因此拒绝通过 DAX 访问。
访问 DynamoDB 和 DAX
要允许访问 DAX 集群,必须在 IAM 策略中包含特定于 DAX 的操作。
以下特定于 DAX 的操作对应于 DynamoDB API 中与其名称相似的操作:
-
dax:GetItem
-
dax:BatchGetItem
-
dax:Query
-
dax:Scan
-
dax:PutItem
-
dax:UpdateItem
-
dax:DeleteItem
-
dax:BatchWriteItem
-
dax:ConditionCheckItem
dax:EnclosingOperation
条件键也是如此。
DynamoDB 只读访问权限和 DAX 只读访问权限
假设 Bob 需要通过 DynamoDB 和 DAX 对 Books
表进行只读访问。下面的策略(已附加到 BobUserRole
)将授予此访问权限。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "DAXAccessStmt", "Effect": "Allow", "Action": [ "dax:GetItem", "dax:BatchGetItem", "dax:Query", "dax:Scan" ], "Resource": "arn:aws:dax:us-west-2:123456789012:cache/DAXCluster01" }, { "Sid": "DynamoDBAccessStmt", "Effect": "Allow", "Action": [ "dynamodb:GetItem", "dynamodb:BatchGetItem", "dynamodb:Query", "dynamodb:Scan" ], "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Books" } ] }
该策略具有针对 DAX 访问的一个声明 (DAXAccessStmt
) 和针对 DynamoDBaccess 的另一个声明 (DynamoDBAccessStmt
)。这些声明将允许 Bob 将 GetItem
、BatchGetItem
、Query
和 Scan
请求发送到 DAXCluster01
。
但是,DAXCluster01
的服务角色还需要对 DynamoDB 中 Books
表的只读访问权限。下面附加到 DAXServiceRole
的 IAM 策略将满足此要求。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "DynamoDBAccessStmt", "Effect": "Allow", "Action": [ "dynamodb:GetItem", "dynamodb:BatchGetItem", "dynamodb:Query", "dynamodb:Scan" ], "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Books" } ] }
DynamoDB 读写访问和使用 DAX 时只读访问权限
对于给定用户角色,可以提供对 DynamoDB 表的读写访问权限,同时还允许通过 DAX 进行只读访问。
对于 Bob,BobUserRole
的 IAM 策略需要允许对 Books
表的 DynamoDB 读写操作,同时还支持通过 DAXCluster01
执行只读操作。
BobUserRole
的以下示例策略文档授予此访问权限。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "DAXAccessStmt", "Effect": "Allow", "Action": [ "dax:GetItem", "dax:BatchGetItem", "dax:Query", "dax:Scan" ], "Resource": "arn:aws:dax:us-west-2:123456789012:cache/DAXCluster01" }, { "Sid": "DynamoDBAccessStmt", "Effect": "Allow", "Action": [ "dynamodb:GetItem", "dynamodb:BatchGetItem", "dynamodb:Query", "dynamodb:Scan", "dynamodb:PutItem", "dynamodb:UpdateItem", "dynamodb:DeleteItem", "dynamodb:BatchWriteItem", "dynamodb:DescribeTable", "dynamodb:ConditionCheckItem" ], "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Books" } ] }
此外,DAXServiceRole
还需要允许 DAXCluster01
对 Books
表执行只读操作的 IAM 策略。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "DynamoDBAccessStmt", "Effect": "Allow", "Action": [ "dynamodb:GetItem", "dynamodb:BatchGetItem", "dynamodb:Query", "dynamodb:Scan", "dynamodb:DescribeTable" ], "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Books" } ] }
DynamoDB 读写访问权限和 DAX 读写访问权限
现在假设 Bob 需要直接通过 DynamoDB 或间接通过 DAXCluster01
对 Books
表进行读写访问。下面的策略文档(已附加到 BobAccessPolicy
)授予此访问权限。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "DAXAccessStmt", "Effect": "Allow", "Action": [ "dax:GetItem", "dax:BatchGetItem", "dax:Query", "dax:Scan", "dax:PutItem", "dax:UpdateItem", "dax:DeleteItem", "dax:BatchWriteItem", "dax:ConditionCheckItem" ], "Resource": "arn:aws:dax:us-west-2:123456789012:cache/DAXCluster01" }, { "Sid": "DynamoDBAccessStmt", "Effect": "Allow", "Action": [ "dynamodb:GetItem", "dynamodb:BatchGetItem", "dynamodb:Query", "dynamodb:Scan", "dynamodb:PutItem", "dynamodb:UpdateItem", "dynamodb:DeleteItem", "dynamodb:BatchWriteItem", "dynamodb:DescribeTable", "dynamodb:ConditionCheckItem" ], "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Books" } ] }
此外,DAXServiceRole
还需要允许 DAXCluster01
对 Books
表执行读/写操作的 IAM 策略。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "DynamoDBAccessStmt", "Effect": "Allow", "Action": [ "dynamodb:GetItem", "dynamodb:BatchGetItem", "dynamodb:Query", "dynamodb:Scan", "dynamodb:PutItem", "dynamodb:UpdateItem", "dynamodb:DeleteItem", "dynamodb:BatchWriteItem", "dynamodb:DescribeTable" ], "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Books" } ] }
通过 DAX 访问 DynamoDB 的权限,但无 DynamoDB 直接访问权限
在此方案中,Bob 可通过 DAX 访问 Books
表,但对 DynamoDB 中的 Books
表没有直接访问权限。因此,当 Bob 获得对 DAX 的访问权限时,还将获得对自己可能无法访问的 DynamoDB 表的访问权限。为 DAX 服务角色配置 IAM 策略时,请记住,通过用户访问策略获得对 DAX 集群访问权限的任何用户都将获得对该策略中所指定表的访问权限。在此情况下,BobAccessPolicy
获得对 DAXAccessPolicy
中指定表的访问权限。
如果使用 IAM 角色和策略限制对 DynamoDB 表和数据的访问,那么使用 DAX 可以推翻这些策略。在下面的策略中,Bob 可通过 DAX 访问 DynamoDB 表,但对 DynamoDB 中的同一表没有显式直接访问权限。
下面附加到 BobAccessPolicy
的策略文档 (BobUserRole
) 将授予此访问权限。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "DAXAccessStmt", "Effect": "Allow", "Action": [ "dax:GetItem", "dax:BatchGetItem", "dax:Query", "dax:Scan", "dax:PutItem", "dax:UpdateItem", "dax:DeleteItem", "dax:BatchWriteItem", "dax:ConditionCheckItem" ], "Resource": "arn:aws:dax:us-west-2:123456789012:cache/DAXCluster01" } ] }
在此访问策略中,没有直接访问 DynamoDB 的权限。
与 BobAccessPolicy
结合使用时,以下 DAXAccessPolicy
授予 BobUserRole
对 DynamoDB 表 Books
的访问权限,即使 BobUserRole
无法直接访问 Books
表。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "DynamoDBAccessStmt", "Effect": "Allow", "Action": [ "dynamodb:GetItem", "dynamodb:BatchGetItem", "dynamodb:Query", "dynamodb:Scan", "dynamodb:PutItem", "dynamodb:UpdateItem", "dynamodb:DeleteItem", "dynamodb:BatchWriteItem", "dynamodb:DescribeTable", "dynamodb:ConditionCheckItem" ], "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Books" } ] }
如此示例所示,为用户访问策略和 DAX 集群访问策略配置访问控制时,必须完全理解端到端访问以确保符合最低权限原则。此外,还应确保向用户授予对 DAX 集群的访问权限不会推翻之前确立的访问控制策略。