

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

# 最低权限许可
<a name="least-privilege"></a>

由于您的 KMS 密钥可以保护敏感信息，因此我们建议遵循最低权限访问原则。在定义密钥政策时，请委派执行任务所需的最低权限。仅当您计划使用其他 IAM 策略进一步限制权限时，才允许对 KMS 密钥政策执行所有操作 (`kms:*`)。如果您计划使用 IAM 策略管理权限，请限制哪些人员能够创建 IAM 策略并将其附加到 IAM 主体，以及[监控策略更改](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudwatch-alarms-for-cloudtrail.html#cloudwatch-alarms-for-cloudtrail-iam-policy-changes)。

如果您允许在密钥政策和 IAM 策略中执行所有操作 (`kms:*`)，则主体同时拥有 KMS 密钥的管理和使用权限。建议仅将这些权限委托给特定主体，这是最佳安全实践。您可以通过在密钥政策中明确指明主体，或通过限制 IAM 策略附加到哪些主体来实现。您也可以使用[条件键](policy-conditions.md)来限制权限。例如，如果进行 API 调用的主体具有条件规则中指定的标签，则可以使用 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-principaltag](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-principaltag) 来允许所有操作。

要帮助了解中如何评估策略声明 AWS，请参阅 *IAM 用户指南*中的[策略评估逻辑](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_evaluation-logic.html)。我们建议您在撰写策略前先阅读此主题，减少策略产生意外影响的可能，例如向本不应该拥有访问权限的主体提供访问权限。

