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

DAX 访问控制

DynamoDB Accelerator (DAX) 设计为与 DynamoDB 结合使用,将缓存层无缝添加到应用程序。但是,DAX 和 DynamoDB 具有单独的访问控制机制。这两种服务都使用 Amazon 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 集群。

例如,假设要将 DAXCluster01 访问权授予 IAM 用户 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 角色,而不是 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,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 将 GetItemBatchGetItemQuery 和 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 还需要允许 DAXCluster01Books 表执行只读操作的 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 或间接通过 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 策略。

{ "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 集群的访问权限不会推翻之前确立的访问控制策略。