

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

# 构建以与配合使用 AMIs 的最佳实践 AWS Marketplace
<a name="best-practices-for-building-your-amis"></a>

本主题提供最佳实践和参考，以帮助您构建 Amazon 系统映像 (AMIs) 以供使用 AWS Marketplace。 AMIs 构建并提交至 AWS Marketplace 必须遵守所有 AWS Marketplace 产品政策。有关更多信息，请参阅以下部分。

**Topics**
+ [保护转售权](#rights)
+ [构建 AMI](#building-an-ami)
+ [为您的 AMI 做好准备和保护 AWS Marketplace](#securing-an-ami)
+ [扫描您的 AMI 以了解发布要求](#self-service-scanning)
+ [验证您的软件是否在 AWS Marketplace AMI 上运行](#verifying-ami-runtime)

## 保护转售权
<a name="rights"></a>

对于非免费 Linux 发行版，您有责任确保它们的转售权，但 AWS提供的 Amazon Linux、RHEL 和 SUSE 除外。你不需要获得 Windows AMIs 的经销权。

## 构建 AMI
<a name="building-an-ami"></a>

使用以下指南进行构建 AMIs：
+ 确保您的 AMI 符合所有[AWS Marketplace 政策](https://docs.aws.amazon.com/marketplace/latest/userguide/product-and-ami-policies.html)。
+ 在美国东部（弗吉尼亚州北部）区域中创建 AMI。
+ 使用由亚马逊弹性区块商店 (Amazon EBS) Elastic Block Store (Amazon EBS) AMIs 支持的现有产品创建产品，其生命周期由值得信赖的信誉良好的来源提供，例如。 AWS Marketplace
+  AMIs 使用最多的 up-to-date操作系统、软件包和软件进行构建。
+  确保您的 AMI 基于一个使用硬件虚拟机（HVM）虚拟化和 64 位架构的公有 Amazon EC2 AMI。
+ 为构建、更新和重新 AMIs发布制定可重复的流程。
+ 跨所有版本和产品使用一致的操作系统 (OS) 用户名。推荐的默认用户名如下：Linux 及其他类 Unix 系统使用 `ec2-user`，Windows 系统使用 `Administrator`。
+ 在提交最终的 AMI 进行 AWS Marketplace 发布之前，请启动并测试您的 AMI 中的实例，以验证预期的最终用户体验。在此实例上测试所有安装方法、功能和性能。
+ 按如下方式检查端口设置：
  + 作为针对开放式防火墙、反向代理和 SSRF 漏洞[的最佳实践安全配置](https://aws.amazon.com/blogs/security/defense-in-depth-open-firewalls-reverse-proxies-ssrf-vulnerabilities-ec2-instance-metadata-service/)，**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 的更多信息，请参阅以下资源：
+  《Amazon EC2 用户指南》中的[创建 Amazon EBS-backed AMI](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/creating-an-ami-ebs.html)**
+  《Amazon EC2 用户指南》中的[使用 Windows Sysprep 创建 Amazon EC2 AMI](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ami-create-win-sysprep.html)** 
+  [如何从由 EBS 支持的 实例创建 亚马逊机器映像 (AMI)？](https://aws.amazon.com/premiumsupport/knowledge-center/create-ami-ebs-backed/) 
+  [Amazon Linux AMI](https://aws.amazon.com/amazon-linux-ami/) 
+  [Amazon EC2 实例类型](https://aws.amazon.com/ec2/instance-types/)和[实例类型](http://docs.amazonwebservices.com/AWSEC2/latest/UserGuide/instance-types.html?r=2153) 
+  [配置默认使用 IMDS V2 的 AMI](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-IMDS-new-instances.html#configure-IMDS-new-instances-ami-configuration) 

## 为您的 AMI 做好准备和保护 AWS Marketplace
<a name="securing-an-ami"></a>

我们建议您遵循以下准则来创建安全 AMIs：
+ 使用 *Amazon EC2 用户[指南 AMIs中的共享 Linux](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/building-shared-amis.html) 指南*
+ 设计 AMI 的架构以便将其部署为最小安装，从而减小攻击面。禁用或删除不必要的服务和程序。
+ 只要有可能，就对网络流量使用 end-to-end加密。例如，使用安全套接字层 (SSL) 保护您与买家之间的 HTTP 会话。确保您的服务仅使用有效的和 up-to-date证书。
+ 记录 AMI 产品时，向买家提供安全组建议，以控制对其实例的入站流量访问。您的建议应指定以下内容：
  + 您的服务正常运行所需的最少端口集。
  + 用于管理访问的推荐端口和源 IP 地址范围。

  这些安全组建议可帮助买家实施适当的访问控制。有关如何向 AMI 产品添加新版本的更多信息，请参阅[添加新版本](single-ami-versions.md#single-ami-adding-version)。
+ 可以考虑定期对您的 AWS 计算环境进行渗透测试，或者考虑聘请第三方代表您进行此类测试。有关更多信息，包括渗透测试申请表单，请参阅 [AWS 渗透测试](https://aws.amazon.com/security/penetration-testing/)。
+ 注意 Web 应用程序的十大漏洞并相应地构建您的应用程序。要了解更多信息，请参阅[开源 Web 应用程序安全计划 (OWASP) – 十大 Web 应用程序安全风险](https://owasp.org/www-project-top-ten/)。当发现新的 Internet 漏洞时，迅速更新您的 AMI 中随附的任何 Web 应用程序。包含此信息的资源示例包括[SecurityFocus](http://www.securityfocus.com/vulnerabilities)和 [NIST 国家漏洞数据库](http://nvd.nist.gov/)。

有关安全性的更多信息，请参阅以下相关资源：
+  [AWS Cloud 安全性](https://aws.amazon.com/security/) 
+  [Center for Internet Security (CIS)：安全基准](http://benchmarks.cisecurity.org/downloads/benchmarks/) 
+  [开源 Web 应用程序安全计划 (OWASP)：安全编码实践 – 快速参考指南](https://owasp.org/www-project-secure-coding-practices-quick-reference-guide/) 
+  [OWASP 十大 Web 应用程序安全风险](https://owasp.org/www-project-top-ten/) 
+  [SANS（SysAdmin、审计、网络和安全）常见弱点枚举 (CWE) 前 25 个最危险的软件错误](http://www.sans.org/top25-software-errors/) 
+  [安全焦点](http://www.securityfocus.com/vulnerabilities) 
+  [NIST 国家漏洞数据库](http://nvd.nist.gov/) 

## 扫描您的 AMI 以了解发布要求
<a name="self-service-scanning"></a>

要在 AWS Marketplace 目录上发布您的 AMI，必须完成 AMI 扫描。AMI 扫描会检查未修补的常见漏洞和漏洞 (CVEs)，并验证您的 AMI 是否遵循安全最佳实践。有关更多信息，请参阅[准备和保护您的 AMI AWS Marketplace](https://docs.aws.amazon.com/marketplace/latest/userguide/best-practices-for-building-your-amis.html#securing-an-ami)

要启动测试扫描，您必须拥有现有 AMI 产品。要了解如何创建 AMI 产品，请参阅[创建 AMI-based 产品](ami-single-ami-products.md)。

要执行 AMI 扫描，请执行以下操作：

1. 从 [AWS Marketplace 管理门户](https://aws.amazon.com/marketplace/management/homepage) 中导航到**产品**菜单，并选择**服务器**。

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

1. 导航至**请求更改**菜单，然后选择**更新版本**。

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

**注意**  
要了解如何授予对您的 AMI 的 AWS Marketplace 访问权限，请参阅[授予对您的 AMI 的 AWS Marketplace 访问权限](single-ami-marketplace-ami-access.md)。

## 验证您的软件是否在 AWS Marketplace AMI 上运行
<a name="verifying-ami-runtime"></a>

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

要验证 Amazon EC2 实例是通过您的 AMI 产品创建的，请使用 Amazon EC2 中内置的实例元数据服务。以下步骤将引导您完成此验证。有关使用元数据服务的更多信息，请参阅《Amazon Elastic Compute Cloud 用户指南》**中的[实例元数据和用户数据](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html)。

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"
   }
   ```

1. *验证实例身份文档*

   您可以使用签名验证实例身份是否正确。有关此过程的详细信息，请参阅《Amazon Elastic Compute Cloud 用户指南》**中的[实例身份文档](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-identity-documents.html)。

1. *验证产品代码*

   当您最初提交 AMI 产品以供发布时， AWS Marketplace会为您的产品分配一个[产品代码](https://docs.aws.amazon.com/marketplace/latest/userguide/ami-getting-started.html#ami-product-codes)。您可以通过检查实例身份文档中的 `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 产品的代码相匹配，则该实例是根据您的产品创建的。