DAX 访问控制 - Amazon DynamoDB
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

DAX 访问控制

DynamoDB Accelerator (DAX) 设计为与 DynamoDB 结合使用,以将缓存层无缝添加到您的应用程序。但是,DAX 和 DynamoDB 具有单独的访问控制机制。这两种服务都使用 Amazon Identity and Access Management (IAM) 实施其各自的安全策略,但 DAX 和 DynamoDB 的安全模型不同。

我们强烈建议了解这两种安全模型,为使用 DAX 的应用程序实施正确的安全措施。

本节介绍 DAX 提供的访问控制机制,提供可根据需求定制的示例 IAM policy。

利用 DynamoDB 可以创建 IAM policy,限制用户可对各个 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 policy 的权限。因此,通过 DAX 访问 DynamoDB 表,唯一有效的访问控制是 DAX 集群的 IAM policy 中的权限。其他任何权限都不受认可。

如果需要隔离,我们建议创建额外 DAX 集群并相应地为每个集群确定 IAM policy 的范围。例如,可以创建多个 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 policy 文档中介绍。下面是示例策略文档。

{ "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 policy

创建 DAX 集群后,需要为用户授权,使其可访问 DAX 集群。

例如,假设要将 DAXCluster01 的访问权限授予名为 Alice 的用户。首先创建一个 IAM policy (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 policy。(本节的其余部分将引用此场景。) 下图高度概括此场景。

在此场景中,存在以下实体:

  • 用户(Bob)。

  • IAM 角色 (BobUserRole)。Bob 在运行时担任此角色。

  • IAM policy(BobAccessPolicy)。此策略附加到 BobUserRoleBobAccessPolicy 定义允许 BobUserRole 访问的 DynamoDB 和 DAX 资源。

  • DAX 集群 (DAXCluster01)。

  • IAM 服务角色 (DAXServiceRole)。此角色允许 DAXCluster01 访问 DynamoDB。

  • IAM policy(DAXAccessPolicy)。此策略附加到 DAXServiceRoleDAXAccessPolicy 定义允许 DAXCluster01 访问的 DynamoDB API 和资源。

  • DynamoDB 表 (Books)。

BobAccessPolicyDAXAccessPolicy 中的策略语句组合确定 Bob 可以对 Books 表执行的操作。例如,Bob 可以直接访问(使用 DynamoDB 端点)、间接访问(使用 DAX 集群)或者同时直接和间接访问 Books。Bob 或许还可以从 Books 读取数据,向 Books 写入数据,或者同时都执行。

DynamoDB 访问权限,但使用 DAX 时无访问权限

可以允许直接访问 DynamoDB 表,同时阻止使用 DAX 集群间接访问。要直接访问 DynamoDB,BobAccessPolicy(附加到角色)决定 BobUserRole 的权限。

DynamoDB 只读访权问限(仅)

Bob 可以用 BobUserRole 访问 DynamoDB。附加到此角色 (BobAccessPolicy) 的 IAM policy 决定 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 policy 中包含特定于 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 将 GetItemBatchGetItemQuery 和 Scan 请求发送到 DAXCluster01

但是,DAXCluster01 的服务角色还需要对 DynamoDB 中 Books 表的只读访问权限。下面附加到 DAXServiceRole 的 IAM policy 将满足此要求。

{ "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 policy 需要允许对 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 还需要允许 DAXCluster01Books 表执行只读操作的 IAM policy。

{ "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 或间接通过 DAXCluster01Books 表进行读写访问。下面的策略文档(已附加到 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 还需要允许 DAXCluster01Books 表执行只读操作的 IAM policy。

{ "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 policy 时,请记住,通过用户访问策略获得对 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 集群的访问权限不会推翻之前确立的访问控制策略。