构建 AMI 以与 AWS Marketplace 配合使用的最佳实践 - AWS Marketplace

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

构建 AMI 以与 AWS Marketplace 配合使用的最佳实践

本主题提供了最佳实践和参考信息,可帮助您构建亚马逊机器映像(AMI)以便与 AWS Marketplace 配合使用。所有已生成并提交到 AWS Marketplace 的 AMI 都必须遵守所有 AWS Marketplace 产品策略。有关更多信息,请参阅以下部分。

保护转售权

对于非免费 Linux 发行版,您需自行负责获取其转售权,但 AWS 提供的 Amazon Linux、RHEL 和 SUSE 除外。对于 Windows AMI,您无需获取转售权。

构建 AMI

可采用以下准则来构建 AMI:

  • 确保您的 AMI 符合所有 AWS Marketplace 政策

  • 在美国东部(弗吉尼亚州北部)区域中创建 AMI。

  • 从现有受到良好维护且由 Amazon Elastic Block Store (Amazon EBS) 支持的 AMI 创建产品,并且产品必须具有由可信、可靠来源(例如,AWS Marketplace)提供的明确定义的生命周期。

  • 使用最新的操作系统、程序包和软件构建 AMI。

  • 确保您的 AMI 基于一个使用硬件虚拟机(HVM)虚拟化和 64 位架构的公有 Amazon EC2 AMI。

  • 制定一个用于构建、更新和重新发布 AMI 的可重复过程。

  • 跨所有版本和产品使用一致的操作系统 (OS) 用户名。推荐的默认用户名如下:Linux 及其他类 Unix 系统使用 ec2-user,Windows 系统使用 Administrator

  • 向 AWS Marketplace 提交最终 AMI 以进行发布前,需从该 AMI 启动实例并开展测试,验证最终用户的预期使用体验。在此实例上测试所有安装方法、功能和性能。

  • 按如下方式检查端口设置:

    • 作为防范开放防火墙、反向代理及 SSRF 漏洞的最佳安全配置实践IMDS 支持选项必须仅设置为 IMDSv2。在最终构建阶段注册新 AMI 时,可以使用以下 CLI:

      • aws ec2 register-image --name my-image --root-device-name /dev/xvda --block-device-mappings DeviceName=/dev/xvda,Ebs={SnapshotId=snap-0123456789example} --architecture x86_64 --imds-support v2.0

有关创建 AMI 的更多信息,请参阅以下资源:

做好准备并保护您的 AWS Marketplace AMI

我们建议按照以下准则来创建安全的 AMI:

  • 使用《Amazon EC2 用户指南》中的共享 Linux AMI 指南

  • 设计 AMI 的架构以便将其部署为最小安装,从而减小攻击面。禁用或删除不必要的服务和程序。

  • 只要可能,就使用端到端加密来保护网络流量。例如,使用安全套接字层 (SSL) 保护您与买家之间的 HTTP 会话。确保您的服务只使用有效且最新的证书。

  • 记录 AMI 产品时,向买家提供安全组建议,以控制对其实例的入站流量访问。您的建议应指定以下内容:

    • 您的服务正常运行所需的最少端口集。

    • 用于管理访问的推荐端口和源 IP 地址范围。

    这些安全组建议可帮助买家实施适当的访问控制。有关如何向 AMI 产品添加新版本的更多信息,请参阅添加新版本

  • 考虑定期对您的 AWS 计算环境执行渗透测试;或考虑利用第三方代表您进行此类测试。有关更多信息,包括渗透测试申请表单,请参阅 AWS 渗透测试

  • 注意 Web 应用程序的十大漏洞并相应地构建您的应用程序。要了解更多信息,请参阅开源 Web 应用程序安全计划 (OWASP) – 十大 Web 应用程序安全风险。当发现新的 Internet 漏洞时,迅速更新您的 AMI 中随附的任何 Web 应用程序。有关包含此信息的资源的示例,请参阅 SecurityFocusNIST 国家漏洞数据库

有关安全性的更多信息,请参阅以下相关资源:

扫描您的 AMI 以了解发布要求

要在 AWS Marketplace Catalog 上发布您的 AMI,必须完成 AMI 扫描。AMI 扫描会检查未修补的常见漏洞和风险(CVE),并验证您的 AMI 是否遵循安全最佳实践。有关更多信息,请参阅为 AWS Marketplace 准备和保护 AMI

