QCon 广州站2022已开启,三大关键词:数字化、国产化、云原生。戳此了解 了解详情
写点什么

如何在多个账户中共享加密 AMI,以启动加密 EC2 实例

  • 2019 年 9 月 26 日
  • 本文字数:2546 字

    阅读完需:约 8 分钟

如何在多个账户中共享加密 AMI,以启动加密 EC2 实例

您是否出于法规或合规性原因,使用 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 启动实例。

  3. 在此示例中,我们将为源账户和目标账户分别使用虚拟账户 ID 111111111111 和 999999999999。此外,您还需要在源区域的源账户中创建 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 密钥策略。


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



图 1:选择“cmkSource”


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


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


为目标账户创建策略设置

配置完源账户之后,您需要配置目标账户。目标账户中的 IAM 用户或角色需要能在 cmkSource 上执行 AWS KMS DescribeKey、CreateGrant、ReEncrypt* 和 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 上关注我们。


作者介绍:


Nishit Nagar


Nishit 是 AWS 高级产品经理。


本文转载自 AWS 技术博客。


原文链接:


https://amazonaws-china.com/cn/blogs/china/how-to-share-encrypted-amis-across-accounts-to-launch-encrypted-ec2-instances/


2019 年 9 月 26 日 18:35416
用户头像

发布了 1492 篇内容, 共 52.1 次阅读, 收获喜欢 57 次。

关注

评论

发布
暂无评论
发现更多内容

Go 专栏|基础数据类型:整数、浮点数、复数、布尔值和字符串

AlwaysBeta

Go 语言

ShardingSphere 语句解析生成初探

源码 ShardingSphere

未来10年,5个C/C++吃香的细分领域技术

奔着腾讯去

云原生 网络安全 音视频 DPDK 虚拟化技术

Go 专栏|流程控制,一网打尽

AlwaysBeta

Go 语言

看云起云动 览开源盛世 | 亚马逊云科技中国峰会Dev Day线上来袭!

亚马逊云科技 (Amazon Web Services)

财经大课:如何看待规模化与差异化竞争

石云升

财经思维 9月日更

MySQL 获取表的信息

玄兴梦影

MySQL 数据库表 查询语句

网络攻防学习笔记 Day124

穿过生命散发芬芳

9月日更 互联网安全

Java + opencv 实现图片修复(图片去水印)

张音乐

Java OpenCV 音视频 9月日更 图片去水印

链路压测中各接口性能统计

FunTester

性能测试 测试框架 测试开发 FunTester 链路测试

HTTP系列之:HTTP中的cookies

程序那些事

Java 网络协议 HTTP cookies

Go 专栏|复合数据类型:字典 map 和 结构体 struct

AlwaysBeta

Go 语言

北鲲云超算平台如何帮助现代生物制药发展?

北鲲云

重磅!博睿数据通过CMMI5级评估,国内APM领域首家

博睿数据

数据结构和算法在流程画布中的实际应用

GrowingIO技术专栏

数据结构 G6 图可视化引擎 流程画布

Go 专栏|变量和常量的声明与赋值

AlwaysBeta

Go 语言

“人类先锋”点亮物联网灯塔

脑极体

数字人民币最新技术成果将亮相2021年服贸会

CECBC

🐦【Mybatis开发指南】如何清晰的解决出现「多对一模型」和「一对多模型」的问题

浩宇天尚

Java mybatis mybatis配置 9月日更

【HTML5游戏】从敲打空格键开始

devpoint

HTML5游戏 9月日更

Go 专栏|复合数据类型:数组和切片 slice

AlwaysBeta

Go 语言

Go 专栏|接口 interface

AlwaysBeta

Go 语言

AISWare AntDB 亚信数据库在多省份计费系统应用案例

亚信AntDB数据库

案例分享 #数据库 9月日更

线程同步类CyclicBarrier在性能测试集合点应用

FunTester

多线程 性能测试 线程安全 测试框架 FunTester

LeetCode刷题278-简单-第一个错误版本

ベ布小禅

9月日更

Linux内核四大核心框架

hanaper

以两军问题为背景来演绎BasicPaxos

OpenIM

Go 专栏|函数那些事

AlwaysBeta

Go 语言

Go 专栏|错误处理:defer,panic 和 recover

AlwaysBeta

Go 语言

Go 专栏|说说方法

AlwaysBeta

Go 语言

(深入篇)漫游语音识别技术—带你走进语音识别技术的世界

声网

深度学习 音视频 语音识别

如何在多个账户中共享加密 AMI,以启动加密 EC2 实例_文化 & 方法_亚马逊云科技 (Amazon Web Services)_InfoQ精选文章