

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

# 使用别名控制对 KMS 密钥的访问
<a name="alias-authorization"></a>

您可以根据与 KMS 密钥关联的别名来控制对 KMS 密钥的访问。为此，请使用 [kms: RequestAlias](conditions-kms.md#conditions-kms-request-alias) 和 [kms: ResourceAliases](conditions-kms.md#conditions-kms-resource-aliases) 条件密钥。此功能是[基于属性的访问控制](abac.md) (ABAC) AWS KMS 支持的一部分。

`kms:RequestAlias` 条件键基于请求中的别名允许或拒绝对 KMS 密钥的访问。`kms:ResourceAliases` 条件键基于与 KMS 密钥关联的别名允许或拒绝对 KMS 密钥的访问。

这些功能不允许您通过使用策略语句的 `resource` 元素中的别名来标识 KMS 密钥。当别名是 `resource` 元素的值时，策略将应用于别名资源，而不是可能与其关联的任何 KMS 密钥。

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

使用别名控制对 KMS 密钥的访问权限时，请考虑以下事项：
+ 使用别名来强化[最低权限访问](iam-policies-best-practices.md)的最佳实践。仅为 IAM 委托人授予他们对必须使用或管理的 KMS 密钥的所需权限。例如，使用别名标识用于项目的 KMS 密钥。然后授予项目团队仅使用带有项目别名的 KMS 密钥的权限。
+ 谨慎为委托人提供 `kms:CreateAlias`、`kms:UpdateAlias` 或 `kms:DeleteAlias` 权限，以允许他们添加、编辑和删除标签。当您使用别名控制对 KMS 密钥的访问时，更改别名可以授予委托人使用他们没有权限使用的 KMS 密钥的权限。它还可以拒绝对其他委托人执行其工作所需的 KMS 密钥的访问。
+ 查看您 AWS 账户 中当前有权管理别名的委托人，并在必要时调整权限。不具有更改密钥策略或创建授权权限的密钥管理员可以控制对 KMS 密钥的访问，前提是他们有权管理别名。

  例如，控制台[密钥管理员的默认密钥策略](key-policy-default.md#key-policy-default-allow-administrators)包括对 `kms:CreateAlias`、`kms:DeleteAlias` 和 `kms:UpdateAlias` 权限。IAM policy 可能会授予对您的 AWS 账户中所有 KMS 密钥的别名权限。例如，[AWSKeyManagementServicePowerUser](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/AWSKeyManagementServicePowerUser)托管策略允许委托人创建、删除和列出所有 KMS 密钥的别名，但不允许对其进行更新。
+ 在设置依赖于别名的策略之前，请查看您 AWS 账户的 KMS 密钥的别名。请确保您的策略仅适用于您要包含的别名。使用[CloudTrail 日志](alias-ct.md)和[CloudWatch 警报](monitoring-cloudwatch.md)提醒您注意可能影响您的 KMS 密钥访问权限的别名更改。此外，[ListAliases](https://docs.aws.amazon.com/kms/latest/APIReference/API_ListAliases.html)响应还包括每个别名的创建日期和上次更新日期。
+ 别名策略条件使用模式匹配；它们不绑定到别名的特定实例。使用基于别名的条件键的策略会影响与模式匹配的所有新别名和现有别名。如果删除并重新创建与策略条件匹配的别名，则该条件将应用于新别名，就像对旧别名一样。

`kms:RequestAlias` 条件键依赖于操作请求中明确指定的别名。`kms:ResourceAliases` 条件键取决于与 KMS 密钥关联的别名，即使它们未出现在请求中。

## kms: RequestAlias
<a name="alias-auth-request-alias"></a>

基于标识请求中的 KMS 密钥的别名，允许或拒绝对 KMS 密钥的访问。您可以在[密钥策略或 IAM 策略中使用 kms: RequestAlias](conditions-kms.md#conditions-kms-request-alias) [条件密钥](key-policies.md)。它适用于在请求中使用别名标识 KMS 密钥的操作，即[加密操作[DescribeKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_DescribeKey.html)](kms-cryptography.md#cryptographic-operations)、和[GetPublicKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GetPublicKey.html)。它对别名操作无效，例如[CreateAlias](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateAlias.html)或[DeleteAlias](https://docs.aws.amazon.com/kms/latest/APIReference/API_DeleteAlias.html)。

**重要**  
不建议使用带有`kms:RequestAlias`条件的`Deny`策略声明，因为呼叫者可以通过使用[密钥 ID、密钥](concepts.md#key-id-key-id) AR [N](concepts.md#key-id-key-ARN) 或其他别名来标识请求中的 KMS 密钥来绕过该声明。要根据与 KMS 密钥关联的别名拒绝访问，请改用 k [ms: ResourceAliases](conditions-kms.md#conditions-kms-resource-aliases) 条件密钥。

在条件键中，指定[别名名称](concepts.md#key-id-alias-name)或别名名称模式。您不能指定[别名 ARN](concepts.md#key-id-alias-ARN)。

例如，以下密钥策略语句允许委托人在 KMS 密钥上使用指定的操作。权限仅在请求使用包含可标识 KMS 密钥的 `alpha` 别名时有效。

```
{
  "Sid": "Key policy using a request alias condition",
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::111122223333:role/alpha-developer"
  },
  "Action": [
    "kms:Decrypt",
    "kms:GenerateDataKey*",
    "kms:DescribeKey"
  ],
  "Resource": "*",
  "Condition": {
    "StringLike": {
      "kms:RequestAlias": "alias/*alpha*"
    }
  }
}
```

以下来自授权委托人的示例请求将满足条件。但是，使用[密钥 ID](concepts.md#key-id-key-id)、[密钥 ARN](concepts.md#key-id-key-ARN) 或者其他别名的请求将无法满足条件，即使这些值标识了相同的 KMS 密钥。

```
$ aws kms describe-key --key-id "arn:aws:kms:us-west-2:111122223333:alias/project-alpha"
```

## kms: ResourceAliases
<a name="alias-auth-resource-aliases"></a>

基于与 KMS 密钥关联的别名允许或拒绝访问 KMS 密钥，即使请求中未使用别名也是如此。k [ms: ResourceAliases](conditions-kms.md#conditions-kms-resource-aliases) 条件密钥允许您指定别名或别名模式，例如`alias/test*`，这样您就可以在 IAM 策略中使用它来控制对同一区域中多个 KMS 密钥的访问权限。它对任何使用 KMS 密钥的 AWS KMS 操作都有效。

例如，以下 IAM 策略允许委托人分两 AWS 账户次调用 KMS 密钥的指定操作。但是，该权限仅适用于与开头为 `restricted` 的别名相关联的 KMS 密钥。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AliasBasedIAMPolicy",
      "Effect": "Allow",
      "Action": [
        "kms:Decrypt",
        "kms:GenerateDataKey*",
        "kms:DescribeKey"
      ],
      "Resource": [
        "arn:aws:kms:*:111122223333:key/*",
        "arn:aws:kms:*:444455556666:key/*"
      ],
      "Condition": {
        "ForAnyValue:StringLike": {
          "kms:ResourceAliases": "alias/restricted*"
        }
      }
    }
  ]
}
```

------

`kms:ResourceAliases` 条件是资源的条件，而不是请求的。因此，未指定别名的请求仍然可以满足条件。

以下示例请求（指定匹配别名）满足条件。

```
$ aws kms enable-key-rotation --key-id "alias/restricted-project"
```

但是，下面的示例请求也满足条件，前提是指定的 KMS 密钥具有以 `restricted` 开头的别名，即使该别名未在请求中使用。

```
$ aws kms enable-key-rotation --key-id "1234abcd-12ab-34cd-56ef-1234567890ab"
```