亚马逊AWS官方博客

AWS Marketplace China AMI 制作技术指导

第1章 AMI 安全指导原则

Amazon 系统映像 (AMI) 提供启动实例 (云中的虚拟服务器) 所需的信息。 AMI 包括以下内容:

  • 一个用于实例 (例如,操作系统、应用程序服务器和应用程序) 根卷的模板
  • 控制可以使用 AMI 启动实例的 AWS 账户的启动许可
  • 一个指定在实例启动时要附加到实例的卷的块储存设备映射。

AWS Marketplace 是一个在线商店,您可以在商店中出售或购买在 Amazon Web Services (AWS) 上运行的软件,AWS Marketplace 现在是通过 AWS 销售软件和服务的统一电子商务平台。您可以使用 AWS Marketplace 销售 AMI,AWS Marketplace 提供组织有序的购物体验,为提高您创建的 AMI 的可靠性,并缩小攻击面,请遵循以下指导性原则:

1.1  AMI创建阶段

  • 从现有的、维护良好的EBS支持的AMI中创建定制的AMI,并具有明确定义的生命周期,请不要使用来历不明的AMI,为节省成本推荐使用Amazon Linux。
  • 开发一个可重复的过程来构建、更新和重新发布AMI。
  • 在构建映像之前,请提前配置一个符合您软件运行环境的EC2实例。
  • 构建映像后,在Amazon EC2环境中运行它以检查安装,功能和性能等内容。
  • 使用最新的操作系统、软件包和软件构建AMI。

1.2  AMI安全防护

  • 确保您的AMI不包含没有密码的用户帐户或包含默认密码的用户帐户。
  • 使用为每个用户创建唯一密码或密钥的服务生成密码,并将密码直接发送给用户或创建强制功能以供用户更改密码。
  • 只要有可能,对网络流量使用端对端加密。例如,使用安全套接字层(SSL)来保护您和您的客户之间的HTTP会话。确保您的服务仅使用有效和最新的证书。
  • 使用安全组来控制对您的实例的入站流量访问。确保您的安全组被配置为只允许访问为您的服务提供必要功能所需的最小端口集。另外,只允许管理员访问必要的最小的一组端口和源IP地址范围。
  • 构建您的AMI作为最低限度的安装来减少攻击面。您应该禁用或删除不必要的服务和程序。
  • 禁用sshd(SSH守护进程)的远程root登录。要求所有用户使用他们的标准用户名进行SSH。如果他们需要访问root权限,他们应该使用sudo命令。sudo允许您控制允许哪些用户执行根功能并记录活动,以便有审计跟踪。
  • 用户帐户的SSH访问应该通过为每个用户生成安全密钥来完成。不要为用户提供简单的基于密码的帐户。为每个用户生成安全密钥以启用对实例的SSH访问。
  • 请确保敏感信息(如密码或密钥材料)绝不会以明文形式写入日志,标签或控制台等地方。对于Windows,应检查Ec2Config服务配置以确保其符合您的安全策略。
  • 通过仅允许具有访问系统的有效理由的IP地址范围(例如公司或组织中的IP地址范围)来限制对用于管理访问的端口的访问。
  • 当发现新的Internet漏洞时,请及时更新AMI中的所有Web应用程序。

1.3  AMI提交阶段

  • 在AWS Marketplace上提交AMI之前,我们建议您尽可能确保映像不存在已知的漏洞和恶意软件。Chkrootkit,rkhunter和Nessus都有一些工具可用于此目的。
  • 在测试之后,确保通过移除测试中使用的所有用户,帐户,密码,密钥和文档(无论这些项目可能存储在哪里),从系统中删除所有用户凭据。
  • 在AWS Marketplace上提交产品之前,请确保已经删除了用于测试目的的所有SSH密钥。有时SSH密钥存储在AMI的多个地方。检查您是否找到并删除了您不打算在AMI中运送的所有SSH密钥。
  • 不要在您的AMI中包含收集和输出客户数据的软件。

