

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

# 使用标签控制对 KMS 密钥的访问
<a name="tag-authorization"></a>

您可以 AWS KMS keys 根据 KMS 密钥上的标签控制对的访问权限。例如，您可以编写 IAM policy，以允许委托人仅启用和禁用具有特定标签的 KMS 密钥。或者，您可以使用 IAM policy 防止委托人在加密操作中使用 KMS 密钥，除非 KMS 密钥具有特定标签。

此功能是对[基于属性的访问控制](abac.md) (ABAC) 的 AWS KMS 支持的一部分。有关使用标签控制 AWS 资源访问的信息，请参阅 [ABAC 有什么用 AWS](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction_attribute-based-access-control.html)？ 以及[使用 *IAM 用户指南*中的资源标签控制对资源的访问](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_tags.html)权限。 AWS 要获取有关解决与 ABAC 相关的访问问题的帮助，请参阅 [对 ABAC 进行故障排除 AWS KMS](troubleshooting-tags-aliases.md)。

**注意**  
标签和别名的更改最多可能需要 5 分钟的时间才能影响 KMS 密钥授权。最近的更改可能会在 API 操作中显示，然后才会影响授权。

AWS KMS 支持 aws[:ResourceTag/*tag-key*](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-resourcetag) [全局条件上下文密钥](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html)，它允许您根据 KMS 密钥上的标签控制对 KMS 密钥的访问。由于多个 KMS 密钥可以具有相同的标签，此功能可使您将权限应用于一组选定的 KMS 密钥。您还可以通过更改 KMS 密钥的标签轻松更改集合中的 KMS 密钥。

在中 AWS KMS，`aws:ResourceTag/tag-key`条件密钥仅在 IAM 策略中受支持。密钥策略（仅适用于一个 KMS 密钥）或不使用特定 KMS 密钥的操作（例如[ListKeys](https://docs.aws.amazon.com/kms/latest/APIReference/API_ListKeys.html)或[ListAliases](https://docs.aws.amazon.com/kms/latest/APIReference/API_ListAliases.html)操作）不支持它。

使用标签控制访问提供了一种简单、可扩展且灵活的方式来管理权限。但是，如果设计和管理不当，它可能会无意中允许或拒绝对您的 KMS 密钥的访问。如果您使用标签来控制访问，请考虑以下做法。
+ 使用标签来强化[最低权限访问](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege)的最佳实践。仅为 IAM 委托人授予他们对必须使用或管理的 KMS 密钥的所需权限。例如，使用标签来标记用于项目的 KMS 密钥。然后授予项目团队仅使用带有项目标签的 KMS 密钥的权限。
+ 谨慎为委托人提供 `kms:TagResource` 和 `kms:UntagResource` 权限，以允许他们添加、编辑和删除标签。当您使用标签控制对 KMS 密钥的访问时，更改标签可以授予委托人使用他们没有权限使用的 KMS 密钥的权限。它还可以拒绝对其他委托人执行其工作所需的 KMS 密钥的访问。不具有更改密钥策略或创建授权权限的密钥管理员可以控制对 KMS 密钥的访问，前提是他们有权管理标签。

  如有可能，请使用策略条件，例如 `aws:RequestTag/tag-key` 或 `aws:TagKeys`，以[将委托人的标记权限限制](tag-permissions.md#tag-permissions-conditions)为特定 KMS 密钥上的特定标签或标签模式。
+ 查看您中当前拥有标记和取消标记权限 AWS 账户 的委托人，并在必要时对其进行调整。例如，控制台[密钥管理员的默认密钥策略](key-policy-default.md#key-policy-default-allow-administrators)包括对该 KMS 密钥的 `kms:TagResource` 和 `kms:UntagResource` 权限。IAM policy 可能允许对所有 KMS 密钥的标记和取消标记权限。例如，[AWSKeyManagementServicePowerUser](security-iam-awsmanpol.md#security-iam-awsmanpol-AWSKeyManagementServicePowerUser)托管策略允许委托人标记、取消标记和列出所有 KMS 密钥上的标签。
+ 在设置依赖于标签的策略之前，请查看您的 KMS 密钥上的标签 AWS 账户。请确保您的策略仅适用于您要包含的标签。使用[CloudTrail 日志](logging-using-cloudtrail.md)和[CloudWatch 警报](monitoring-overview.md)提醒您注意可能影响您的 KMS 密钥访问权限的标签更改。
+ 基于标签的策略条件使用模式匹配；它们不绑定到标签的特定实例。使用基于标签的条件键的策略会影响与模式匹配的所有新标签和现有标签。如果删除并重新创建与策略条件匹配的标签，则该条件将应用于新标签，就像对旧标签一样。

例如，请考虑以下 IAM policy。它允许委托人仅对您账户中位于亚太（新加坡）地区[GenerateDataKeyWithoutPlaintext](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKeyWithoutPlaintext.html)且有标签的 KMS 密钥调用和[解](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html)密操作。`"Project"="Alpha"`您可以将此策略附加到示例 Alpha 项目中的角色。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "IAMPolicyWithResourceTag",
      "Effect": "Allow",
      "Action": [
        "kms:GenerateDataKeyWithoutPlaintext",
        "kms:Decrypt"
      ],
      "Resource": "arn:aws:kms:ap-southeast-1:111122223333:key/*",
      "Condition": {
        "StringEquals": {
          "aws:ResourceTag/Project": "Alpha"
        }
      }
    }
  ]
}
```

------

以下示例 IAM policy 允许委托人使用账户中的 KMS 密钥执行特定加密操作。但它禁止主体对具有 `"Type"="Reserved"` 标签或不包含 `"Type"` 标签的 KMS 密钥使用这些加密操作。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "IAMAllowCryptographicOperations",
      "Effect": "Allow",
      "Action": [
        "kms:Encrypt",
        "kms:GenerateDataKey*",
        "kms:Decrypt",
        "kms:ReEncrypt*"
      ],
      "Resource": "arn:aws:kms:*:111122223333:key/*"
    },
    {
      "Sid": "IAMDenyOnTag",
      "Effect": "Deny",
      "Action": [
        "kms:Encrypt",
        "kms:GenerateDataKey*",
        "kms:Decrypt",
        "kms:ReEncrypt*"
      ],
      "Resource": "arn:aws:kms:*:111122223333:key/*",
      "Condition": {
        "StringEquals": {
          "aws:ResourceTag/Type": "Reserved"
        }
      }
    },
    {
      "Sid": "IAMDenyNoTag",
      "Effect": "Deny",
      "Action": [
        "kms:Encrypt",
        "kms:GenerateDataKey*",
        "kms:Decrypt",
        "kms:ReEncrypt*"
      ],
      "Resource": "arn:aws:kms:*:111122223333:key/*",
      "Condition": {
        "Null": {
          "aws:ResourceTag/Type": "true"
        }
      }
    }
  ]
}
```

------