

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

# ABAC for Amazon KMS
<a name="abac"></a>

基于属性的访问控制 (ABAC) 是一种基于属性定义权限的授权策略。 Amazon KMS 支持 ABAC，允许您根据与 KMS 密钥关联的标签和别名来控制对客户托管密钥的访问。启用 ABAC 的标签和别名条件密钥 Amazon KMS 提供了一种强大而灵活的方式来授权委托人使用 KMS 密钥，而无需编辑策略或管理授权。但是，您应该小心使用这些功能，以免委托人无意中允许或拒绝访问。

如果您使用 ABAC，请注意管理标签和别名的权限现在是访问控制权限。在部署依赖于标签或别名的策略之前，请确保您知道所有 KMS 密钥上的现有标签和别名。添加、删除和更新别名，以及标记和取消标记密钥时，采取合理的预防措施。仅授予需要管理标签和别名权限的委托人该权限，并限制他们可以管理的标签和别名。

**注意**  
使用 ABAC 时 Amazon KMS，请谨慎行事，不要授予委托人管理标签和别名的权限。更改标签或别名可以允许或拒绝对 KMS 密钥的权限。不具有更改密钥策略或创建授权权限的密钥管理员可以控制对 KMS 密钥的访问，前提是他们有权管理标签或别名。  
标签和别名的更改最多可能需要 5 分钟的时间才能影响 KMS 密钥授权。最近的更改可能会在 API 操作中显示，然后才会影响授权。  
要根据 KMS 密钥别名控制对它的访问权限，必须使用条件键。您不能使用别名来表示策略语句的 `Resource` 元素中的 KMS 密钥元素。当别名出现在 `Resource` 元素时，策略语句将应用于别名，而不是关联的 KMS 密钥。