1.4  AMI维护阶段

  • 一旦您的AMI发布,就有一个流程来监控AMI中部署的软件的漏洞和安全更新。确保基于AMI的正在运行的实例经常更新,尤其是在有新的更新可用时。
  • 定期用最新的更新重建AMI,以便基于AMI新创建的实例将具有最新的补丁。
  • 考虑定期对AWS计算环境进行渗透测试。

第2章 AMI 上线操作指南

Marketplace AMI主要是包括了Seller应用软件的一种分发形式,预安装、预配置,用户通过订阅快速部署到自己的VPC,简化软件的安装配置过程。

首先,Seller需要在AWS 中国(宁夏)区域(cn-northwest-1)创建、共享AMI,并通过安全审核,然后进行Listing,需要选择AMI所要支持的Region以及产品相关的一些信息,最后到Publishing,此时将由Marketplace运营团队分发AMI到所支持的Region,并能在Marketplace进行订阅。

后面我们将详细介绍从零开始制作AMI、从共享AMI生成自己的AMI、从北京往宁夏复制AMI、把虚拟机导入成一个AMI四种种情况进行说明。

2.1  从零开始制作AMI

登录AWS中国控制台,选择EC2,并从右上角切换到中国(宁夏)区域

2.1.1  Linux AMI 制作过程

启动一个全新的EC2实例并安装、配置、打包您的软件到实例操作系统;

1.为了系统完全,尽可能选择较新的AMI作为基础环境;

2.为了节省成本,尽可能选择Amazon Linux作为基础环境;

3.做好磁盘规划,EBS空间不要过大,以满足需要的最小空间为限,后期客户可根据需要自行调整;

4.如果软件有默认密码,请选择部署后的实例ID(AMI启动过程中可以通过实例元数据获得)作为密码;

在打包结束后,请参考第一章清理SSH Key相关信息,主要是清除下面的Key文件,不留后门,如果不清理过不了安全检查。