**提示**  
在非生产环境中测试应用程序时，请使用 [IAM Access Analyzer](https://aws.amazon.com/iam/features/analyze-access/) 来帮助您将最低权限应用于 IAM 策略。

如果您使用 IAM 用户而不是 IAM 角色，我们强烈建议您启用 AWS [多因素身份验证](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_mfa.html) (MFA)，以缓解长期证书的漏洞。您可使用 MFA 执行以下操作：
+ 要求用户在执行特权操作（例如安排密钥删除）前先使用 MFA 验证其凭证。
+ 将管理员账户密码和 MFA 设备的所有权分配给不同个人，进行授权拆分。

**了解详情**
+ [AWS 工作职能的托管策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_job-functions.html)
+ [用于编写最低权限 IAM 策略的方法](https://aws.amazon.com//blogs/security/techniques-for-writing-least-privilege-iam-policies/)

## 实施最低权限
<a name="key-policy-least-privilege"></a>

当您向 AWS 服务授予使用 KMS 密钥的权限时，请确保该权限仅对服务必须代表您访问的资源有效。这种最低权限策略有助于防止在 AWS 服务之间传递请求时未经授权使用 KMS 密钥。

要实施最低权限策略，我们建议使用 AWS KMS 加密上下文条件密钥和全局来源 ARN 或源账户条件密钥。

### 使用加密上下文条件键
<a name="least-privilege-encryption-context"></a>

在使用 AWS KMS 资源时，实现最低特权权限的最有效方法是在允许委托人调用 AWS KMS 加密操作的策略中包含[kms:EncryptionContext:*context-key*](conditions-kms.md#conditions-kms-encryption-context)或[kms:EncryptionContextKeys](conditions-kms.md#conditions-kms-encryption-context-keys)条件密钥。这些条件键特别有效，因为它们将权限与在加密资源时绑定到密文的[加密上下文](encrypt_context.md)相关联。

[仅当策略语句中的操作为或采用`EncryptionContext`参数的 AWS KMS 对称加密操作（例如[CreateGrant](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateGrant.html)或 Decrypt 之类[GenerateDataKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html)的操作）时，才使用加密上下文条件密钥。](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html)（有关支持的操作列表，请参阅 [kms:EncryptionContext:*context-key*](conditions-kms.md#conditions-kms-encryption-context) 或 [kms:EncryptionContextKeys](conditions-kms.md#conditions-kms-encryption-context-keys)）。如果您使用这些条件键来允许其他操作（例如）[DescribeKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_DescribeKey.html)，则权限将被拒绝。

将值设置为服务在加密资源时使用的加密上下文。此信息通常可在服务文档的“安全性”章节中找到。例如，[AWS Proton 的加密上下文标识 P](https://docs.aws.amazon.com/proton/latest/adminguide/data-protection.html#encryption-context) AWS roton 资源及其关联的模板。[AWS Secrets Manager 加密上下文](https://docs.aws.amazon.com/secretsmanager/latest/userguide/security-encryption.html#security-encryption-encryption-context)标识密钥及其版本。[Amazon Location 的加密上下文](https://docs.aws.amazon.com/location/latest/developerguide/encryption-at-rest.html#location-encryption-context)标识跟踪器或集合。

以下示例是密钥策略语句允许 Amazon Location Service 代表授权用户创建授权。[本政策声明通过使用 k [ms: ViaService、kms:](conditions-kms.md#conditions-kms-via-service) 和`kms:EncryptionContext:context-key`条件密钥将权限绑定到特定的跟踪器资源来限制权限。CallerAccount](conditions-kms.md#conditions-kms-caller-account)

```
{
  "Sid": "Allow Amazon Location to create grants on behalf of authorized users",
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::111122223333:role/LocationTeam"
  },
  "Action": "kms:CreateGrant",
  "Resource": "*",
  "Condition": {
    "StringEquals": {
      "kms:ViaService": "geo.us-west-2.amazonaws.com",
      "kms:CallerAccount": "111122223333",
      "kms:EncryptionContext:aws:geo:arn": "arn:aws:geo:us-west-2:111122223333:tracker/SAMPLE-Tracker"
    }
  }
}
```

### 使用 `aws:SourceArn` 或 `aws:SourceAccount` 条件键
<a name="least-privilege-source-arn"></a>

密钥策略语句中的主体是 [AWS 服务主体](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_principal.html#principal-services)时，除了 `kms:EncryptionContext:context-key` 条件键外，我们强烈建议您使用 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn) 或 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount) 全局条件键。只有当请求 AWS KMS 来自其他 AWS 服务时，ARN 和账户值才会包含在授权上下文中。这种条件的组合实施最低权限，避免了潜在的[混淆代理情况](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html)。在密钥策略中，服务委托人通常不用作委托人，但某些 AWS 服务（例如）需要 AWS CloudTrail它。

要使用 `aws:SourceArn` 或 `aws:SourceAccount` 全局条件键，将值设置为正在加密的资源的 Amazon Resource Name (ARN) 或账户。例如，在提供 AWS CloudTrail 权限加密跟踪记录的密钥策略语句中，将 `aws:SourceArn` 的值设置为跟踪记录的 ARN。请尽可能使用更具体的 `aws:SourceArn`。将值设置为 ARN 或带通配符的 ARN 模式。如果您不知道资源的 ARN，请改用 `aws:SourceAccount`。

**注意**  
如果资源 ARN 包含 AWS KMS 密钥策略中不允许的字符，则不能在条件密钥的值中使用该资源 ARN。`aws:SourceArn`改为使用 `aws:SourceAccount` 条件键。有关密钥策略文档规则的详细信息，请参阅 [密钥策略格式](key-policy-overview.md#key-policy-format)。

在以下示例密钥策略中，获得权限的主体是 AWS CloudTrail 服务主体 `cloudtrail.amazonaws.com`。为实施最低权限，本策略使用 `aws:SourceArn` 和 `kms:EncryptionContext:context-key` 条件键。该策略声明 CloudTrail 允许使用 KMS 密[钥生成用于加密跟踪的数据](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html)密钥。`aws:SourceArn` 和 `kms:EncryptionContext:context-key` 条件会得到独立评估。使用 KMS 密钥进行指定操作的任何请求都必须满足这两个条件。

为了限制服务对示例账户 (111122223333) 和 `us-west-2` 区域中 `finance` 跟踪记录的权限，此策略语句将 `aws:SourceArn` 条件键设置为特定跟踪记录的 ARN。条件语句使用[ArnEquals](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_ARN)运算符来确保在匹配时独立评估 ARN 中的每个元素。此示例还使用 `kms:EncryptionContext:context-key` 条件键来限制对特定账户和区域中跟踪记录的权限。

在使用此密钥策略之前，请将示例账户 ID、区域和跟踪记录名称替换为您账户中的有效值。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AllowCloudTrailToEncryptLogs",
      "Effect": "Allow",
      "Principal": {
        "Service": "cloudtrail.amazonaws.com"
      },
      "Action": "kms:GenerateDataKey",
      "Resource": "*",
      "Condition": {
        "ArnEquals": {
          "aws:SourceArn": [
            "arn:aws:cloudtrail:us-west-2:111122223333:trail/finance"
          ]
        },
        "StringLike": {
          "kms:EncryptionContext:aws:cloudtrail:arn": [
            "arn:aws:cloudtrail:*:111122223333:trail/*"
          ]
        }
      }
    }
  ]
}
```

------