

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

# 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)。