sudo shred -u /etc/ssh/*_key /etc/ssh/*_key.pub

sudo rm /root/.ssh/authorized_keys

sudo rm /home/ec2-user/.ssh/authorized_keys

sudo rm /home/用户/.ssh/authorized_keys

用户根据不同的操作系统会有所区别。

2.1.2  Windows Server 2016 及更高版本AMI制作过程

如果采用Windows AMI请参考下面的内容:

https://docs.thinkwithwp.com/zh_cn/AWSEC2/latest/WindowsGuide/ami-create-standard.html

系统准备 (Sysprep) 工具可简化复制 Microsoft Windows 自定义安装的过程。我们建议您使用 Sysprep 创建标准化 Amazon 系统映像 (AMI)。随后可以通过此标准化映像为 Windows 创建新的 Amazon EC2 实例。

建议您将 Sysprep 与 EC2Launch(Windows Server 2016 及更高版本)或 EC2Config 服务(Windows Server 2016 之前的版本)一起运行。

不要使用 Sysprep 创建实例备份。Sysprep 会删除特定于系统的信息;删除这些信息可能会对实例备份导致意外结果。

Windows 2016及更高版本操作系统,生成AMI前请执行下面的操作:

制作AMI前需要运行一个操作(将Sysprep与EC2Launch结合使用)进行设置,并会自动停止Windows,在停止的Windows实例上再做AMI,就可以正常解密出密码了,如果不运行此操作生成的AMI无法获取密码。详细参考如下:

https://docs.thinkwithwp.com/zh_cn/AWSEC2/latest/WindowsGuide/ec2launch.html

使用EC2Launch Settings应用程序运行Sysprep,步骤如下:

1.在Amazon EC2控制台中,找到或创建Windows Server 2016或更高版本AMI。

2.从该AMI中启动Windows实例。

3.连接到您的Windows实例并对其进行自定义。

4.搜索并运行EC2LaunchSettings应用程序。默认情况下它位于以下内容:

C:\ProgramData\Amazon\EC2-Windows\Launch\Settings。

5.根据需要选中或清除选项。这些设置存储在 LaunchConfig.json 文件中。

6.对于 Administrator Password,请执行以下操作之一:

  • 选择 Random。EC2Launch 生成一个密码并使用用户的密钥对其进行加密。系统会在实例启动后禁用此设置,以便在重新启动或停止再启动实例后该密码仍然存在。
  • 选择 Specify 并键入一个符合系统要求的密码。该密码以明文方式存储在 LaunchConfig.json 文件中,并且在 Sysprep 设置管理员密码时会被删除。如果现在就关闭,则会立即设置密码。EC2Launch 使用用户的密钥对密码进行加密。
  • 选择 DoNothing 并在 unattend.xml 文件中指定密码。如果未在 unattend.xml 中指定密码,管理员账户会被禁用。

7.选择 Shutdown with Sysprep (使用 Sysprep 关闭)。

2.1.3  Windows Server 2016 之前版本AMI制作过程

通过以下过程可使用 Sysprep 和 EC2Config 服务创建标准化 AMI。

1.在 Amazon EC2 控制台中,查找或创建要复制的 AMI。

2.启动并连接到您的 Windows 实例。

3.对它进行自定义。

4.在 EC2Config 服务应答文件中指定配置设置:

C:\Program Files\Amazon\Ec2ConfigService\sysprep2008.xml

5.在 Windows 开始菜单中,选择所有程序,然后选择 EC2ConfigService Settings。

6.在 Ec2 Service Properties 对话框中选择 Image 选项卡。有关 Ec2 Service Properties 对话框中的选项和设置的更多信息,请参阅 Ec2 服务属性

7.选择管理员密码选项,然后选择 Shutdown with Sysprep 或 Shutdown without Sysprep。EC2Config 会根据您选择的密码选项编辑设置文件。

  • Random:EC2Config 生成一个密码,使用用户的密钥加密,并向控制台显示加密的密码。我们会在首次启动后禁用此设置,以便在重启或停止再启动实例后该密码仍然存在。
  • Specify:密码以非加密格式(明文)存储在 Sysprep 应答文件中。下一次运行 Sysprep 时,它将设置管理员密码。如果现在就关闭,则会立即设置密码。服务再次启动时,则会删除管理员密码。务必要记住此密码,因为以后无法将其取回。
  • Keep Existing:运行 Sysprep 或重新启动 EC2Config 时,管理员账户的现有密码不变。务必要记住此密码,因为以后无法将其取回。

8.选择 OK。

如果系统询问您是否想运行 Sysprep 并关闭该实例,请单击 Yes。您会看到 EC2Config 运行 Sysprep。然后,您会退出实例并且实例会关闭。如果您在 Amazon EC2 控制台中查看 Instances (实例) 页面,实例状态会从 running 变为 stopping,然后最终变为 stopped。此时,从该实例创建一个 AMI 是安全的。

第四步:创建映像(建议先停止实例)


创建时间因EBS卷大小而异,等待创建结束,在AMI里面可以看到刚创建的AMI,请用此AMI去启动新的AMI,看是否符合预期;

2.2  从共享AMI生成自己的AMI

由于Seller需要提定专门的AWS帐户来共享AMI给Marketplace的帐户,如果是其他帐户共享给你的AMI,你不能再次共享给AWS 指定的Marketplace帐户,需要先拿共享AMI启动一个新的EC2实例,再创建一个属于自己的AMI并共享。

第一步:拿AMI启动一个新的实例

如果只是为了生成自己的AMI,并不需要进系统做配置,可以选无密钥对方式。

创建AMI之前,如果是无密钥对方式可以忽略此步骤,如果有密钥对,请参考第一章清理SSH Key相关信息,主要是清除下面的Key文件,不留后门,如果不清理过不了安全检查。

sudo shred -u /etc/ssh/*_key /etc/ssh/*_key.pub

rm /home/ec2-user/.ssh/authorized_keys

2.3  从北京往宁夏复制AMI

如果Seller已经在北京有了AMI,可以直接复制到宁夏,但你必须AMI拥有者才允许此操作,否则参照第2.2章先生成自己的AMI。


2.4  把虚拟机导入成AMI

由于一些Seller采用自己定制Linux版本进行AMI的分发,现阶段没办法完全100%能导入成功,可以参考VMimport的说明进行操作。

https://docs.thinkwithwp.com/zh_cn/vm-import/latest/userguide/vmie_prereqs.html

如果VMimport不能成功导入AMI,请自行开Case寻求AWS Support或直接电话咨询AWS售后热线。

中国的EC2平台和AWS Global存在差异,在Global能导入的在中国不一定能导入,请提前测试,如果找不到好的解决办法,建议选中国的标准AMI重新部署您的软件。

2.5  如何共享AMI

选中需要共享给Marketplace的AMI,在权限Tab页选择“编辑”,输入帐号即可,大约5 分钟之后Marketplace帐号那边就能看一共享过来的AMI。

建议不要随便选择公有,在私有模式下

输入12位的Marketplace帐号

第3章 参考资源

3.1  EC2 AMI技术说明

EC2 AMI相关说明

https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/AMIs.html

https://docs.thinkwithwp.com/zh_cn/AWSEC2/latest/WindowsGuide/AMIs.html

 

Linux AMI 指导原则

https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/building-shared-amis.html

 

Windows AMI 指导原则

https://docs.thinkwithwp.com/zh_cn/AWSEC2/latest/WindowsGuide/ami-create-standard.html

https://docs.thinkwithwp.com/zh_cn/AWSEC2/latest/WindowsGuide/ec2launch.html#ec2launch-sysprep

 

共享 AMI

https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/sharing-amis.html

 

VM Import/Export 虚拟机导入AMI说明

https://docs.thinkwithwp.com/zh_cn/vm-import/latest/userguide/vmie_prereqs.html

 

Public AMI Publishing: Hardening and Clean-up Requirements

https://thinkwithwp.com/cn/articles/public-ami-publishing-hardening-and-clean-up-requirements/

 

How to Share and Use Public AMIs in A Secure Manner

https://thinkwithwp.com/cn/articles/how-to-share-and-use-public-amis-in-a-secure-manner/

3.2  Global Marketplace AMI指导

由于还没有For China的Marketplace门户网站,有一些Global的资源可以参考:

AWS Marketplace 文档中心

https://docs.thinkwithwp.com/zh_cn/marketplace/latest/userguide/what-is-marketplace.html

 

AWS Marketplace产品和 AMI 策略

https://docs.thinkwithwp.com/zh_cn/marketplace/latest/userguide/product-and-ami-policies.html

 

Building AMIs for AWS Marketplace

https://thinkwithwp.com/marketplace/help/seller-building-AMIs?ref=help_ln_sibling

 

Pricing, Listing and Updating AMIs

https://thinkwithwp.com/marketplace/help/seller-AMIs?ref=help_ln_sibling

 

Help and FAQ

https://thinkwithwp.com/marketplace/help?ref_=header_modules_help

 

Seller Help

https://thinkwithwp.com/marketplace/help/seller-before-you-begin?ref=help_ln_sibling

 

Best Practices Guides

https://thinkwithwp.com/marketplace/help/seller-naming-guidance

 

本篇作者

蒋华

AWS APN 合作伙伴解决方案架构师,主要负责 AWS (中国)合作伙伴的技术支持工作,同时致力于 AWS 云服务在国内的应用及推广,并在关系型数据库服务、存储服务、分析服务、 HA/DR 及云端应用迁移方面有着丰富的设计和实战经验。加入 AWS 之前,曾在 IBM(中国) 工作12年,历任数据库售前工程师、UNIX 服务器资深售前工程师及解决方案架构师,熟悉传统企业 IT 架构、私有云及混合云部署,在数据库、数据仓库、高可用容灾及企业应用架构等方面有多年实践经验。

 

版权说明

本文件中出现的任何文字叙述、文档格式、插图、照片、方法、过程等内容,除另有特别注明,版权均属AWS公司所有,受到有关产权及版权法保护。任何个人、机构未经AWS公司的书面授权许可,不得复制、引用或传播本文件的任何片断,无论通过电子形式或非电子形式。