**了解详情**
+ 有关 Amazon KMS 支持 ABAC 的详细信息（包括示例），请参阅[使用别名控制对 KMS 密钥的访问](alias-authorization.md)和。[使用标签控制对 KMS 密钥的访问](tag-authorization.md)
+ 有关使用标签控制 Amazon 资源访问的更多一般信息，请参阅 [ABAC 有什么用 Amazon](https://docs.amazonaws.cn/IAM/latest/UserGuide/introduction_attribute-based-access-control.html)？ 以及[使用 *IAM 用户指南*中的资源标签控制对资源的访问](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_tags.html)权限。 Amazon 

## ABAC 条件键适用于 Amazon KMS
<a name="about-abac-kms"></a>

要根据 KMS 密钥的标签和别名授权访问 KMS 密钥，请在密钥政策或 IAM policy 中使用以下条件键。


| ABAC 条件键 | 说明 | 策略类型 | Amazon KMS 操作 | 
| --- | --- | --- | --- | 
| [aws：ResourceTag](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-resourcetag) | KMS 密钥上的标签（键和值）与策略中的标签（键和值）或标签模式匹配 | 仅限 IAM policy | KMS 密钥资源操作 2 | 
| [aws:RequestTag/*tag*-key](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-requesttag) | 请求中的标签（键和值）与策略中的标签（键和值）或标签模式匹配 | 密钥政策和 IAM policy 1 | [TagResource](https://docs.amazonaws.cn/kms/latest/APIReference/API_TagResource.html), [UntagResource](https://docs.amazonaws.cn/kms/latest/APIReference/API_UntagResource.html) | 
| [aws：TagKeys](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-tagkeys) | 请求中的标签键与策略中的标签键匹配 | 密钥政策和 IAM policy 1 | [TagResource](https://docs.amazonaws.cn/kms/latest/APIReference/API_TagResource.html), [UntagResource](https://docs.amazonaws.cn/kms/latest/APIReference/API_UntagResource.html) | 
| [kms: ResourceAliases](conditions-kms.md#conditions-kms-resource-aliases) | 与 KMS 密钥关联的别名与策略中的别名或别名模式匹配 | 仅限 IAM policy | KMS 密钥资源操作 2 | 
| [kms: RequestAlias](conditions-kms.md#conditions-kms-request-alias) | 表示请求中的 KMS 密钥的别名与策略中的别名或别名模式匹配。 | 密钥政策和 IAM policy 1 | [加密操作](kms-cryptography.md#cryptographic-operations)，，[DescribeKey[GetPublicKey](https://docs.amazonaws.cn/kms/latest/APIReference/API_GetPublicKey.html)](https://docs.amazonaws.cn/kms/latest/APIReference/API_DescribeKey.html) | 

1 任何可在密钥政策中使用的条件键也可以在 IAM policy 中使用，但只有在[密钥政策允许它](key-policy-default.md#key-policy-default-allow-root-enable-iam)时。

2 *KMS 密钥资源操作*是特定 KMS 密钥授权的操作。若要标识 KMS 密钥资源操作，请在 [Amazon KMS 权限表](kms-api-permissions-reference.md#kms-api-permissions-reference-table)中，在操作的 `Resources` 列中查找的 KMS 密钥的值。

例如，您可以使用这些条件键创建以下策略。
+ 具有 `kms:ResourceAliases` 的 IAM policy，可授予将 KMS 密钥与特定别名或别名模式结合使用的权限。这与依赖标签的策略略有不同：尽管您可以在策略中使用别名模式，但每个别名在 Amazon Web Services 账户 和区域中都必须是唯一的。这允许您对一组选定的 KMS 密钥应用策略，而无需在策略声明中列出 KMS 密钥 ARNs 的密钥。要从集中添加或删除 KMS 密钥，请更改 KMS 密钥的别名。
+ 带有 `kms:RequestAlias` 的密钥策略，可允许委托人在 `Encrypt` 操作中使用 KMS 密钥，但前提是仅当 `Encrypt` 请求使用该别名标识 KMS 密钥时。
+ 带有 `aws:ResourceTag/tag-key` 的 IAM policy，可拒绝将 KMS 密钥与特定标签键和标签值结合使用的权限。这使您可以将策略应用于一组选定的 KMS 密钥，而无需在策略声明中列出 KMS 密钥的密钥。 ARNs 要在集中添加或删除 KMS 密钥，请标记或取消标记 KMS 密钥。
+ 带有 `aws:RequestTag/tag-key` 的 IAM policy，可允许委托人仅删除 `"Purpose"="Test"` KMS 密钥标签。
+ 带有 `aws:TagKeys` 的 IAM policy，可拒绝使用 `Restricted` 标签键标记或取消标记 KMS 密钥的权限。

ABAC 使访问管理具有灵活性和可扩展性。例如，您可以使用 `aws:ResourceTag/tag-key` 条件键创建 IAM policy，该策略允许委托人仅在 KMS 密钥具有 `Purpose=Test` 标签时将 KMS 密钥用于特定操作。该策略适用于 Amazon Web Services 账户的所有区域中的所有 KMS 密钥。

当附加到用户或角色时，以下 IAM policy 允许委托人将带有 `Purpose=Test` 标签的所有现有 KMS 密钥用于指定操作。要提供对新的或现有 KMS 密钥的访问权限，您不需要更改策略。只需将 `Purpose=Test` 标签附加到 KMS 密钥。同样，要从具有 `Purpose=Test` 标签的 KMS 密钥中删除此访问权限，请编辑或删除标签。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AliasBasedIAMPolicy",
      "Effect": "Allow",
      "Action": [
        "kms:Decrypt",
        "kms:Encrypt",
        "kms:GenerateDataKey*",
        "kms:DescribeKey"
      ],
      "Resource": "arn:aws:kms:*:111122223333:key/*",
      "Condition": {
        "StringEquals": {
          "aws:ResourceTag/Purpose": "Test"
        }
      }
    }
  ]
}
```

------

但是，如果您使用此功能，在管理标记和别名时要加小心。添加、更改或删除标签或别名可能会无意中允许或拒绝对 KMS 密钥的访问。不具有更改密钥策略或创建授权权限的密钥管理员可以控制对 KMS 密钥的访问，前提是他们有权管理标签和别名。为了减轻这种风险，请考虑[限制管理标签的权限](tag-permissions.md#tag-permissions-conditions)和[别名](alias-access.md#alias-access-limiting)。例如，您可能想要仅允许特色级委托人管理 `Purpose=Test` 标签。有关详细信息，请参阅 [使用别名控制对 KMS 密钥的访问](alias-authorization.md) 和 [使用标签控制对 KMS 密钥的访问](tag-authorization.md)。

## 标签还是别名？
<a name="abac-tag-or-alias"></a>

Amazon KMS 支持带有标签和别名的 ABAC。这两种选项都提供了灵活、可扩展的访问控制策略，但它们彼此略有不同。

您可以根据自己的特定使用模式决定使用标签或 Amazon 使用别名。例如，如果您已经向大多数管理员授予了标记权限，则基于别名控制授权策略可能会更容易。或者，如果您接近[每个 KMS 密钥的别名数量](resource-limits.md#aliases-per-key)配额，您可能更喜欢基于标签的授权策略。

以下益处是大家都感兴趣的。

**基于标签的访问控制的益处**
+ 对不同类型的 Amazon 资源使用相同的授权机制。

  您可以使用相同的标签或标签键来控制对多种资源类型的访问，例如 Amazon Relational Database Service（Amazon RDS）集群、Amazon Elastic Block Store（Amazon EBS）卷和 KMS 密钥。此功能支持多种不同的授权模型，这些模型比传统的基于角色的访问控制更加灵活。
+ 授权访问一组 KMS 密钥。

  您可以使用标签来管理对同一 Amazon Web Services 账户 和区域中的一组 KMS 密钥的访问权限。将相同的标签或标签键分配给您选择的 KMS 密钥。然后创建一个基于标签或标签密钥的简单 easy-to-maintain策略声明。要在授权组中添加或删除 KMS 密钥，请添加或删除标签；您无需编辑策略。

**基于别名的访问控制的益处**
+ 根据别名授权对加密操作的访问。

  大多数基于请求的属性策略条件，包括 a [ws:RequestTag/*tag-key*](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-requesttag)，仅影响添加、编辑或删除属性的操作。但是 k [ms: RequestAlias](conditions-kms.md#conditions-kms-request-alias) 条件密钥根据用于在请求中识别 KMS 密钥的别名来控制对加密操作的访问。例如，您可以授予委托人在 `Encrypt` 操作中使用 KMS 密钥的权限，但只有当 `KeyId` 参数的值为 `alias/restricted-key-1` 时。要满足此条件，需要以下所有条件：
  + KMS 密钥必须与该别名相关联。
  + 请求必须使用别名来标识 KMS 密钥。
  + 委托人必须拥有使用受 `kms:RequestAlias` 条件约束的 KMS 密钥的权限。

  如果您的应用程序通常使用别名或别名来引用 KMS 密钥 ARNs ，则此功能特别有用。
+ 提供非常有限的权限。

  在 Amazon Web Services 账户 和区域中，别名必须是唯一的。因此，基于别名授予委托人访问 KMS 密钥的权限可能比基于标签授予他们访问权限更严格。与别名不同，标签可分配给同一账户和区域中的多个 KMS 密钥。如果选择，则可以使用别名模式（例如 `alias/test*`）为委托人授予对同一账户和区域中一组 KMS 密钥的访问权限。但是，允许或拒绝访问特定别名允许对 KMS 密钥进行非常严格的控制。