要执行 AMI 扫描,请选择以下选项之一:

选项 1:“资产”菜单

此方法允许在产品创建流程之外对 AMI 进行扫描。对于使用 SaaS 快速启动且需要在不创建 AMI 产品的情况下扫描资源的 SaaS 卖家而言,此方法同样适用。

  1. AWS Marketplace 管理门户 中,导航到资产菜单并选择亚马逊机器映像

  2. 要开始扫描过程,请选择添加 AMI

  3. 返回此页面,您可以查看 AMI 扫描状态。

选项 2:“请求更改”菜单

此选项适用于已创建 AMI 产品的卖家。有关更多信息,请参阅创建基于 AMI 的产品

  1. AWS Marketplace 管理门户 中导航到产品菜单,并选择服务器

  2. 服务器产品中选择您的产品。这必须是基于 AMI 的产品。产品可以处于任何状态,并且无需处于公开发布状态即可执行后续步骤。

  3. 导航至请求更改菜单,然后选择更新版本

  4. 选择测试“添加版本”。按照提示提交包含您的 AMI 详细信息的请求。如果请求成功,则表示 AMI 已成功通过扫描。与添加新版本选项不同,如果扫描成功,测试“添加版本”不会向基于 AMI 的产品添加新版本。

注意

要了解如何授予 AWS Marketplace 对您的 AMI 的访问权限,请参阅授予 AWS Marketplace 对您的 AMI 的访问权限

验证您的软件是否在 AWS Marketplace AMI 上运行

强烈建议您的软件在运行时验证它是否在使用您的 AMI 产品创建的 Amazon EC2 实例上运行。

要验证 Amazon EC2 实例是通过您的 AMI 产品创建的,请使用 Amazon EC2 中内置的实例元数据服务。以下步骤将引导您完成此验证。有关使用元数据服务的更多信息,请参阅《Amazon Elastic Compute Cloud 用户指南》中的实例元数据和用户数据

  1. 获取实例身份证件

    每个正在运行的实例都有一个可从该实例访问的身份证件,该文件提供有关实例本身的数据。以下示例演示如何使用实例中的 curl 检索实例身份文档。

    IMDSv2:(推荐)

    TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \ && curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/dynamic/instance-identity/document { "accountId" : "0123456789", "architecture" : "x86_64", "availabilityZone" : "us-east-1e", "billingProducts" : null, "devpayProductCodes" : null, "marketplaceProductCodes" : [ "0vg0000000000000000000000" ], "imageId" : "ami-0123456789abcdef1", "instanceId" : "i-0123456789abcdef0", "instanceType" : "t2.medium", "kernelId" : null, "pendingTime" : "2020-02-25T20:23:14Z", "privateIp" : "10.0.0.2", "ramdiskId" : null, "region" : "us-east-1", "version" : "2017-09-30" }

    IMDSv1:

    curl http://169.254.169.254/latest/dynamic/instance-identity/document{ "accountId" : "0123456789", "architecture" : "x86_64", "availabilityZone" : "us-east-1e", "billingProducts" : null, "devpayProductCodes" : null, "marketplaceProductCodes" : [ "0vg0000000000000000000000" ], "imageId" : "ami-0123456789abcdef1", "instanceId" : "i-0123456789abcdef0", "instanceType" : "t2.medium", "kernelId" : null, "pendingTime" : "2020-02-25T20:23:14Z", "privateIp" : "10.0.0.2", "ramdiskId" : null, "region" : "us-east-1", "version" : "2017-09-30" }
  2. 验证实例身份文档

    您可以使用签名验证实例身份是否正确。有关此过程的详细信息,请参阅《Amazon Elastic Compute Cloud 用户指南》中的实例身份文档

  3. 验证产品代码

    当您最初提交 AMI 产品以供发布时,AWS Marketplace 会为您的产品分配一个产品代码。您可以通过检查实例身份文档中的 marketplaceProductCodes 字段来验证产品代码,也可以直接从元数据服务获取产品代码:

    IMDSv2:

    TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \ && curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/product-codes

    如果产品代码与您的 AMI 产品的代码相匹配,则该实例是根据您的产品创建的。