Amazon DynamoDB
开发人员指南 (API Version 2012-08-10)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

DAX 访问控制

DAX 可与 DynamoDB 结合使用以将缓存层无缝添加到您的应用程序。但是,DAX 和 DynamoDB 是独立的 AWS 服务。即使这两种服务都使用 AWS Identity and Access Management (IAM) 来实施其各自的安全策略,DAX 和 DynamoDB 的安全模型也是不同的。

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

在本节中,我们将介绍 DAX 提供的访问控制机制,并提供您可根据需求定制的示例 IAM 策略。

利用 DynamoDB,您可创建 IAM 策略来限制用户可对各个 DynamoDB 资源执行的操作。例如,您可创建仅允许用户对特定 DynamoDB 表执行只读操作的用户角色。(有关更多信息,请参阅 Amazon DynamoDB 的身份验证和访问控制。)相比之下,DAX 安全模型专注于集群安全以及集群代表您执行 DynamoDB API 操作的能力。

警告

如果您目前使用 IAM 角色和策略来限制对 DynamoDB 表数据的访问,那么使用 DAX 可能推翻这些策略。例如,某用户可通过 DAX 访问 DynamoDB 表,但对直接访问 DynamoDB 的同一表没有显式访问权限。(有关更多信息,请参阅 Amazon DynamoDB 的身份验证和访问控制。)

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 的示例信任关系文档:

Copy
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "dax.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }

此信任关系允许 DAX 集群担任 DAXServiceRole 并代表您执行 DynamoDB API 调用。

附加到 DAXServiceRole 的 IAM 策略文档中介绍了允许的 DynamoDB API 操作。下面是示例策略文档:

Copy
{ "Version": "2012-10-17", "Statement": [ { "Sid": "DaxAccessPolicy", "Effect": "Allow", "Action": [ "dynamodb:*" ], "Resource": [ "arn:aws:dynamodb:us-west-2:123456789012:table/Books" ] } ] }

此策略允许 DAX 对名为 Books 的 DynamoDB 表 (位于 us-west-2 区域且由 AWS 账户 ID 123456789012 所有) 执行所有 DynamoDB API 操作。

用于允许 DAX 集群访问的 IAM 策略

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

例如,假设您要向名为 Alice 的 IAM 用户授予对 DAXCluster01 的访问权限。首先,您将创建一个 IAM 策略 (AliceAccessPolicy),该策略定义了接受人可访问的 DAX 集群和 DAX API 操作。之后,您将通过将此策略附加到 Alice 用户来授予访问权限。

以下策略文档为接受人提供了对 DAXCluster01 的完全访问权限:

Copy
{ "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 用户,而可以将它附加到 IAM 角色。这样,担任该角色的所有用户都将具有您在该策略中定义的权限。

该用户策略将与 DAX 服务角色共同确定接受人可通过 DAX 访问的 DynamoDB 资源和 API 操作。

案例研究:访问 DynamoDB 和 DAX

为帮助您进一步了解用于 DAX 的 IAM 策略,我们将介绍一个常见方案。(我们将在本节的剩余部分中引用此方案。)下图高度概括了此方案:

在此方案中,存在以下实体:

  • 一个 IAM 用户 (Bob)。

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

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

  • 一个 DAX 集群 (DAXCluster01)。

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

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

  • 一个 DynamoDB 表 (Books)。

BobAccessPolicyDAXAccessPolicy 中的策略声明的组合确定了 Bob 可对 Books 表执行的操作。例如,Bob 可能能够直接访问 (使用 DynamoDB 终端节点) 和/或间接访问 (使用 DAX 集群) Books。Bob 还可能能够从 Books 读取数据和/或将数据写入到 Books

允许直接访问 DynamoDB,但不允许通过 DAX 访问

可能允许直接访问 DynamoDB 表但同时阻止使用 DAX 集群间接访问。对于对 DynamoDB 的直接访问,BobUserRole 的特权由 BobAccessPolicy (附加到此角色) 确定。

对 DynamoDB 的只读访问 (唯一)

Bob 可使用 BobUserRole 访问 DynamoDB。附加到此角色的 IAM 策略 (BobAccessPolicy) 将确定 BobUserRole 可访问的 DynamoDB 表以及 BobUserRole 可调用的 API。

请考虑 BobAccessPolicy 的以下策略文档:

Copy
{ "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 的读写访问权限,则以下策略将适用:

Copy
{ "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" ], "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

此外,存在不与任何 DynamoDB API 对应的其他 4 个特定于 DAX 的操作:

  • dax:DefineAttributeList

  • dax:DefineAttributeListId

  • dax:DefineKeySchema

  • dax:Endpoints

您必须在允许访问 DAX 集群的任何 IAM 策略中指定这所有 4 个操作。这些操作特定于低级 DAX 数据传输协议。您的应用程序无需担心这些操作 - 这些操作仅在 IAM 策略中使用。

对 DynamoDB 的只读访问和对 DAX 的只读访问

假设 Bob 需要通过 DynamoDB 和 DAX 对 Books 表进行只读访问。以下策略 (已附加到 BobUserRole) 将授予此访问权限:

Copy
{ "Version": "2012-10-17", "Statement": [ { "Sid": "DAXAccessStmt", "Effect": "Allow", "Action": [ "dax:GetItem", "dax:BatchGetItem", "dax:Query", "dax:Scan", "dax:DefineAttributeList", "dax:DefineAttributeListId", "dax:DefineKeySchema", "dax:Endpoints" ], "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) 和针对 DynamoDB 访问的另一个声明 (DynamoDBAccessStmt)。这些声明将允许 Bob 将 GetItemBatchGetItemQuery 和 Scan 请求发送到 DAXCluster01

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

Copy
{ "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 的以下示例策略将授予此访问权限:

Copy
{ "Version": "2012-10-17", "Statement": [ { "Sid": "DAXAccessStmt", "Effect": "Allow", "Action": [ "dax:GetItem", "dax:BatchGetItem", "dax:Query", "dax:Scan", "dax:DefineKeySchema", "dax:DefineAttributeList", "dax:DefineAttributeListId", "dax:Endpoints" ], "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" ], "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Books" } ] }

此外,DAXServiceRole 还需要允许 DAXCluster01Books 表执行只读操作的 IAM 策略:

Copy
{ "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 的策略文档将授予此访问权限:

Copy
{ "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:DefineKeySchema", "dax:DefineAttributeList", "dax:DefineAttributeListId", "dax:Endpoints" ], "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" ], "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Books" } ] }

此外,DAXServiceRole 还需要允许 DAXCluster01Books 表执行读写操作的 IAM 策略:

Copy
{ "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 中的同一表没有显式直接访问权限。

以下附加到 BobUserRole 的策略文档 (BobAccessPolicy) 将授予此访问权限:

Copy
{ "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:DefineKeySchema", "dax:DefineAttributeList", "dax:DefineAttributeListId", "dax:Endpoints" ], "Resource": "arn:aws:dax:us-west-2:123456789012:cache/DAXCluster01" } ] }

请注意,在此访问策略中,没有直接访问 DynamoDB 的权限。

以下 DAXAccessPolicy 将与 BobAccessPolicy 一起为 BobUserRole 提供对 DynamoDB 表 Books 的访问权限,即使 BobUserRole 无法直接访问 Books 表也是如此:

Copy
{ "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 集群访问策略配置访问控制时,您必须完全了解端到端访问才能确保符合最小特权原则。您还必须确保向用户授予对 DAX 集群的访问权限不会推翻之前确立的访问控制策略。