

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

# 使用加密卷所需的 Amazon KMS 密钥策略
<a name="key-policy-requirements-EBS-encryption"></a>

Amazon EC2 Auto Scaling 使用[与服务相关的角色](autoscaling-service-linked-role.md)向其他 Amazon Web Services 服务角色委派权限。Amazon EC2 Auto Scaling 服务相关角色是预定义的，包括 Amazon EC2 Auto Scaling Amazon Web Services 服务 代表您呼叫他人所需的权限。预定义的权限还包括对您的访问权限 Amazon 托管式密钥。但是，它们不包括对客户管理密钥的访问权限，因此您可以保持对这些密钥的完全控制。

本主题介绍当您为 Amazon EBS 加密指定客户托管密钥时如何设置启动 Auto Scaling 实例所需的密钥策略。

**注意**  
Amazon EC2 Auto Scaling 无需额外授权即可使用默认 Amazon 托管式密钥 来保护您账户中的加密卷。

**Contents**
+ [概述](#overview)
+ [配置密钥策略](#configuring-key-policies)
+ [示例 1：允许访问客户托管密钥的关键策略部分](#policy-example-cmk-access)
+ [示例 2：允许跨账户访问客户托管密钥的关键策略部分](#policy-example-cmk-cross-account-access)
+ [在 Amazon KMS 控制台中编辑密钥策略](#eding-key-policies-console)

## 概述
<a name="overview"></a>

当 Amazon EC2 Auto Scaling 启动实例时，以下内容 Amazon KMS keys 可用于亚马逊 EBS 加密：
+ [Amazon 托管式密钥](https://docs.amazonaws.cn/kms/latest/developerguide/concepts.html#aws-managed-cmk)：您的账户中 Amazon EBS 创建、拥有和管理的加密密钥。这是新账户的默认加密密钥。除非您指定客户托管密钥，否则将使用加密。 Amazon 托管式密钥 
+ [客户托管密钥](https://docs.amazonaws.cn/kms/latest/developerguide/concepts.html#customer-cmk)：您创建、拥有和管理的自定义加密密钥。有关更多信息，请参阅 *Amazon Key Management Service 开发人员指南*中的[创建密钥](https://docs.amazonaws.cn/kms/latest/developerguide/create-keys.html)。

  注意：密钥必须是对称的。Amazon EBS 不支持非对称客户托管密钥。

在创建加密的快照或指定加密卷的启动模板，或者默认启用加密时，您可以配置客户托管密钥。

## 配置密钥策略
<a name="configuring-key-policies"></a>

您的 KMS 密钥必须具有允许 Amazon EC2 Auto Scaling 启动使用 Amazon EBS 卷使用客户托管密钥加密的实例的密钥策略。

使用此页面上的示例配置密钥策略来向 Amazon EC2 Auto Scaling 提供访问客户托管密钥的权限。您可以在创建密钥时或以后的某个时间修改客户托管密钥的密钥策略。

您必须向您的密钥策略中添加至少两个策略语句，以便此策略可用于 Amazon EC2 Auto Scaling。
+ 第一条语句允许在 `Principal` 元素中指定的 IAM 身份直接使用客户托管密钥。它包括对密钥执行 Amazon KMS `Encrypt``Decrypt`、`ReEncrypt*`、`GenerateDataKey*`、和`DescribeKey`操作的权限。
+ 第二条语句允许`Principal`元素中指定的 IAM 身份使用该`CreateGrant`操作生成授权，将其自己的权限子集委托给与 Amazon KMS 或其他委托人集成的权限。 Amazon Web Services 服务 这样，他们可以使用密钥代表您创建加密的资源。

当您向密钥策略添加新的策略语句时，不要更改策略中任何已存在的语句。

对于以下每个示例，必须替换的参数（例如密钥 ID 或服务相关角色的名称）显示为{{user placeholder text}}。在大多数情况下，您可以使用 Amazon EC2 Auto Scaling 服务相关角色的名称替换此服务相关角色的名称。

有关更多信息，请参阅以下资源：
+ 要使用创建密钥 Amazon CLI，请参阅[创建密](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/kms/create-key.html)钥。
+ 要使用更新密钥策略，请参阅 [put-key-polic](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/kms/put-key-policy.html) y。 Amazon CLI
+ 要查找密钥 ID 和 Amazon Resource Name (ARN)，请参阅 *Amazon Key Management Service 开发人员指南*中的[查找密钥 ID 和 ARN](https://docs.amazonaws.cn/kms/latest/developerguide/find-cmk-id-arn.html)。
+ 有关 Amazon EC2 Auto Scaling 服务相关角色的信息，请参阅 [Amazon EC2 Auto Scaling 的服务相关角色](autoscaling-service-linked-role.md)。
+ 有关 Amazon EBS 加密和 KMS 的一般信息，请参阅《Amazon EBS User Guide》**中的 [Amazon EBS encryption](https://docs.amazonaws.cn/ebs/latest/userguide/ebs-encryption.html) 和《Amazon Key Management Service Developer Guide》[https://docs.amazonaws.cn/kms/latest/developerguide/](https://docs.amazonaws.cn/kms/latest/developerguide/)。

## 示例 1：允许访问客户托管密钥的关键策略部分
<a name="policy-example-cmk-access"></a>

将以下两个策略语句添加到客户托管密钥的密钥策略中，同时将示例 ARN 替换为允许访问密钥的相应服务相关角色的 ARN。在本例中，策略部分为名为 **AWSServiceRoleForAutoScaling** 的服务相关角色提供使用客户托管密钥的权限。

```
{
   "Sid": "Allow service-linked role use of the customer managed key",
   "Effect": "Allow",
   "Principal": {
       "AWS": [
           "arn:aws:iam::{{account-id}}:role/aws-service-role/autoscaling.amazonaws.com/{{AWSServiceRoleForAutoScaling}}"
       ]
   },
   "Action": [
       "kms:Encrypt",
       "kms:Decrypt",
       "kms:ReEncrypt*",
       "kms:GenerateDataKey*",
       "kms:DescribeKey"
   ],
   "Resource": "*"
}
```

```
{
   "Sid": "Allow attachment of persistent resources",
   "Effect": "Allow",
   "Principal": {
       "AWS": [
           "arn:aws:iam::{{account-id}}:role/aws-service-role/autoscaling.amazonaws.com/{{AWSServiceRoleForAutoScaling}}"
       ]
   },
   "Action": [
       "kms:CreateGrant"
   ],
   "Resource": "*",
   "Condition": {
       "Bool": {
           "kms:GrantIsForAWSResource": true
       }
    }
}
```

## 示例 2：允许跨账户访问客户托管密钥的关键策略部分
<a name="policy-example-cmk-cross-account-access"></a>

如果您在与自动扩缩组不同的账户中创建了客户管理型密钥，则必须组合使用授权和密钥策略以允许对该密钥的跨账户存取。

必须按以下顺序完成两个步骤：

1. 首先，将以下两个策略语句添加到客户管理型密钥的密钥策略中。将示例 ARN 替换为另一个账户的 ARN，并确保将其{{111122223333}}替换为要在中创建 Auto Scaling 组的实际账户 ID。 Amazon Web Services 账户 这将允许您向指定账户中的 IAM 用户或角色授予使用下面的 CLI 命令为密钥创建授权的权限。但这本身并不会向任何用户授予对密钥的访问权限。

   ```
   {
      "Sid": "Allow external account {{111122223333}} use of the customer managed key",
      "Effect": "Allow",
      "Principal": {
          "AWS": [
              "arn:aws:iam::{{111122223333}}:root"
          ]
      },
      "Action": [
          "kms:Encrypt",
          "kms:Decrypt",
          "kms:ReEncrypt*",
          "kms:GenerateDataKey*",
          "kms:DescribeKey"
      ],
      "Resource": "*"
   }
   ```

   ```
   {
      "Sid": "Allow attachment of persistent resources in external account {{111122223333}}",
      "Effect": "Allow",
      "Principal": {
          "AWS": [
              "arn:aws:iam::{{111122223333}}:root"
          ]
      },
      "Action": [
          "kms:CreateGrant"
      ],
      "Resource": "*"
   }
   ```

1. 然后从您要在其中创建自动扩缩组的账户中，创建一个授权以将相关权限委托给相应的服务相关角色。该授权的 `Grantee Principal` 元素是相应的服务相关角色的 ARN。`key-id` 是密钥的 ARN。

   以下是 [create-grant CL](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/kms/create-grant.html) I 命令示例，该命令向账户**AWSServiceRoleForAutoScaling**中指定的服务相关角色授予在账户中使用客户托管密钥的{{111122223333}}权限。{{444455556666}}

   ```
   aws kms create-grant \
     --region {{us-west-2}} \
     --key-id {{arn:aws:kms:us-west-2:444455556666:key/1a2b3c4d-5e6f-1a2b-3c4d-5e6f1a2b3c4d}} \
     --grantee-principal arn:aws:iam::{{111122223333}}:role/aws-service-role/autoscaling.amazonaws.com/{{AWSServiceRoleForAutoScaling}} \
     --operations "Encrypt" "Decrypt" "ReEncryptFrom" "ReEncryptTo" "GenerateDataKey" "GenerateDataKeyWithoutPlaintext" "DescribeKey" "CreateGrant"
   ```

   要使此命令成功，发出请求的用户必须具有执行 `CreateGrant` 操作的权限。

   以下示例 IAM 策略允许账户中的 IAM 身份（用户或角色）{{111122223333}}为账户中的客户托管密钥创建授权{{444455556666}}。

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

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Sid": "AllowCreationOfGrantForTheKMSKeyinExternalAccount{{444455556666}}",
         "Effect": "Allow",
         "Action": "kms:CreateGrant",
         "Resource": "{{arn:aws:kms:us-west-2:444455556666:key/1a2b3c4d-5e6f-1a2b-3c4d-5e6f1a2b3c4d}}"
       }
     ]
   }
   ```

------

   有关为不同 Amazon Web Services 账户中的 KMS 密钥创建授权的更多信息，请参阅《Amazon Key Management Service 开发人员指南》**中的 [Amazon KMS中的授权](https://docs.amazonaws.cn/kms/latest/developerguide/grants.html)。
**重要**  
指定为被授权者委托人的服务相关角色名称必须是现有角色的名称。创建授权后，为确保该授权允许 Amazon EC2 Auto Scaling 使用指定的 KMS 密钥，请勿删除并重新创建服务相关角色。

## 在 Amazon KMS 控制台中编辑密钥策略
<a name="eding-key-policies-console"></a>

之前部分中的示例仅显示如何向密钥策略添加语句，这只是更改密钥策略的一种方法。更改密钥策略的最简单方法是使用 Amazon KMS 控制台的默认密钥策略视图，并将 IAM 身份（用户或角色）设为相应*密钥策略的关键用户*之一。有关更多信息，请参阅[《*Amazon Key Management Service 开发人员指南》*中的使用 Amazon Web Services 管理控制台 默认视图](https://docs.amazonaws.cn/kms/latest/developerguide/key-policy-modifying.html#key-policy-modifying-how-to-console-default-view)。

**重要**  
请务必谨慎。控制台的默认视图策略声明包括对客户托管密钥执行 Amazon KMS `Revoke`操作的权限。如果您授予对账户中客户托管密钥的 Amazon Web Services 账户 访问权限，但又不小心撤销了授予他们此权限的授权，则外部用户将无法再访问他们的加密数据或用于加密其数据的密钥。