亚马逊AWS官方博客

如何在多个账户中共享加密 AMI,以启动加密 EC2 实例 | AWS 安全性博客

您是否出于法规或合规性原因,使用 AWS Key Management Service (AWS KMS) 客户主密钥 (CMK) 加密您的 Amazon Machine Instances (AMI)? 您是否使用加密的根卷启动实例? 您是否创建了黄金 AMI 并将其分发给组织中的其他账户,以标准化特定于应用程序的 Amazon Elastic Compute Cloud (Amazon EC2) 实例启动? 如果您的答案是肯定的,下面我们将有好消息向您宣布!我们很高兴地宣布,您现在可以通过单一 API 调用在账户之间共享通过客户托管的 CMK 加密的 AMI。此外,您还可以直接通过共享给您的加密 AMI 启动 EC2 实例。之前,此操作仅适用于未加密的 AMI。将此功能扩展到加密 AMI 可简化 AMI 分发流程,并降低之前用于共享加密 AMI 的方法导致的快照存储成本,因为该方法会在每个账户中生成副本。

在本文中,我们将演示如何在账户之间共享加密 AMI,并通过共享的 AMI 启动 Amazon Elastic Block Store (Amazon EBS) 支持的加密 EC2 实例。

共享通过客户托管 CMK 加密的 AMI 的先决条件

在开始共享加密 AMI 并通过该 AMI 启动实例之前,您需要先设置您的 AWS KMS 密钥策略和 AWS Identity and Access Management (IAM) 策略。

在此过程中,您需要以下两个 AWS 账户:

  1. 源账户,用于构建自定义 AMI 并加密相关的 EBS 快照。
  2. 目标账户,用于通过带加密快照的共享自定义 AMI 启动实例。

在此示例中,我们将为源账户和目标账户分别使用虚拟账户 ID 111111111111999999999999。此外,您还需要在源区域的源账户中创建 AWS KMS 客户主密钥 (CMK)。为了简便起见,我已在 us-east-1 的账户 111111111111 下创建了一个别名为 cmkSource 的 AWS KMS CMK。我将使用此 cmkSource 来加密要与账户 999999999999 共享的 AMI (ami-1234578)。完成本文章之后,请务必更改为您自己的账户 ID、源账户、AWS KMS CMK 和 AMI ID。

为源帐户创建策略设置

首先,源账户中的 IAM 用户或角色需要 AMI 共享权限(一项 EC2 ModifyImageAttribute 操作)。以下 JSON 策略文档举例说明了 IAM 用户或角色策略所需的权限。要共享 ami-12345678,您需要创建如下所示的策略:


    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ec2: ModifyImageAttribute",
            ],
            "Resource": [
                "arn:aws:ec2:us-east-1::image/<12345678>"
            ]
        }
 ] 
}

其次,目标账户需要 cmkSource 的使用权限,以重新加密快照。以下步骤将指导您如何将目标账户的 ID 添加到 cmkSource 密钥策略。

  1. 在 IAM 控制台中,从左侧窗格中选择加密密钥,然后选择源账户的 CMK(即 cmkSource),正如图 1 所示:

    图 1:选择“cmkSource”

    图 1:选择“cmkSource”

  2. 查找外部账户分部,键入目标账户 ID(例如 999999999999),然后选择添加外部账户

    图 2:输入目标账户 ID,然后选择“添加外部账户”

    图 2:输入目标账户 ID,然后选择“添加外部账户”

为目标账户创建策略设置

配置完源账户之后,您需要配置目标账户。目标账户中的 IAM 用户或角色需要能在 cmkSource 上执行 AWS KMS DescribeKeyCreateGrantReEncrypt*Decrypt 操作,才能通过共享的加密 AMI 启动实例。以下 JSON 策略文档举例说明了这些权限:


{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "kms:DescribeKey",
                "kms:ReEncrypt*",
                "kms:CreateGrant",
                "kms:Decrypt"
            ],
            "Resource": [
                "arn:aws:kms:us-east-1:<111111111111>:key/<key-id of cmkSource>"
            ]                                                    
        }
    ]
}

完成源账户和目标账户的配置步骤之后,您就可以共享和启动加密 AMI 了。加密 AMI 的实际共享与未加密 AMI 的共享并无差异。如果您想使用 AWS 管理控制台,请按照共享 AMI(控制台)中介绍的步骤操作。要使用 AWS 命令行界面 (AWS CLI),请按照共享 AMI (AWS CLI) 中介绍的步骤操作。

以下是用于共享 AMI 的 CLI 命令示例:


aws ec2 modify-image-attribute --image-id <ami-12345678> --launch-permission "Add=[{UserId=<999999999999>}]"

通过共享的加密 AMI 启动实例

要启动共享给您的 AMI,请在 Run-Instances API/CLI 的 image-id 参数中设置共享 AMI 的 AMI ID。此外,要在您的账户中使用自定义 CMK 重新加密卷,您可以在块储存设备映射中指定 KmsKeyId,如下所示:


    $> aws ec2 run-instances 
    --image-id ami-
    --count 1 
    --instance-type m4.large 
    --region us-east-1
    --subnet-id subnet-aec2fc86 
    --key-name 2016KeyPair 
    --security-group-ids sg-f7dbc78e subnet-id subnet-aec2fc86 
    --block-device-mappings file://mapping.json    

其中 mapping.json 包含以下内容:


[
    {
        "DeviceName": "/dev/xvda",
        "Ebs": {
                "Encrypted": true,
                "KmsKeyId": "arn:aws:kms:us-east-1:<999999999999>:key/<abcd1234-a123-456a-a12b-a123b4cd56ef>"
        }
    }
]

通过共享的加密 AMI 启动实例时,您可以指定您选择的 CMK。您还可以选择 cmkSource 来加密账户中的卷。但是,我们建议您在目标账户中使用 CMK 重新对这些卷进行加密。这样可以为您提供防护,因为如果源 CMK 被盗,或者源账户撤销权限,可能会导致您无法访问使用 cmkSource 创建的任何加密卷。

小结

在这篇博文中,我们讨论了如何在账户之间轻松共享加密 AMI,以启动加密实例。AWS 已将同样的功能扩展到快照,允许您通过共享加密快照创建加密的 EBS 卷。

在除中国外的所有 AWS 商业区域,均可通过 AWS 管理控制台、AWS CLI 或 AWS SDK 免费提供此功能。如果您对此博文有反馈,请在下面的评论部分中提交评论。如果您对此博文有疑问,请在 Amazon EC2 论坛上发表新帖子,或联系 AWS Support

想要更多 AWS 安全“如何”内容、新闻和功能公告? 在 Twitter 上关注我们。

本篇作者