

# 将基于属性的访问权限控制与 DynamoDB 结合使用
<a name="attribute-based-access-control"></a>

[基于属性的访问权限控制（ABAC）](https://docs.amazonaws.cn/IAM/latest/UserGuide/introduction_attribute-based-access-control.html)是一种授权策略，它根据基于身份的策略或其它 Amazon 策略（例如基于资源的策略和组织 IAM 策略）中的[标签条件](https://docs.amazonaws.cn/amazondynamodb/latest/developerguide/Tagging.html)来定义访问权限。可以将标签附加到 DynamoDB 表，然后根据基于标签的条件来对这些表进行评估。与表关联的索引会继承您添加到表的标签。最多可以为每个 DynamoDB 表添加 50 个标签。表中所有标签支持的最大大小为 10 KB。有关为 DynamoDB 资源添加标签和为限制添加标签的更多信息，请参阅[在 DynamoDB 中为资源添加标签](https://docs.amazonaws.cn/amazondynamodb/latest/developerguide/Tagging.Operations.html)和 [DynamoDB 中的标签限制](Tagging.md#TaggingRestrictions)。

有关使用标签控制对 Amazon 资源的访问权限的更多信息，请参阅《IAM 用户指南》中的以下主题：
+ [什么是适用于 Amazon 的 ABAC](https://docs.amazonaws.cn/IAM/latest/UserGuide/introduction_attribute-based-access-control.html)
+ [使用标签控制对 Amazon 资源的访问](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_tags.html)

使用 ABAC，可以为团队和应用程序强制使用不同的访问级别，以便使用更少的策略对 DynamoDB 表执行操作。可以在 IAM 策略的[条件元素](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_elements_condition.html)中指定一个标签，来控制对 DynamoDB 表或索引的访问权限。这些条件决定了 IAM 主体、用户或角色对 DynamoDB 表和索引拥有的访问级别。当 IAM 主体向 DynamoDB 提出访问请求时，将根据 IAM 策略中的标签条件评估资源和身份的标签。此后，只有在满足标签条件时，该策略才会生效。这使您能够创建可有效说明以下内容之一的 IAM 策略：
+ *支持用户仅管理那些具有标签（键为 `X` 和值为 `Y`）的资源*。
+ *拒绝所有用户访问用键 `X` 标记的资源*。

例如，可以创建一个策略，仅在表具有以下标签键值对时才支持用户更新该表：`"environment": "staging"`。可以使用 [aws:ResourceTag](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-resourcetag) 条件键，基于附加到表的标签来支持或拒绝访问该表。

可以在创建策略时包括基于属性的条件，也可以稍后使用 Amazon Web Services 管理控制台、Amazon API、Amazon Command Line Interface（Amazon CLI）、Amazon SDK 或 Amazon CloudFormation 来包括这些条件。

以下示例支持对名为 `MusicTable` 的表执行 [UpdateItem](https://docs.amazonaws.cn/amazondynamodb/latest/APIReference/API_UpdateItem.html) 操作，前提是该表包含名称为 `environment` 和值为 `production` 的标签键。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "dynamodb:UpdateItem"
      ],
      "Resource": "arn:aws:dynamodb:*:*:table/MusicTable",
      "Condition": {
        "StringEquals": {
          "aws:ResourceTag/environment": "production"
        }
      }
    }
  ]
}
```

------

**Topics**
+ [为什么应该使用 ABAC？](#why-use-abac)
+ [使用 DynamoDB 实施 ABAC 的条件键](#condition-keys-implement-abac)
+ [将 ABAC 与 DynamoDB 结合使用的注意事项](#abac-considerations)
+ [在 DynamoDB 中启用 ABAC](abac-enable-ddb.md)
+ [将 ABAC 与 DynamoDB 表和索引结合使用](abac-implementation-ddb-tables.md)
+ [将 ABAC 与 DynamoDB 表和索引结合使用的示例](abac-example-use-cases.md)
+ [排除 DynamoDB 表和索引的常见 ABAC 错误](abac-troubleshooting.md)

## 为什么应该使用 ABAC？
<a name="why-use-abac"></a>
+ **更简单的策略管理：**您使用的策略将更少，因为您不必创建不同的策略来定义每个 IAM 主体的访问级别。
+ **可扩展的访问权限控制：**使用 ABAC 可以更轻松地扩展访问权限控制，因为您不必在创建新的 DynamoDB 资源时更新策略。可以使用标签来向包含的标签与资源标签匹配的 IAM 主体授予访问权限。您可以加入新的 IAM 主体或 DynamoDB 资源，并应用适当的标签来自动授予必要的权限，而不必进行任何策略更改。
+ **精细的权限管理：**最佳实践是在创建策略时[授予最低权限](https://docs.amazonaws.cn/IAM/latest/UserGuide/best-practices.html#grant-least-privilege)。使用 ABAC，您可以为 IAM 主体创建标签，并使用它们来授予对与 IAM 主体上的标签匹配的特定操作和资源的访问权限。
+ **与公司目录保持一致：**可以将标签与公司目录中的现有员工属性进行映射，以使访问权限控制策略与组织结构保持一致。

## 使用 DynamoDB 实施 ABAC 的条件键
<a name="condition-keys-implement-abac"></a>

可以在 Amazon 策略中使用以下条件键来控制对 DynamoDB 表和索引的访问级别：
+ [aws:ResourceTag/tag-key](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-resourcetag)：根据 DynamoDB 表或索引上的标签键值对是否与策略中的标签键和值匹配来控制访问权限。此条件键与对现有表或索引进行操作的所有 API 相关。

  对这些 `dynamodb:ResourceTag` 条件的评估就像您没有为资源附加任何标签一样。
+ [aws:RequestTag/tag-key](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-requesttag)：支持将在请求中传递的标签键值对与您在策略中指定的标签对进行比较。此条件键与包含标签作为请求有效载荷一部分的 API 相关。这些 API 包括 [CreateTable](https://docs.amazonaws.cn/amazondynamodb/latest/APIReference/API_CreateTable.html) 和 [TagResource](https://docs.amazonaws.cn/amazondynamodb/latest/APIReference/API_TagResource.html)。
+ [aws:TagKeys](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-tagkeys)：将请求中的标签键与您在策略中指定的键进行比较。此条件键与包含标签作为请求有效载荷一部分的 API 相关。这些标签包括 `CreateTable`、`TagResource` 和 `UntagResource`。

## 将 ABAC 与 DynamoDB 结合使用的注意事项
<a name="abac-considerations"></a>

在将 ABAC 与 DynamoDB 表或索引结合使用时，以下注意事项适用：
+ DynamoDB Streams 不支持添加标签和 ABAC。
+ DynamoDB 备份不支持添加标签和 ABAC。要将 ABAC 用于备份，建议您使用 [Amazon Backup](https://docs.amazonaws.cn/aws-backup/latest/devguide/whatisbackup.html)。
+ 标签不会保留在还原的表中。您需要先向还原的表添加标签，然后才能在策略中使用基于标签的条件。