

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

# 将 IAM 策略与配合使用 AWS KMS
<a name="iam-policies"></a>

您可以使用 IAM 策略以及[密钥策略](key-policies.md)、[授权](grants.md)和 [VPC 终端节点策略](https://docs.aws.amazon.com/vpc/latest/privatelink/interface-endpoints.html#edit-vpc-endpoint-policy)来控制对您 AWS KMS keys 的 in 的访问权限 AWS KMS。

**注意**  
要使用 IAM policy 控制对 KMS 密钥的访问，KMS 密钥的密钥政策必须授予账户使用 IAM policy 的权限。具体而言，密钥策略必须包含[启用 IAM policy 的策略语句](key-policy-default.md#key-policy-default-allow-root-enable-iam)。  
本节介绍如何使用 IAM 策略来控制对 AWS KMS 操作的访问权限。有关 IAM 的更多一般信息，请参阅 [IAM 用户指南](https://docs.aws.amazon.com/IAM/latest/UserGuide/)。

所有 KMS 密钥都必须具有密钥策略。IAM policy 是可选的。要使用 IAM policy 控制对 KMS 密钥的访问，KMS 密钥的密钥政策必须授予账户使用 IAM policy 的权限。具体而言，密钥策略必须包含[启用 IAM policy 的策略语句](key-policy-default.md#key-policy-default-allow-root-enable-iam)。

IAM 策略可以控制对任何 AWS KMS 操作的访问权限。与密钥策略不同，IAM 策略可以控制对多个 KMS 密钥的访问权限，并为多个相关 AWS 服务的操作提供权限。但是，IAM 策略对于控制对操作的访问特别有用 [CreateKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateKey.html)，例如无法由密钥策略控制的操作，因为它们不涉及任何特定的 KMS 密钥。

如果您 AWS KMS 通过亚马逊虚拟私有云 (Amazon VPC) 终端节点进行访问，则还可以在使用终端节点时使用 VPC 终端节点策略来限制对 AWS KMS 资源的访问。例如，在使用 VPC 终端节点时，您可能只允许您的委托人 AWS 账户 访问您的客户托管密钥。有关详细信息，请参阅 [VPC 端点策略](https://docs.aws.amazon.com/vpc/latest/privatelink/interface-endpoints.html#edit-vpc-endpoint-policy)。

有关编写和格式化 JSON 策略文档的帮助，请参阅 *IAM 用户指南*中的 [IAM JSON 策略参考](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies.html)。

您可以通过以下方式使用 IAM policy：
+ **将权限策略附加到角色以启用联合身份验证或跨账户权限** – 您可以将 IAM policy 附加到 IAM 角色以启用联合身份验证，允许跨账户权限，或者向运行在 EC2 实例上的应用程序授予权限。有关 IAM 角色各种使用场景的更多信息，请参阅 *IAM 用户指南*中的 [IAM 角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)。
+ **将权限策略附加到用户或组** – 您可以附加允许某个用户或用户组调用 AWS KMS 操作的策略。但是，IAM 最佳实践建议您尽可能使用具有临时凭证的身份，例如 IAM 角色。

以下示例显示了具有 AWS KMS 权限的 IAM 策略。此策略允许附加到其上的 IAM 身份获取列出所有 KMS 密钥和别名。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": {
    "Effect": "Allow",
    "Action": [
      "kms:ListKeys",
      "kms:ListAliases"
    ],
    "Resource": "*"
  }
}
```

------

与所有 IAM policy 一样，此策略没有 `Principal` 元素。将 IAM policy 附加到 IAM 身份时，该身份将获取策略中指定的权限。

有关显示所有 AWS KMS API 操作及其适用的资源的表格，请参阅[权限参考](kms-api-permissions-reference.md)。

## 允许多个 IAM 主体访问 KMS 密钥
<a name="key-policy-modifying-multiple-iam-users"></a>

IAM 组不是密钥策略中的有效委托人。要允许多个 IAM 用户和角色访问 KMS 密钥，请执行下列操作中的一种：
+ 将 IAM 角色作为密钥策略中的主体。多个授权用户可以根据需要代入该角色。有关详细信息，请参阅《IAM 用户指南》中的 [IAM 角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)**。

  虽然您可以在密钥策略中列出多个 IAM 用户，但不建议采用这种做法，因为这将要求您在每次授权用户列表发生变化时更新密钥策略。此外，IAM 最佳实践也不鼓励使用具有长期凭证的 IAM 用户。有关更多信息，请参阅《IAM 用户指南》中的 [IAM 安全最佳实践](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)**。
+ 使用 IAM policy 向 IAM 组授予权限。要执行此操作，请确保密钥策略包含一个 [启用 IAM policy 以允许访问 KMS 密钥](key-policy-default.md#key-policy-default-allow-root-enable-iam) 的语句，[创建一个 IAM policy](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-using.html#create-managed-policy-console) 以允许访问该 KMS 密钥，然后 [将该策略附加到 IAM 组](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-using.html#attach-managed-policy-console)（其中包含授权 IAM 用户）。使用此方式，您不需要在授权用户列表发生更改时更改任何策略。相反，您只需在相应的 IAM 组中添加或删除这些用户。有关详细信息，请参阅《IAM 用户指南》中的 [IAM 用户组](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_groups.html)**。

有关 AWS KMS 密钥策略和 IAM 策略如何协同工作的更多信息，请参阅[AWS KMS 权限疑难解答](policy-evaluation.md)。

# IAM policy 的最佳实践
<a name="iam-policies-best-practices"></a>

确保访问 AWS KMS keys 权限对您的所有 AWS 资源的安全至关重要。KMS 密钥用于保护您的 AWS 账户中很多最敏感的资源。花点时间设计控制对 KMS 密钥的访问权限的[密钥政策](key-policies.md)、IAM 策略、[授权](grants.md)和 VPC 端点策略。

在控制对 KMS 密钥的访问的 IAM policy 语句中，使用[最低权限原则](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege)。仅为 IAM 委托人授予他们对必须使用或管理的 KMS 密钥的所需权限。

以下最佳实践适用于控制 AWS KMS 密钥和别名访问权限的 IAM 策略。有关一般性的 IAM policy 最佳实践，请参阅《IAM 用户指南》中的 [IAM 安全最佳实践](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)**。

**使用密钥策略**  
尽可能在影响一个 KMS 密钥的密钥策略中提供权限，而不是在可应用于许多 KMS 密钥的 IAM policy 中提供权限，包括其他 AWS 账户中的权限。[这对于诸如 [kms: PutKeyPolicy 和 kms:](https://docs.aws.amazon.com/kms/latest/APIReference/API_PutKeyPolicy.html) 之类的敏感权限尤其重要，对于决定如何保护数据的加密操作ScheduleKeyDeletion也是如此。](https://docs.aws.amazon.com/kms/latest/APIReference/API_ScheduleKeyDeletion.html)

**限制 CreateKey 权限**  
仅向需要密钥 (kms[:CreateKey) 的委托人授予创建密钥](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateKey.html) (kms:) 的权限。创建 KMS 密钥的委托人还会设置其密钥策略，以便他们可以授予自己和其他人使用和管理他们创建的 KMS 密钥的权限。允许此权限时，请考虑通过使用[策略条件](policy-conditions.md)限制它。例如，您可以使用 [kms: KeySpec](conditions-kms.md#conditions-kms-key-spec) 条件来限制对称加密 KMS 密钥的权限。

**在 IAM policy 中指定 KMS 密钥**  
最佳实践是在策略语句的 `Resource` 元素中指定权限所应用到的每个 KMS 密钥的[密钥 ARN](concepts.md#key-id-key-ARN)。此实践限制委托人需要的 KMS 密钥的权限。例如，此 `Resource` 元素仅列出主体需要使用的 KMS 密钥。  

```
"Resource": [
    "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
    "arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321"
]
```
指定 KMS 密钥不切实际时，请使用一个限制访问可信 AWS 账户 和区域（例如）中的 KMS 密钥的`Resource``arn:aws:kms:region:account:key/*`值。或者限制对受信任方所有区域 (\$1) 的 KMS 密钥的访问权限 AWS 账户，例如`arn:aws:kms:*:account:key/*`。  
不能在 IAM 策略的 `Resource` 字段中使用[密钥 ID](concepts.md#key-id-key-id)、[别名名称](concepts.md#key-id-alias-name)或者[别名 ARN](concepts.md#key-id-alias-ARN) 来表示 KMS 密钥。如果您指定别名 ARN，则策略将应用于别名，而不是 KMS 密钥。有关别名的 IAM policy 的信息，请参阅。[控制对别名的访问](alias-access.md)

**在 IAM policy 中避免使用 "Resource": "\$1"**  <a name="avoid-resource-star"></a>
谨慎地使用通配符 (\$1)。在密钥策略中，`Resource` 元素中的通配符表示密钥策略附加到的 KMS 密钥。但是在 IAM 策略中，仅在`Resource`元素 (`"Resource": "*"`) 中使用通配符即可将权限应用于委托人账户有权 AWS 账户 使用的所有 KMS 密钥。这可能包括[其他密钥中的](key-policy-modifying-external-accounts.md) KMS 密钥 AWS 账户，以及委托人账户中的 KMS 密钥。  
例如，要在另一个账户中使用 KMS 密钥 AWS 账户，委托人需要获得外部账户中 KMS 密钥的密钥策略以及自己账户中的 IAM 策略的许可。假设一个任意账户授予了您对其 KMS 密钥的 AWS 账户 [kms:Decrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html) 权限。若如此，您账户中授予角色对所有 KMS 密钥 (`"Resource": "*"`) 的 `kms:Decrypt` 权限的 IAM policy 将满足要求的 IAM 部分。因此，可以担任该角色的委托人现在可以使用不可信账户中的 KMS 密钥解密密文。他们的操作条目会出现在两个账户的 CloudTrail 日志中。  
特别是，避免在允许以下 API 操作的策略语句中使用 `"Resource": "*"`。可以在其他的 KMS 密钥上调用这些操作 AWS 账户。  
+ [DescribeKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_DescribeKey.html)
+ [GetKeyRotationStatus](https://docs.aws.amazon.com/kms/latest/APIReference/API_GetKeyRotationStatus.html)
+ [加密操作](kms-cryptography.md#cryptographic-operations)[（[加密、[解密](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html)](https://docs.aws.amazon.com/kms/latest/APIReference/API_Encrypt.html)、、、、、[GenerateDataKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html)、[GenerateDataKeyPair](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKeyPair.html)、、[GenerateDataKeyWithoutPlaintext[GenerateDataKeyPairWithoutPlaintext](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKeyPairWithoutPlaintext.html)](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKeyWithoutPlaintext.html)、[签名[GetPublicKey[ReEncrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_ReEncrypt.html)](https://docs.aws.amazon.com/kms/latest/APIReference/API_GetPublicKey.html)](https://docs.aws.amazon.com/kms/latest/APIReference/API_Sign.html)、验证）](https://docs.aws.amazon.com/kms/latest/APIReference/API_Verify.html)
+ [CreateGrant](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateGrant.html), [ListGrants](https://docs.aws.amazon.com/kms/latest/APIReference/API_ListGrants.html), [ListRetirableGrants](https://docs.aws.amazon.com/kms/latest/APIReference/API_ListRetirableGrants.html), [RetireGrant](https://docs.aws.amazon.com/kms/latest/APIReference/API_RetireGrant.html), [RevokeGrant](https://docs.aws.amazon.com/kms/latest/APIReference/API_RevokeGrant.html)

**何时使用 "Resource": "\$1"**  <a name="require-resource-star"></a>
在 IAM policy 中，仅将 `Resource` 元素中的通配符用于需要它的权限。只有以下权限才需要 `"Resource": "*"` 元素。  
+ [kms: CreateKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateKey.html)
+ [kms: GenerateRandom](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateRandom.html)
+ [kms: ListAliases](https://docs.aws.amazon.com/kms/latest/APIReference/API_ListAliases.html)
+ [kms: ListKeys](https://docs.aws.amazon.com/kms/latest/APIReference/API_ListKeys.html)
+ 自定义密钥存储库的权限，例如 k [ms: CreateCustomKeyStore](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateCustomKeyStore.html) 和 [kms: ConnectCustomKeyStore](https://docs.aws.amazon.com/kms/latest/APIReference/API_ConnectCustomKeyStore.html)。
别名操作（[kms:、kms: CreateAlias](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateAlias.html) [、k](https://docs.aws.amazon.com/kms/latest/APIReference/API_UpdateAlias.html) ms[: UpdateAlias、kms: DeleteAlias](https://docs.aws.amazon.com/kms/latest/APIReference/API_DeleteAlias.html)）的权限必须附加到别名和 KMS 密钥。您可以使用 IAM policy 中的 `"Resource": "*"` 来表示别名和 KMS 密钥，或者在 `Resource` 元素中指定别名和 KMS 密钥。有关示例，请参阅 [控制对别名的访问](alias-access.md)。

 

本主题中的示例提供了有关设计 KMS 密钥的 IAM policy 的详细信息和指导。有关所有 AWS 资源的 IAM 最佳实践，请参阅 [IAM *用户指南中的 IAM* 安全最佳实践](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)。

# 在 IAM policy 语句中指定 KMS 密钥
<a name="cmks-in-iam-policies"></a>

您可以使用 IAM policy 来允许委托人使用或管理 KMS 密钥。KMS 密钥在策略语句的 `Resource` 元素中指定。
+ 要在 IAM policy 语句中指定 KMS 密钥，必须使用其[密钥 ARN](concepts.md#key-id-key-ARN)。您不能使用[密钥 ID](concepts.md#key-id-key-id)、[别名名称](concepts.md#key-id-alias-name)或[别名 ARN](concepts.md#key-id-alias-ARN) 来标识 IAM policy 语句中的 KMS 密钥。

  例如：“`Resource": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab`”

  要根据别名控制对 KMS 密钥的访问权限，请使用 k [ms: RequestAlias](conditions-kms.md#conditions-kms-request-alias) 或 k [ms: ResourceAliases](conditions-kms.md#conditions-kms-resource-aliases) 条件密钥。有关更多信息，请参阅 [ABAC for AWS KMS](abac.md)。

  仅在控制别名操作（例如、或）访问权限的策略声明中使用别名 ARN 作为[CreateAlias](https://docs.aws.amazon.com/kms/latest/APIReference/CreateAlias.html)资源。[UpdateAlias[DeleteAlias](https://docs.aws.amazon.com/kms/latest/APIReference/DeleteAlias.html)](https://docs.aws.amazon.com/kms/latest/APIReference/UpdateAlias.html)有关更多信息，请参阅 [控制对别名的访问](alias-access.md)。
+ 要在账户和区域中指定多个 KMS 密钥，请在密钥 ARN 的区域或资源 ID 位置中使用通配符 (\$1)。

  例如，要指定账户的美国西部（俄勒冈）区域中的所有 KMS 密钥，请使用“`Resource": "arn:aws:kms:us-west-2:111122223333:key/*`”。要指定账户的所有区域中的所有 KMS 密钥，请使用“`Resource": "arn:aws:kms:*:111122223333:key/*`”。
+ 要表示所有 KMS 密钥，请单独使用通配符 (`"*"`)。对于不使用任何特定 KMS 密钥（即、和）的操作 [CreateKey[GenerateRandom[ListAliases](https://docs.aws.amazon.com/kms/latest/APIReference/API_ListAliases.html)](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateRandom.html)](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateKey.html)，请使用此格式[ListKeys](https://docs.aws.amazon.com/kms/latest/APIReference/API_ListKeys.html)。

在编写策略语句时，[最佳实践](iam-policies-best-practices.md)是只指定委托人需要使用的 KMS 密钥，而不是授予他们对所有 KMS 密钥的访问权限。

例如，以下 IAM 策略声明仅允许委托人对策略声明`Resource`元素中列出的 KMS 密钥调用[DescribeKey[GenerateDataKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html)](https://docs.aws.amazon.com/kms/latest/APIReference/API_DescribeKey.html)、、[Decrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html) 操作。通过密钥 ARN 指定 KMS 密钥是一种最佳实践，可确保权限仅限于指定的 KMS 密钥。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": {
    "Effect": "Allow",
    "Action": [
      "kms:DescribeKey",
      "kms:GenerateDataKey",
      "kms:Decrypt"
    ],
    "Resource": [
     "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
     "arn:aws:kms:us-west-2:111122223333:key/01234abcd-12ab-34cd-56ef-1234567890ab"
    ]
  }
}
```

------

要将权限应用于特定可信对象中的所有 KMS 密钥 AWS 账户，可以在区域和密钥 ID 位置中使用通配符 (\$1)。例如，以下策略语句允许委托人对两个可信示例账户的中的 KMS 密钥调用指定操作。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": {
    "Effect": "Allow",
    "Action": [
      "kms:DescribeKey",
      "kms:GenerateDataKey",
      "kms:GenerateDataKeyPair"
    ],
    "Resource": [
      "arn:aws:kms:*:111122223333:key/*",
      "arn:aws:kms:*:444455556666:key/*"
    ]
  }
}
```

------

您还可以单独在 `Resource` 元素中使用通配符 (`"*"`)。由于它允许访问帐户有权使用的所有 KMS 密钥，因此建议主要用于没有特定 KMS 密钥的操作和 `Deny` 语句。您还可以在仅允许不太敏感的只读操作的策略语句中使用它。要确定某项 AWS KMS 操作是否涉及特定的 KMS 密钥，请在中表的 “**资源**” 列中查找 **KMS 密钥**值[AWS KMS 权限](kms-api-permissions-reference.md)。

例如，以下策略语句使用 `Deny` 效果来禁止委托人对任何 KMS 密钥使用指定的操作。它在 `Resource` 元素中使用通配符来表示所有 KMS 密钥。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": {
    "Effect": "Deny",
    "Action": [
      "kms:CreateKey",
      "kms:PutKeyPolicy",
      "kms:CreateGrant",
      "kms:ScheduleKeyDeletion"
    ],
    "Resource": "*"
  }
}
```

------

以下策略语句单独使用通配符来表示所有 KMS 密钥。但它只允许不太敏感的只读操作和不适用于任何特定 KMS 密钥的操作。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": {
    "Effect": "Allow",
    "Action": [
      "kms:CreateKey",
      "kms:ListKeys",
      "kms:ListAliases",
      "kms:ListResourceTags"
    ],
    "Resource": "*"
  }
}
```

------

# IAM 策略示例
<a name="customer-managed-policies"></a>

在此部分中，可以找到允许执行各种 AWS KMS 操作的权限的示例 IAM policy。

**重要**  
仅当 KMS 密钥的密钥策略也允许时，才允许提供以下策略中的某些权限。有关更多信息，请参阅 [权限参考](kms-api-permissions-reference.md)。

有关编写和格式化 JSON 策略文档的帮助，请参阅 *IAM 用户指南*中的 [IAM JSON 策略参考](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies.html)。

**Topics**
+ [允许用户在 AWS KMS 控制台中查看 KMS 密钥](#iam-policy-example-read-only-console)
+ [允许用户创建 KMS 密钥](#iam-policy-example-create-key)
+ [允许用户使用特定 KMS 密钥进行加密和解密 AWS 账户](#iam-policy-example-encrypt-decrypt-one-account)
+ [允许用户使用特定 AWS 账户 和区域中的任何 KMS 密钥进行加密和解密](#iam-policy-example-encrypt-decrypt-one-account-one-region)
+ [允许用户使用特定 KMS 密钥进行加密和解密](#iam-policy-example-encrypt-decrypt-specific-cmks)
+ [阻止用户禁用或删除任何 KMS 密钥](#iam-policy-example-deny-disable-delete)

## 允许用户在 AWS KMS 控制台中查看 KMS 密钥
<a name="iam-policy-example-read-only-console"></a>

以下 IAM 策略允许用户以只读方式访问 AWS KMS 控制台。拥有这些权限的用户可以查看其中的所有 KMS 密钥 AWS 账户，但他们无法创建或更改任何 KMS 密钥。

要在**AWS 托管式密钥**和**客户托管密钥页面上查看 [K](https://docs.aws.amazon.com/kms/latest/APIReference/API_ListKeys.html) MS 密钥**，即使密钥没有[标签或别名ListAliases，委托人也需要 k [m](https://docs.aws.amazon.com/kms/latest/APIReference/API_ListAliases.html) s:、kms: 和 tag: GetResources](https://docs.aws.amazon.com/resourcegroupstagging/latest/APIReference/API_GetResources.html) 权限。ListKeys在 [KMS 密钥详细信息页面上查看可选的 KMS 密钥表列和数据需要其余权限，尤其是 kms: DescribeKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_DescribeKey.html)。需要 ia [m: ListUsers](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListUsers.html) 和 ia ListRoles m[: 权限](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListRoles.html)才能在默认视图中毫无错误地显示密钥策略。要查看**自定义密钥存储库页面上的数据以及自定义密钥存储库**中 KMS 密钥的详细信息，委托人还需要 k [ms: DescribeCustomKeyStores](https://docs.aws.amazon.com/kms/latest/APIReference/API_DescribeCustomKeyStores.html) 权限。

如果您限制用户的控制台对特定 KMS 密钥的访问，控制台将显示不可见的每个 KMS 密钥的错误。

此策略包含两个策略语句。第一个策略语句中的 `Resource` 元素允许对示例 AWS 账户的所有区域中的所有 KMS 密钥的指定权限。控制台查看器不需要额外的访问权限，因为 AWS KMS 控制台仅显示委托人账户中的 KMS 密钥。即使他们有权在其他版本中查看 KMS 密钥，也是如此 AWS 账户。其余 AWS KMS 和 IAM 权限需要一个`"Resource": "*"`元素，因为它们不适用于任何特定的 KMS 密钥。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "ReadOnlyAccessForAllKMSKeysInAccount",
      "Effect": "Allow",
      "Action": [
        "kms:GetPublicKey",        
        "kms:GetKeyRotationStatus",
        "kms:GetKeyPolicy",
        "kms:DescribeKey",
        "kms:ListKeyPolicies",
        "kms:ListResourceTags",
        "tag:GetResources"
      ],
      "Resource": "arn:aws:kms:*:111122223333:key/*"
    },
    {
      "Sid": "ReadOnlyAccessForOperationsWithNoKMSKey",
      "Effect": "Allow",
      "Action": [
        "kms:ListKeys",
        "kms:ListAliases",
        "iam:ListRoles",
        "iam:ListUsers"
      ],
      "Resource": "*"
    }
  ]
}
```

------

## 允许用户创建 KMS 密钥
<a name="iam-policy-example-create-key"></a>

以下 IAM policy 允许用户创建所有类型的 KMS 密钥。该`Resource`元素的值`*`是因为该`CreateKey`操作不使用任何特定的 AWS KMS 资源（KMS 密钥或别名）。

要限制用户使用特定类型的 KMS 密钥，请使用 k [ms: KeySpec](conditions-kms.md#conditions-kms-key-spec)、[kms: KeyUsage](conditions-kms.md#conditions-kms-key-usage) 和 k [ms: KeyOrigin](conditions-kms.md#conditions-kms-key-origin) 条件密钥。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": {
    "Effect": "Allow",
    "Action": "kms:CreateKey",
    "Resource": "*"
  }
}
```

------

创建密钥的委托人可能需要一些相关权限。
+ **kms: PutKeyPolicy** — 拥有`kms:CreateKey`权限的委托人可以为 KMS 密钥设置初始密钥策略。但是，`CreateKey`调用者必须拥有 k [ms: PutKeyPolicy](https://docs.aws.amazon.com/kms/latest/APIReference/API_PutKeyPolicy.html) 权限，允许他们更改 KMS 密钥策略，或者必须指定`BypassPolicyLockoutSafetyCheck`参数`CreateKey`，但不建议这样做。`CreateKey` 调用方可以从 IAM policy 中获得对 KMS 密钥的 `kms:PutKeyPolicy` 权限，也可以将此权限包含在他们正在创建的 KMS 密钥的密钥策略中。
+ **kms: TagResource** — 要在`CreateKey`操作期间向 KMS 密钥添加标签，`CreateKey`调用者必须在 IAM 策略中TagResource拥有 [kms:](https://docs.aws.amazon.com/kms/latest/APIReference/API_TagResource.html) 权限。将此权限包含在新 KMS 密钥的密钥策略中是不够的。但是，如果 `CreateKey` 调用方在初始密钥策略中包括 `kms:TagResource`，他们可以在创建 KMS 密钥后在单独调用中添加标签。
+ **kms: CreateAlias** — 在 AWS KMS 控制台中创建 KMS 密钥的委托人必须对 [KMS 密钥和别名拥有 kms: CreateAlias](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateAlias.html) 权限。（控制台进行两次调用；一次对 `CreateKey`，一次对 `CreateAlias`）。您必须在 IAM policy 中提供别名权限。您可以在密钥策略或 IAM policy 中提供 KMS 密钥权限。有关更多信息，请参阅 [控制对别名的访问](alias-access.md)。

此外`kms:CreateKey`，以下 IAM 策略提供`kms:TagResource`对中所有 KMS 密钥的`kms:CreateAlias`权限 AWS 账户 以及对账户所有别名的权限。它还包括一些只能在 IAM policy 中提供的有用的只读权限。

此 IAM policy 不包含 `kms:PutKeyPolicy` 权限或可以在密钥策略中设置的任何其他权限。它是在密钥策略中设置这些权限的[最佳实践](iam-policies-best-practices.md)，在该密钥策略中，这些权限专门应用于一个 KMS 密钥。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "IAMPermissionsForParticularKMSKeys",
      "Effect": "Allow",
      "Action": "kms:TagResource",
      "Resource": "arn:aws:kms:*:111122223333:key/*"
    },
    {
      "Sid": "IAMPermissionsForParticularAliases",
      "Effect": "Allow",
      "Action": "kms:CreateAlias",
      "Resource": "arn:aws:kms:*:111122223333:alias/*"
    },
    {
      "Sid": "IAMPermissionsForAllKMSKeys",
      "Effect": "Allow",
      "Action": [
        "kms:CreateKey",
        "kms:ListKeys",
        "kms:ListAliases"
      ],
      "Resource": "*"
    }
  ]
}
```

------

## 允许用户使用特定 KMS 密钥进行加密和解密 AWS 账户
<a name="iam-policy-example-encrypt-decrypt-one-account"></a>

以下 IAM 策略允许用户使用 111122223333 中的 AWS 账户 任何 KMS 密钥加密和解密数据。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": {
    "Effect": "Allow",
    "Action": [
      "kms:Encrypt",
      "kms:Decrypt"
    ],
    "Resource": "arn:aws:kms:*:111122223333:key/*"
  }
}
```

------

## 允许用户使用特定 AWS 账户 和区域中的任何 KMS 密钥进行加密和解密
<a name="iam-policy-example-encrypt-decrypt-one-account-one-region"></a>

以下 IAM 策略允许用户使用美国西部（俄勒冈）地区的任何 KMS 密钥加密和解密数据。 AWS 账户 `111122223333`

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": {
    "Effect": "Allow",
    "Action": [
      "kms:Encrypt",
      "kms:Decrypt"
    ],
    "Resource": [
      "arn:aws:kms:us-west-2:111122223333:key/*"
    ]
  }
}
```

------

## 允许用户使用特定 KMS 密钥进行加密和解密
<a name="iam-policy-example-encrypt-decrypt-specific-cmks"></a>

以下 IAM policy 允许用户使用 `Resource` 元素中指定的两个 KMS 密钥来加密和解密数据。在 IAM policy 语句中指定 KMS 密钥时，必须使用 KMS 密钥的[密钥 ARN](concepts.md#key-id-key-ARN)。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": {
    "Effect": "Allow",
    "Action": [
      "kms:Encrypt",
      "kms:Decrypt"
    ],
    "Resource": [
      "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
      "arn:aws:kms:us-west-2:111122223333:key/01234abc-d12a-b34c-d56e-f1234567890a'"
    ]
  }
}
```

------

## 阻止用户禁用或删除任何 KMS 密钥
<a name="iam-policy-example-deny-disable-delete"></a>

以下 IAM policy 阻止用户禁用或删除任何 KMS 密钥，即使其他 IAM policy 或密钥策略允许这些权限时也是如此。以显式方式拒绝权限的策略将覆盖所有其他策略，甚至包括那些以显式方式允许相同权限的策略。有关更多信息，请参阅 [AWS KMS 权限疑难解答](policy-evaluation.md)。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": {
    "Effect": "Deny",
    "Action": [
      "kms:DisableKey",
      "kms:ScheduleKeyDeletion"
    ],
    "Resource": "*"
  }
}
```

------