

# Amazon EC2 中的安全性
<a name="ec2-security"></a>

AWS 十分重视云安全性。作为 AWS 客户，您将从专为满足大多数安全敏感型组织的要求而打造的数据中心和网络架构中受益。

安全性是 AWS 和您的共同责任。[责任共担模式](https://aws.amazon.com/compliance/shared-responsibility-model/)将其描述为云的安全性和云中的安全性：
+ **云安全性**：AWS 负责保护在 AWS 云中运行 AWS 服务的基础结构。AWS 还向您提供可安全使用的服务。作为[AWS合规性计划](https://aws.amazon.com/compliance/programs/)的一部分，第三方审计人员将定期测试和验证安全性的有效性。要了解适用于 Amazon EC2 的合规性计划，请参阅 内的[AWS 服务合规性计划范围内](https://aws.amazon.com/compliance/services-in-scope/)的服务。
+ **云中的安全性** – 您的责任包括以下各个方面：
  + 例如，通过配置 VPC 和安全组来控制对实例的网络访问。有关更多信息，请参阅[控制网络流量](infrastructure-security.md#control-network-traffic)。
  + 管理用于连接到您的实例的凭证。
  + 管理访客操作系统和部署到访客操作系统的软件，包括更新和安全补丁。有关更多信息，请参阅[Amazon EC2 实例的更新管理](update-management.md)。
  + 配置附加到实例的 IAM 角色以及与这些角色关联的权限。有关更多信息，请参阅[适用于 Amazon EC2 的 IAM 角色](iam-roles-for-amazon-ec2.md)。

该文档帮助您了解如何在使用 Amazon EC2 时应用责任共担模式。它说明了如何配置 Amazon EC2 以实现您的安全性和合规性目标。您还会了解如何使用其他AWS服务以帮助您监控和保护 Amazon EC2 资源。

**Topics**
+ [数据保护](data-protection.md)
+ [基础设施安全性](infrastructure-security.md)
+ [故障恢复能力](disaster-recovery-resiliency.md)
+ [合规性验证](compliance-validation.md)
+ [Identity and Access Management](security-iam.md)
+ [更新管理](update-management.md)
+ [Windows 实例的最佳实践](ec2-windows-security-best-practices.md)
+ [密钥对](ec2-key-pairs.md)
+ [安全组](ec2-security-groups.md)
+ [NitroTPM](nitrotpm.md)
+ [EC2 实例认证](nitrotpm-attestation.md)
+ [适用于 Windows 实例的凭证保护](credential-guard.md)
+ [AWS PrivateLink](interface-vpc-endpoints.md)

# Amazon EC2 中的数据保护
<a name="data-protection"></a>

AWS [责任共担模式](https://aws.amazon.com/compliance/shared-responsibility-model/)适用于 Amazon Elastic Compute Cloud 中的数据保护。如该模式中所述，AWS 负责保护运行所有 AWS 云 的全球基础结构。您负责维护对托管在此基础结构上的内容的控制。您还负责您所使用的 AWS 服务 的安全配置和管理任务。有关数据隐私的更多信息，请参阅[数据隐私常见问题](https://aws.amazon.com/compliance/data-privacy-faq/)。有关欧洲数据保护的信息，请参阅 *AWS Security Blog* 上的 [AWS Shared Responsibility Model and GDPR](https://aws.amazon.com/blogs/security/the-aws-shared-responsibility-model-and-gdpr/) 博客文章。

出于数据保护目的，建议您保护 AWS 账户 凭证并使用 AWS IAM Identity Center 或 AWS Identity and Access Management（IAM）设置单个用户。这样，每个用户只获得履行其工作职责所需的权限。还建议您通过以下方式保护数据：
+ 对每个账户使用多重身份验证（MFA）。
+ 使用 SSL/TLS 与 AWS 资源进行通信。我们要求使用 TLS 1.2，建议使用 TLS 1.3。
+ 使用 AWS CloudTrail 设置 API 和用户活动日记账记录。有关使用 CloudTrail 跟踪来捕获 AWS 活动的信息，请参阅《AWS CloudTrail 用户指南》**中的[使用 CloudTrail 跟踪](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-trails.html)。
+ 使用 AWS 加密解决方案以及 AWS 服务中的所有默认安全控制。
+ 使用高级托管安全服务（例如 Amazon Macie），它有助于发现和保护存储在 Amazon S3 中的敏感数据。
+ 如果在通过命令行界面或 API 访问 AWS 时需要经过 FIPS 140-3 验证的加密模块，请使用 FIPS 端点。有关可用的 FIPS 端点的更多信息，请参阅《美国联邦信息处理标准（FIPS）第 140-3 版》[https://aws.amazon.com/compliance/fips/](https://aws.amazon.com/compliance/fips/)。

强烈建议您切勿将机密信息或敏感信息（如您客户的电子邮件地址）放入标签或自由格式文本字段（如**名称**字段）。这包括当您通过控制台、API、AWS CLI 或 AWS SDK 使用 Amazon EC2 或其他 AWS 服务 时。在用于名称的标签或自由格式文本字段中输入的任何数据都可能会用于计费或诊断日志。如果您向外部服务器提供网址，强烈建议您不要在网址中包含凭证信息来验证对该服务器的请求。

**Topics**
+ [Amazon EBS 数据安全](#ebs-data-security)
+ [静态加密](#encryption-rest)
+ [传输中加密](#encryption-transit)

## Amazon EBS 数据安全
<a name="ebs-data-security"></a>

Amazon EBS 卷作为未格式化的原始块设备呈现。这些设备是在 EBS 基础设施上创建的逻辑设备；Amazon EBS 服务可确保在客户使用或重复使用之前，这些设备为逻辑空白（即，原始数据块被归零或包含加密伪随机数据）。

如果您有要求在使用后和/或使用前使用特定方法擦除所有数据的程序，例如 **DoD 5220.22-M**（美国《国家工业安全计划操作手册》）或 **NIST 800-88**（《存储介质清理指南》）中详细说明的程序，您可以在 Amazon EBS 上执行此操作。该数据块级活动将反映到 Amazon EBS 服务的底层存储介质中。

## 静态加密
<a name="encryption-rest"></a>

**EBS 卷**  
Amazon EBS 加密是适用于 EBS 卷和快照的加密解决方案。它使用 AWS KMS keys。有关更多信息，请参阅《Amazon EBS 用户指南》**中的 [Amazon EBS 加密](https://docs.aws.amazon.com/ebs/latest/userguide/ebs-encryption.html)。

[Windows 实例] 您也可使用 Microsoft EFS 和 NTFS 权限来进行文件夹级和文件级加密。

**实例存储卷**  
NVMe 实例存储卷上的数据是使用实例上的硬件模块中实施的 XTS-AES-256 密码加密的。用于加密写入本地连接的 NVMe 存储设备的数据的密钥是针对每个客户和每个卷的。密钥由硬件模块生成并且仅位于硬件模块内，AWS 人员无法访问该模块。当实例停止或终止并且无法恢复时，将销毁所有加密密钥。无法禁用此加密，并且无法提供自己的加密密钥。

HDD 实例存储卷上的数据在 H1、D3 和 D3en 实例上使用 XTS-AES-256 和一次性密钥加密。

停止、休眠或终止实例时，实例存储卷中的每个存储数据块都会被重置。因此，无法通过另一实例的实例存储访问您的数据。

**内存**

以下实例上启用了内存加密：
+ 使用 AWS Graviton2 或更高版本 AWS Graviton 处理器的实例支持始终在线内存加密。加密密钥是在主机系统内安全生成的，不要离开主机系统，并在重新启动或关闭主机电源时销毁的。有关更多信息，请参阅 [AWS Graviton 处理器](https://aws.amazon.com/ec2/graviton/)。
+ 采用第三代英特尔至强可扩展处理器（Ice Lake）的实例（如 M6i 实例）和采用第四代英特尔至强可扩展处理器（Sapphire Rapids）的实例（如 M7i 实例）。这些处理器支持使用英特尔总内存加密 (TME) 的永远在线内存加密。
+ 采用第三代 AMD EPYC 处理器（Milan）的实例（如 M6a 实例）和采用第四代 AMD EPYC 处理器（Genoa）的实例（如 M7a 实例）。这些处理器支持使用 AMD 安全内存加密（SME）进行始终在线内存加密。
+ 某些基于 AMD 的实例类型支持 AMD 安全加密虚拟化安全嵌套分页 (SEV-SNP)。有关更多信息，请参阅 [查找支持 AMD SEV-SNP 的 EC2 实例类型](snp-find-instance-types.md)。

## 传输中加密
<a name="encryption-transit"></a>

**物理层加密**  
所有在AWS全球网络上跨AWS区域流动的数据在离开AWS保护的设施之前都会在物理层自动加密。可用区之间的所有流量均已加密。其他加密层（包括本节中列出的加密层）可能会提供额外保护。

**Amazon VPC 对等连接和 Transit Gateway 跨区域对等连接提供的加密**  
使用 Amazon VPC 对等连接和 Transit Gateway 对等连接的所有跨区域流量在离开区域时都会自动批量加密。如本节之前所述，所有跨区域流量在离开AWS保护的设施之前均会在物理层自动提供一层额外加密层。

**实例之间的加密**  
AWS 在所有类型的 EC2 实例之间提供安全的私有连接。此外，某些实例类型使用底层 Nitro 系统硬件的卸载功能，自动加密实例之间的传输中流量。此加密使用关联数据的身份验证加密（AEAD）算法，采用 256 位加密。这对网络性能没有影响。要在实例之间支持这种额外的传输中流量加密，必须满足以下要求：
+ 使用以下实例类型：
  + **通用型**：M5dn、M5n、M5zn、M6a、M6i、M6id、M6idn、M6in、M7a、M7g、M7gd、M7i、M7i-flex、M8a、M8azn、M8g、M8gb、M8gd、M8gn、M8i、M8id、M8i-flex、Mac-m4、Mac-m4pro
  + **计算优化型：**C5n、C6a、C6gn、C6i、C6id、C6in、C7a、C7g、C7gd、C7gn、C7i、C7i-flex、C8a、C8g、C8gb、C8gd、C8gn、C8i、C8id、C8i-flex
  + **内存优化型：**R5dn、R5n、R6a、R6i、R6id、R6idn、R6in、R7a、R7g、R7gd、R7i、R7iz、R8a、R8g、R8gb、R8gd、R8gn、R8i、R8id、R8i-flex、U-3tb1、U-6tb1、U-9tb1、U-12tb1、U-18tb1、U-24tb1、U7i-6tb、U7i-8tb、U7i-12tb、U7in-16tb、U7in-24tb、U7in-32tb、U7inh-32tb、X2idn、X2iedn、X2iezn、X8g、X8aedz、X8i
  + **存储优化型：**D3、D3en、I3en、I4g、I4i、I7i、I7ie、I8g、I8ge、Im4gn、Is4gen
  + **加速计算型：**DL1、DL2q、F2、G4ad、G4dn、G5、G6、G6e、G6f、Gr6、Gr6f、G7e、Inf1、Inf2、P3dn、P4d、P4de、P5、P5e、P5en、P6-B200、P6-B300、P6e-GB200、Trn1、Trn1n、Trn2、Trn2u、VT1
  + **高性能计算：**Hpc6a、Hpc6id、Hpc7a、Hpc7g、Hpc8a
+ 这些实例位于同一区域。
+ 这些实例位于相同 VPC 或对等的 VPC 中，并且流量不会通过虚拟网络设备或服务（如负载均衡器或中转网关）传输。

如本节之前所述，所有跨区域流量在离开AWS保护的设施之前均会在物理层自动提供一层额外加密层。

**使用 AWS CLI 查看加密实例之间传输中流量的实例类型**  
使用以下 [describe-instance-types](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instance-types.html) 命令。

```
aws ec2 describe-instance-types \
    --filters Name=network-info.encryption-in-transit-supported,Values=true \
    --query "InstanceTypes[*].[InstanceType]" \
    --output text | sort
```

**往返于 AWS Outposts 的加密**  
Outpost 会创建名为 *service links*（服务链接）的特殊网络连接到其 AWS 主区域，并且可以选择创建私有连接到您指定的 VPC 子网。通过这些连接的所有流量都完全加密。有关更多信息，请参阅 。[通过服务链路进行连接](https://docs.aws.amazon.com/outposts/latest/userguide/region-connectivity.html#service-links)和[传输中加密](https://docs.aws.amazon.com/outposts/latest/userguide/data-protection.html#encryption-transit)中的*AWS Outposts用户指南*。

**远程访问加密**  
SSH 和 RDP 协议直接或通过 EC2 Instance Connect 提供了用于远程访问实例的安全通信通道。使用 AWS Systems Manager Session Manage 或 Run Command 对实例的远程访问是使用 TLS 1.2 加密的，创建连接的请求是使用 [SigV4](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_sigv.html) 签名的，且由 [AWS Identity and Access Management](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html) 进行身份验证并授权。

使用传输层安全性协议（TLS）等加密协议加密在客户端和 Amazon EC2 实例之间传输的敏感数据是您的责任。

（Windows 实例）确保仅允许 EC2 实例和 AWS API 端点或其他敏感远程网络服务之间的加密连接。您可以通过出站安全组或 [Windows 防火墙](https://learn.microsoft.com/en-us/windows/security/operating-system-security/network-security/windows-firewall/)规则强制实施这一点。

# Amazon EC2 中的基础设施安全性
<a name="infrastructure-security"></a>

作为一项托管式服务，Amazon Elastic Compute Cloud 受 AWS 全球网络安全保护。有关 AWS 安全服务以及 AWS 如何保护基础设施的信息，请参阅 [AWS 云安全性](https://aws.amazon.com/security/)。要按照基础设施安全最佳实践设计您的 AWS 环境，请参阅《安全性支柱 AWS Well‐Architected Framework》**中的[基础设施保护](https://docs.aws.amazon.com/wellarchitected/latest/security-pillar/infrastructure-protection.html)。

您可以使用AWS发布的 API 调用通过网络访问 Amazon EC2。客户端必须支持以下内容：
+ 传输层安全性协议（TLS）。我们要求使用 TLS 1.2，建议使用 TLS 1.3。
+ 具有完全向前保密（PFS）的密码套件，例如 DHE（临时 Diffie-Hellman）或 ECDHE（临时椭圆曲线 Diffie-Hellman）。大多数现代系统（如 Java 7 及更高版本）都支持这些模式。

有关更多信息，请参阅《安全支柱：AWS Well-Architected 框架》**中的[基础设施保护](https://docs.aws.amazon.com/wellarchitected/latest/security-pillar/infrastructure-protection.html)。

## 网络隔离
<a name="network-isolation"></a>

虚拟私有云（VPC）是 AWS 云内您自己的逻辑隔离区域中的虚拟网络。可以使用单独的 VPC 按工作负载或组织实体隔离基础设施。

子网是 VPC 中的 IP 地址范围。在启动实例时，您可以在 VPC 上的子网中启动该实例。可以使用子网隔离单个 VPC 中的应用程序层（例如，Web、应用程序和数据库）。如果不应直接从 Internet 访问实例，请使用私有子网访问。

要使用私有 IP 地址从 VPC 调用 Amazon EC2 API，请使用 AWS PrivateLink。有关更多信息，请参阅 [使用接口 VPC 端点访问 Amazon EC2](interface-vpc-endpoints.md)。

## 物理主机上的隔离
<a name="physical-isolation"></a>

同一物理主机上的不同 EC2 实例彼此隔离，就好像它们位于不同的物理主机上一样。虚拟机监控程序隔离 CPU 和内存，并为实例提供虚拟化磁盘，而不是访问原始磁盘设备。

在停止或终止实例时，虚拟机监控程序将清理分配给实例的内存（设置为零），然后再将内存分配给新实例并重置每个存储块。这会确保不会意外向另一个实例泄露数据。

网络 MAC 地址由 AWS 网络基础设施动态分配给实例。IP 地址由 AWS 网络基础设施动态分配给实例，或者由 EC2 管理员通过经过身份验证的 API 请求进行分配。AWS 网络允许实例仅从分配给它们的 MAC 和 IP 地址发送流量。否则，将会丢弃流量。

默认情况下，实例无法接收未明确将其指定为目标地址的流量。如果需要在实例上运行网络地址转换（NATI）、路由或防火墙服务，您可以为网络接口禁用源/目标检查。

## 控制网络流量
<a name="control-network-traffic"></a>

请考虑使用以下方法来控制到 EC2 实例的网络流量：
+ 使用[安全组](ec2-security-groups.md)限制实例访问。配置允许所需最小网络流量的规则。例如，您可以仅允许来自公司网络地址范围的流量或仅允许特定协议（如 HTTPS）的流量。对于 Windows 实例，允许 Windows 管理流量和最少出站连接。
+ 使用安全组作为用于控制对 Amazon EC2 实例的网络访问的主要机制。必要时，尽量少使用网络 ACL，以提供无状态的粗略网络控制。安全组比网络 ACL 更为通用，因为它们能够执行有状态数据包筛选和创建引用其他安全组的规则。不过，网络 ACL 作为一项辅助控制，可以有效地拒绝特定流量子集或提供高级子网护栏。此外，由于网络 ACL 将应用于整个子网，因此，可以将它用作深度防御措施，以防实例在没有正确安全组的情况下意外启动。
+ [Windows 实例] 使用组策略对象（GPO）集中管理 Windows 防火墙设置，以便进一步增强网络控制。通常，客户将使用 Windows 防火墙来进一步查看网络流量并对安全组筛选器进行补充，创建高级规则来阻止特定应用程序访问网络或筛选来自子集 IP 地址的流量。例如，Windows 防火墙可以将对 EC2 元数据服务 IP 地址的访问限制为特定的用户或应用程序。或者，面向公众的服务可能使用安全组来限制特定端口的流量，而 Windows 防火墙则维护显式阻止的 IP 地址的列表。
+ 如果不应直接从 Internet 访问实例，请使用私有子网访问。使用堡垒主机或 NAT 网关从私有子网中的实例进行 Internet 访问。
+ [Windows 实例] 使用安全管理协议，如通过 SSL/TLS 进行的 RDP 封装。Remote Desktop Gateway Quick Start 提供了有关部署远程桌面网关（包括将 RDP 配置为使用 SSL/TLS）的最佳实践。
+ [Windows 实例] 使用 Active Directory 或 Directory Service 严格集中地控制和监控对 Windows 实例的交互式用户和组访问，并避免本地用户权限。此外，请避免使用域管理员，而是创建更精细的、应用程序特定的基于角色的账户。利用 Just Enough Administration (JEA)，可以在没有交互式访问或管理员访问的情况下管理对 Windows 实例进行的更改。此外，JEA 使组织能够锁定对实例管理所需的 Windows PowerShell 命令子集的管理访问权限。有关更多信息，请参阅[AWS安全性最佳实践](https://d1.awsstatic.com/whitepapers/Security/AWS_Security_Best_Practices.pdf)白皮书中关于“管理 Amazon EC2 的操作系统级访问权限”的部分。
+ [Windows 实例] 系统管理员应使用带有限访问权限的 Windows 账户执行日常活动，并且仅在有必要执行特定配置更改时提升访问权限。此外，仅在绝对必要时直接访问 Windows 实例。相反，利用中央配置管理系统（例如 EC2 Run Command、Systems Center Configuration Manager (SCCM)、Windows PowerShell DSC 或 Amazon EC2 Systems Manager (SSM)）将更改推送到 Windows 服务器。
+ 使用所需的最少网络路由配置 Amazon VPC 子网路由表。例如，仅将需要互联网的直接访问权限的 Amazon EC2 实例放置到带互联网网关路由的子网中，并且仅将需要内部网络的直接访问权限的 Amazon EC2 实例放置到带虚拟私有网关路由的子网中。
+ 考虑使用其他安全组或网络接口，独立于常规应用程序流量来控制和审计 Amazon EC2 实例管理流量。此方法可让客户实施用于更改控制的特殊 IAM 策略，从而更轻松地审计对安全组规则或自动规则验证脚本进行的更改。使用多个网络接口还提供了额外的网络流量控制选择，包括能够创建基于主机的路由策略或根据网络接口分配的子网利用不同的 VPC 子网路由规则。
+ 使用 AWS Virtual Private Network 或 Direct Connect 建立从远程网络到 VPC 的私有连接。有关更多信息，请参阅[网络到 Amazon VPC 的连接选项](https://docs.aws.amazon.com/whitepapers/latest/aws-vpc-connectivity-options/network-to-amazon-vpc-connectivity-options.html)。
+ 使用 [VPC Flow Logs](https://docs.aws.amazon.com/vpc/latest/userguide/flow-logs.html) 监控到达实例的流量。
+ 使用 [GuardDuty 恶意软件防护](https://docs.aws.amazon.com/guardduty/latest/ug/malware-protection.html)来识别实例上表明恶意软件的可疑行为，这些行为可能会损害您的工作负载、重新利用资源用于恶意使用以及未经授权访问您的数据。
+ 使用 [GuardDuty 运行时监控](https://docs.aws.amazon.com/guardduty/latest/ug/runtime-monitoring.html)来识别和应对您的实例面临的潜在威胁。有关更多信息，请参阅 [How Runtime Monitoring works with Amazon EC2 instances](https://docs.aws.amazon.com/guardduty/latest/ug/how-runtime-monitoring-works-ec2.html)（运行时监控如何与 Amazon EC2 实例协同工作）。
+ 使用 [AWS Security Hub CSPM](https://docs.aws.amazon.com/securityhub/latest/userguide/)、[可访问性分析器](https://docs.aws.amazon.com/vpc/latest/reachability/)或[网络访问分析器](https://docs.aws.amazon.com/vpc/latest/network-access-analyzer/)检查来自实例的意外网络访问。
+ 使用 [EC2 Instance Connect](connect-linux-inst-eic.md) 通过 Secure Shell（SSH）连接到实例，而无需共享和管理 SSH 密钥。
+ 使用 [AWS Systems Manager Session Manager](https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager.html) 远程访问实例，而不是打开入站 SSH 或 RDP 端口并管理密钥对。
+ 使用 [AWS Systems Manager Run Command](https://docs.aws.amazon.com/systems-manager/latest/userguide/run-command.html) 自动执行常见的管理任务，而不是连接到实例。
+ [Windows 实例] 许多 Windows 操作系统角色和 Microsoft 业务应用程序还提供了增强功能，例如 IIS 中的 IP 地址范围限制、Microsoft SQL Server 中的 TCP/IP 筛选策略以及 Microsoft Exchange 中的连接筛选策略。应用层中的网络限制功能可以为关键业务应用程序服务器提供额外的防御层。

Amazon VPC 支持其他网络安全控制，例如网关、代理服务器和网络监控选项。有关更多信息，请参阅《Amazon VPC 用户指南》**中的[控制网络流量](https://docs.aws.amazon.com/vpc/latest/userguide/infrastructure-security.html#control-network-traffic)。

# Amazon EC2 中的恢复功能
<a name="disaster-recovery-resiliency"></a>

AWS 全球基础设施围绕 AWS 区域和可用区构建。区域提供多个在物理上独立且隔离的可用区，这些可用区通过延迟低、吞吐量高且冗余性高的网络连接在一起。利用可用区，您可以设计和操作在可用区之间无中断地自动实现故障转移的应用程序和数据库。与传统的单个或多个数据中心基础设施相比，可用区具有更高的可用性、容错性和可扩展性。

如果需要跨更大的地理距离复制数据或应用程序，请使用 AWSLocal Zones。AWS 本地扩展区是在地理上靠近您的用户的 AWS 区域的扩展。Local Zones 有自己的 Internet 连接并支持。Direct Connect与所有 AWS 区域类似，AWS Local Zones 与其他 AWS区域完全隔离。

如果您需要在 AWS 本地扩展区中复制数据或应用程序，AWS 建议您使用以下区域作为失效转移区域：
+ 另一个本地扩展区
+ 区域中不是父区域的可用区。您可以使用 [describe-availability-zones](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-availability-zones.html) 命令查看父区域。

有关AWS区域和可用区的更多信息，请参阅[AWS全球基础设施](https://aws.amazon.com/about-aws/global-infrastructure/)。

除了 AWS 全球基础设施以外，Amazon EC2 还提供以下功能以支持数据恢复：
+ 跨区域复制 AMI
+ 跨区域复制 EBS 快照
+ 使用 Amazon Data Lifecycle Manager 自动化 EBS 支持的 AMI
+ 使用 Amazon Data Lifecycle Manager 自动处理 EBS 快照
+ 使用 Amazon EC2 Auto Scaling 保持队列的运行状况和可用性
+ 使用 Elastic Load Balancing 在一个或多个可用区中的多个实例之间分配传入流量

# Amazon EC2 的合规性验证
<a name="compliance-validation"></a>

要了解某个 AWS 服务是否在特定合规性计划范围内，请参阅[合规性计划范围内的 AWS 服务](https://aws.amazon.com/compliance/services-in-scope/)，然后选择您感兴趣的合规性计划。有关常规信息，请参阅 [AWS 合规性计划](https://aws.amazon.com/compliance/programs/)、、。

您可以使用 AWS Artifact 下载第三方审计报告。有关更多信息，请参阅[在 AWS Artifact 中下载报告](https://docs.aws.amazon.com/artifact/latest/ug/downloading-documents.html)。

您在使用 AWS 服务 时的合规性责任由您的数据的敏感性、您公司的合规性目标以及适用的法律法规决定。有关您在使用 AWS 服务 时的合规责任的更多信息，请参阅 [AWS 安全性文档](https://docs.aws.amazon.com/security/)。

# 适用于 Amazon EC2 的 Identity and Access Management
<a name="security-iam"></a>

AWS Identity and Access Management（IAM）是一项，AWS 服务可以帮助管理员安全地控制对 AWS 资源的访问。IAM 管理员控制谁可以*通过身份验证*（登录）和*获得授权*（具有权限）来使用 Amazon EC2 资源。IAM 是一项无需额外费用即可使用的。AWS 服务

您的安全凭证使 AWS 中的服务可以识别您，并授予您对 AWS 资源（例如您 Amazon EC2 资源）的使用权限。您可以使用 Amazon EC2 和 IAM 的功能，在不共享您安全凭证情况下允许其他用户、服务和应用程序使用您 Amazon EC2 资源。您可以使用 IAM 控制其他用户对您 AWS 账户 中资源的使用方式，并且您可以使用安全组来控制对您 Amazon EC2 实例的访问。您可以选择允许 Amazon EC2 资源的完全使用或有限使用权限。

如果您是开发人员，则可以使用 IAM 角色来管理在 EC2 实例上运行的应用程序所需的安全凭证。将 IAM 角色附加到实例后，在该实例上运行的应用程序可以从实例元数据服务（IMDS）检索凭证。

有关使用 IAM 保护您 AWS 资源的最佳实践，请参阅《IAM 用户指南》**中的 [IAM 的安全防御最佳实操](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)。

**Topics**
+ [Amazon EC2 基于身份的策略](iam-policies-for-amazon-ec2.md)
+ [用于控制访问 Amazon EC2 API 的示例策略](ExamplePolicies_EC2.md)
+ [用于控制对 Amazon EC2 控制台的访问的示例策略](iam-policies-ec2-console.md)
+ [Amazon EC2 的 AWS 托管式策略](security-iam-awsmanpol.md)
+ [适用于 Amazon EC2 的 IAM 角色](iam-roles-for-amazon-ec2.md)

# Amazon EC2 基于身份的策略
<a name="iam-policies-for-amazon-ec2"></a>

默认情况下，用户没有创建或修改 Amazon EC2 资源或使用 Amazon EC2 API、Amazon EC2 控制台或 CLI 执行任务的权限。要允许用户创建或修改资源和执行任务，您必须创建 IAM 策略以允许用户使用所需的特定资源和 API 操作，然后将这些策略与需要这些权限的用户、组或 IAM 角色关联起来。

在将策略附加到一个用户、一组用户或角色时，它会授权或拒绝用户使用指定资源执行指定任务。有关 IAM 策略的更多一般信息，请参阅《IAM 用户指南**》中的 [IAM 中的策略与权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html)。有关管理和创建 IAM 策略的更多信息，请参阅[管理 IAM 策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage.html)。

IAM 策略必须授予或拒绝使用一个或多个 Amazon EC2 操作的权限。它还必须指定可以用于操作的资源 (可以是所有资源，在某些情况下可以是特定资源)。策略还可以包含应用于资源的条件。

首先，您可以检查 Amazon EC2 的 AWS 托管式策略是否满足您的需求。若不满足，您可以创建自己的自定义策略。有关更多信息，请参阅 [Amazon EC2 的 AWS 托管式策略](security-iam-awsmanpol.md)。

**Topics**
+ [策略语法](#policy-syntax)
+ [Amazon EC2 操作](#UsingWithEC2_Actions)
+ [Amazon EC2 API 操作支持的资源级权限](#ec2-supported-iam-actions-resources)
+ [适用于 Amazon EC2 的 Amazon 资源名称（ARN）](#EC2_ARN_Format)
+ [Amazon EC2 的条件键](#amazon-ec2-keys)
+ [使用基于属性的访问控制访问权限](#control-access-with-tags)
+ [向用户、组和角色授予权限](#granting-iam-permissions)
+ [检查用户是否具有所需权限](#check-required-permissions)

## 策略语法
<a name="policy-syntax"></a>

IAM 策略是包含一个或多个语句的 JSON 文档。每个语句的结构如下。

```
{
  "Statement":[{
    "Effect":"effect",
    "Action":"action",
    "Resource":"arn",
    "Condition":{
      "condition":{
        "key":"value"
        }
      }
    }
  ]
}
```

组成语句的各个元素如下：
+ **Effect：**此 *effect* 可以是 `Allow` 或 `Deny`。默认情况下 用户没有使用资源和 API 操作的权限，因此，所有请求均会被拒绝。显式允许将覆盖默认规则。显式拒绝将覆盖任何允许。
+ **Action**：*action* 是对其授予或拒绝权限的特定 API 操作。要了解有关指定 *action* 的信息，请参阅 [Amazon EC2 操作](#UsingWithEC2_Actions)。
+ **Resource**：受操作影响的资源。有些 Amazon EC2 API 操作允许您在策略中包括该操作可以创建或修改的特定资源。您可使用 Amazon 资源名称（ARN）来指定资源，或使用通配符（\$1）以指明该语句适用于所有资源。有关更多信息，请参阅 [Amazon EC2 API 操作支持的资源级权限](#ec2-supported-iam-actions-resources)。
+ **Condition**：条件是可选的。它们可以用于控制策略生效的时间。想要了解更多有关为 Amazon EC2 指定条件的信息，请参阅 [Amazon EC2 的条件键](#amazon-ec2-keys)。

有关策略要求的更多信息，请参阅《IAM 用户指南》**中的 [IAM JSON 策略元素参考](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies.html)。有关适用于 Amazon EC2 的 IAM 策略语句示例，请参阅 [用于控制访问 Amazon EC2 API 的示例策略](ExamplePolicies_EC2.md)。

## Amazon EC2 操作
<a name="UsingWithEC2_Actions"></a>

在 IAM 策略语句中，您可以从支持 IAM 的任何服务中指定任何 API 操作。对于 Amazon EC2，请使用以下前缀为 API 操作命名：`ec2:`。例如：`ec2:RunInstances` 和 `ec2:CreateImage`。

要在单个语句中指定多项操作，请使用逗号将它们隔开，如下所示：

```
"Action": ["ec2:action1", "ec2:action2"]
```

您也可以使用通配符指定多项操作。例如，您可以指定名称以单词“Describe”开头的所有操作，如下所示：

```
"Action": "ec2:Describe*"
```

**注意**  
当前， Amazon EC2 描述 \$1 API 操作都不支持资源级权限。有关 Amazon EC2 资源级权限更多信息，请参阅 [Amazon EC2 基于身份的策略](#iam-policies-for-amazon-ec2)。

要指定所有 Amazon EC2 API 操作，请使用 \$1 通配符，如下所示：

```
"Action": "ec2:*"
```

有关 Amazon EC2 操作的列表，请参阅 [Amazon EC2 *服务授权参考*中定义的操作](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonec2.html#amazonec2-actions-as-permissions)。

## Amazon EC2 API 操作支持的资源级权限
<a name="ec2-supported-iam-actions-resources"></a>

*资源级权限*指的是能够指定允许用户对哪些资源执行操作的能力。Amazon EC2 部分支持资源级权限。这意味着对于某些 Amazon EC2 操作，您可以控制何时允许用户执行操作 (基于必须满足的条件)或是允许用户使用的特定资源。例如，您可以向用户授予启动实例的权限，但是仅限特定类型的实例，并且只能使用特定的 AMI。

要在 IAM 策略语句中指定资源，请使用其 Amazon 资源名称（ARN）。有关指定 ARN 值的详细信息，请参阅 [适用于 Amazon EC2 的 Amazon 资源名称（ARN）](#EC2_ARN_Format)。如果 API 操作不支持单个 ARN，则必须使用通配符 (\$1) 来指定所有资源都可能受到操作的影响。

要查看标识哪些 Amazon EC2 API 操作支持资源级权限的表，以及您可以在策略中使用的 ARN 和条件键，请参阅 [Amazon EC2 的操作、资源和条件键](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonec2.html)。

请记住，您可以在用于 Amazon EC2 API 操作的 IAM 策略中应用基于标签的资源级权限。这可让您更好地控制用户可创建、修改或使用哪些资源。有关更多信息，请参阅 [在创建过程中授予标记 Amazon EC2 资源的权限](supported-iam-actions-tagging.md)。

## 适用于 Amazon EC2 的 Amazon 资源名称（ARN）
<a name="EC2_ARN_Format"></a>

每个 IAM 策略语句适用于您使用资源的 ARN 指定的资源。

ARN 的一般语法如下：

```
arn:aws:[service]:[region]:[account-id]:resourceType/resourcePath
```

*service*  
服务 (例如，`ec2`)。

*region*  
资源所在区域（例如，`us-east-1`）。

*account-id*  
AWS 账户 ID，不包含连字符（例如，`123456789012`）。

*resourceType*  
资源类型 (例如，`instance`)。

*resourcePath*  
识别资源的路径。您可以在路径中使用 \$1 通配符。

例如，您可以使用特定实例 (`i-1234567890abcdef0`) 的 ARN 在语句中指定它，如下所示。

```
"Resource": "arn:aws:ec2:us-east-1:123456789012:instance/i-1234567890abcdef0"
```

您可以使用 \$1 通配符指定属于特定账户的所有实例，如下所示。

```
"Resource": "arn:aws:ec2:us-east-1:123456789012:instance/*"
```

还可以使用 \$1 通配符指定属于特定账户的所有 Amazon EC2 资源，如下所示。

```
"Resource": "arn:aws:ec2:us-east-1:123456789012:*"
```

要指定所有资源，或者如果特定 API 操作不支持 ARN，请在 `Resource` 元素中使用 \$1 通配符，如下所示。

```
"Resource": "*"
```

许多 Amazon EC2 API 操作涉及多种资源。例如，`AttachVolume` 将一个 Amazon EBS 卷附加到一个实例，从而使用户必须获得相应权限才能使用该卷和该实例。要在单个语句中指定多个资源，请使用逗号分隔其 ARN，如下所示。

```
"Resource": ["arn1", "arn2"]
```

有关 Amazon EC2 资源的 ARN 列表，请参阅 [Amazon EC2 定义的资源类型](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonec2.html#amazonec2-resources-for-iam-policies)。

## Amazon EC2 的条件键
<a name="amazon-ec2-keys"></a>

在策略语句中，您可以选择性指定控制策略生效时间的条件。每个条件都包含一个或多个键值对。条件键不区分大小写。我们已经定义了 AWS 全局条件键以及其他特定于服务的条件键。

有关 Amazon EC2 的服务特定条件键的列表，请参阅 [Amazon EC2 的条件键](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonec2.html#amazonec2-policy-keys)。Amazon EC2 还实施了 AWS 全局条件键。有关更多信息，请参阅 *IAM 用户指南*中的[在所有请求中可用的信息](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_variables.html#policy-vars-infoallreqs)。

所有 Amazon EC2 操作都支持 `aws:RequestedRegion` 和 `ec2:Region` 条件键。有关更多信息，请参阅 [示例：限制对特定区域的访问权限](ExamplePolicies_EC2.md#iam-example-region)。

要在 IAM 策略中使用条件键，请使用 `Condition` 语句。例如，以下策略授予用户添加和删除任何安全组的入站和出站规则的权限。它使用 `ec2:Vpc` 条件键来指定只能对特定 VPC 中的安全组执行这些操作。

------
#### [ JSON ]

****  

```
{
"Version":"2012-10-17",		 	 	 
  "Statement":[{
    "Effect":"Allow",
    "Action": [
       "ec2:AuthorizeSecurityGroupIngress",
       "ec2:AuthorizeSecurityGroupEgress",
       "ec2:RevokeSecurityGroupIngress",
       "ec2:RevokeSecurityGroupEgress"],
     "Resource": "arn:aws:ec2:us-east-1:111122223333:security-group/*",
      "Condition": {
        "StringEquals": {
          "ec2:Vpc": "arn:aws:ec2:us-east-1:111122223333:vpc/vpc-11223344556677889"
        }
      }
    }
  ]
}
```

------

如果您指定了多个条件或在单一条件中指定了多个密钥，我们将通过逻辑 AND 操作对其进行评估。如果您在单一条件中指定了一个具有多个值的密钥，我们将通过逻辑 OR 操作对其进行评估。必须满足所有条件才能授予权限。

在指定条件时，您也可使用占位符。有关更多信息，请参阅 *IAM 用户指南* 中的 [IAM 策略元素：变量和标签](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_variables.html)。

**重要**  
许多条件键是特定于某个资源的，而某些 API 操作会使用多个资源。如果您使用条件键编写策略，请使用语句的 `Resource` 元素指定要应用该条件键的资源。否则，该策略可能会完全阻止用户执行操作，因为针对未应用条件键的资源的条件检查失败。如果您不想指定资源，或者如果您已将策略的 `Action` 元素编写为包含多个 API 操作，则必须使用 `...IfExists` 条件类型以确保对不使用条件键的资源忽略条件键。有关更多信息，请参阅《*IAM 用户指南*》中的 [...IfExists 条件](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements.html#Conditions_IfExists)。

**Topics**
+ [ec2:Attribute 条件键](#attribute-key)
+ [ec2:ResourceID 条件键](#imageId-key)
+ [ec2:SourceInstanceARN 条件键](#SourceInstanceARN)

### ec2:Attribute 条件键
<a name="attribute-key"></a>

`ec2:Attribute` 条件键可用于按资源的属性筛选访问权限的条件。

此条件键仅支持原始数据类型（如字符串或整数）的属性，或者仅包含 **Value** 属性的复杂 **[AttributeValue](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_AttributeValue.html)** 对象（如 [ModifyImageAttribute](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyImageAttribute.html) API 操作的 **Description** 或 **ImdsSupport** 对象）。条件键不能用于包含多个属性的复杂对象，例如 [ModifyImageAttribute](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyImageAttribute.html) 的 **LaunchPermission** 对象。

例如，以下策略使用 `ec2:Attribute/Description` 条件键按 **ModifyImageAttribute** API 操作的复杂 **Description**（描述）对象筛选访问权限。条件键仅允许将图像描述修改为 `Production` 或 `Development` 的请求。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "ec2:ModifyImageAttribute",
      "Resource": "arn:aws:ec2:us-east-1::image/ami-*",
      "Condition": {
        "StringEquals": {
          "ec2:Attribute/Description": [
            "Production",
            "Development"
          ]
        }
      }
    }
  ]
}
```

------

以下示例策略使用 `ec2:Attribute` 条件键按 ** ModifyImageAttribute** API 操作的主要 **Attribute**（属性）属性筛选访问权限。条件键拒绝尝试修改图像描述的所有请求。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Deny",
      "Action": "ec2:ModifyImageAttribute",
      "Resource": "arn:aws:ec2:us-east-1::image/ami-*",
      "Condition": {
        "StringEquals": {
          "ec2:Attribute": "Description"
        }
      }
    }
  ]
}
```

------

### ec2:ResourceID 条件键
<a name="imageId-key"></a>

通过指定的 API 操作使用以下 `ec2:ResourceID` 条件键时，条件键值用于指定 API 操作创建的结果资源。`ec2:ResourceID` 条件键不能用于指定 API 请求中特定的源资源。如果您通过指定 API 使用以下其中一个 `ec2:ResourceID` 条件键，则必须始终指定通配符 (`*`)。如果您指定不同的值，则在运行期间条件始终解析为 `*`。例如，要通过 **CopyImage** API 使用 `ec2:ImageId` 条件键，则必须按如下方式指定条件键：

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "ec2:CopyImage",
      "Resource": "arn:aws:ec2:us-east-1::image/ami-*",
      "Condition": {
        "StringEquals": {
          "ec2:ImageID": "*"
        }
      }
    }
  ]
}
```

------

我们建议您避免将以下条件键与以下 API 操作一起使用：
+ `ec2:DhcpOptionsID` – `CreateDhcpOptions`
+ `ec2:ImageID` – `CopyImage`、`CreateImage`、`ImportImage` 和 `RegisterImage`
+ `ec2:InstanceID` – `RunInstances` 和 `ImportInstance`
+ `ec2:InternetGatewayID` – `CreateInternetGateway`
+ `ec2:NetworkAclID` – `CreateNetworkAcl`
+ `ec2:NetworkInterfaceID` – `CreateNetworkInterface`
+ `ec2:PlacementGroupName` – `CreatePlacementGroup`
+ `ec2:RouteTableID` – `CreateRouteTable`
+ `ec2:SecurityGroupID` – `CreateSecurityGroup`
+ `ec2:SnapshotID` – `CopySnapshot`、`CreateSnapshot`、`CreateSnapshots` 和 `ImportSnapshots`
+ `ec2:SubnetID` – `CreateSubnet`
+ `ec2:VolumeID` – `CreateVolume` 和 `ImportVolume`
+ `ec2:VpcID` – `CreateVpc`
+ `ec2:VpcPeeringConnectionID` – `CreateVpcPeeringConnection`

要根据特定的资源 ID 筛选访问权限，我们建议您使用 `Resource` 策略元素，如下所示。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "ec2:CopyImage",
      "Resource": "arn:aws:ec2:us-east-1::image/ami-01234567890abcdef"
    }
  ]
}
```

------

### ec2:SourceInstanceARN 条件键
<a name="SourceInstanceARN"></a>

使用 `ec2:SourceInstanceARN` 指定从中发出请求的实例的 ARN。这是一个 [AWS 全局条件密钥](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html)，这意味着您可以将其用于 Amazon EC2 以外的服务。有关策略示例，请参阅[示例：允许特定实例查看其他 AWS 服务中的资源](ExamplePolicies_EC2.md#iam-example-source-instance)。

## 使用基于属性的访问控制访问权限
<a name="control-access-with-tags"></a>

在创建向用户授予使用 EC2 资源的权限的 IAM 策略时，可以在该策略的 `Condition` 元素中包含标签信息，以根据标签控制访问权限。这称为基于属性的访问权限控制（ABAC）。ABAC 可以让您更好地控制用户可以修改、使用或删除哪些资源。有关更多信息，请参阅[什么是适用于 AWS 的 ABAC？](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction_attribute-based-access-control.html)

例如，您可以创建一个策略，允许用户终止实例，但在实例具有 `environment=production` 标签时拒绝此操作。为此，您可以使用 `aws:ResourceTag` 条件键来基于附加到资源的标签允许或拒绝对资源的访问。

```
"StringEquals": { "aws:ResourceTag/environment": "production" }
```

要了解 Amazon EC2 API 操作是否支持使用 `aws:ResourceTag` 条件键控制访问，请参阅 [Amazon EC2 的操作、资源和条件建](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonec2.html)。请注意，`Describe` 操作不支持资源级权限，因此，您必须在不带条件的单独语句中指定它们。

有关示例 IAM policies，请参阅 [用于控制访问 Amazon EC2 API 的示例策略](ExamplePolicies_EC2.md)。

如果您基于标签允许或拒绝用户访问资源，则必须考虑显式拒绝用户对相同资源添加或删除这些标签的能力。否则，用户可能通过修改资源标签来绕过您的限制并获得资源访问权限。

## 向用户、组和角色授予权限
<a name="granting-iam-permissions"></a>

要提供访问权限，请为您的用户、组或角色添加权限：
+ AWS IAM Identity Center 中的用户和群组：

  创建权限集合。按照《AWS IAM Identity Center 用户指南》**中[创建权限集](https://docs.aws.amazon.com//singlesignon/latest/userguide/howtocreatepermissionset.html)的说明进行操作。
+ 通过身份提供者在 IAM 中托管的用户：

  创建适用于身份联合验证的角色。按照《IAM 用户指南》**中[针对第三方身份提供者创建角色（联合身份验证）](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_roles_create_for-idp.html)的说明进行操作。
+ IAM 用户：
  + 创建您的用户可以担任的角色。按照《IAM 用户指南》**中[为 IAM 用户创建角色](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_roles_create_for-user.html)的说明进行操作。
  + （不推荐使用）将策略直接附加到用户或将用户添加到用户组。按照《IAM 用户指南》**中[向用户添加权限（控制台）](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_users_change-permissions.html#users_change_permissions-add-console)中的说明进行操作。

## 检查用户是否具有所需权限
<a name="check-required-permissions"></a>

在您创建 IAM 策略后，建议您检查它是否允许用户使用策略生效前所需的特定 API 操作和资源。

首先，创建一个用于测试目的的用户，然后将您创建的 IAM 策略与该测试用户关联起来。然后，以测试用户身份提出请求。

如果您测试的 Amazon EC2 操作创建或修改了一种资源，您在提交请求时应该使用 `DryRun` 参数（或运行带有 `--dry-run` 选项的 AWS CLI 命令）。在这种情况下，调用会完成身份验证检查，但是不会完成该操作。例如，您可以检查用户能否终止特定实例，但不会真的终止它。如果测试用户具有所需的权限，请求会返回 `DryRunOperation`；否则，它会返回 `UnauthorizedOperation`。

如果策略未授予用户您所期望的权限，您可以根据需要调节策略并重新测试，直到您获得预期的结果。

**重要**  
在其生效之前，它需要几分钟时间将策略更改为适合状态。因此，我们建议您在测试策略更新前，等候五分钟的时间。

如果身份验证检查失败，该请求将返回一个带有诊断信息的代码消息。您可以使用 `DecodeAuthorizationMessage` 操作对消息进行解码。有关更多信息，请参阅《AWS Security Token Service API Reference》**中的 [DecodeAuthorizationMessage](https://docs.aws.amazon.com/STS/latest/APIReference/API_DecodeAuthorizationMessage.html)，以及 [decode-authorization-message](https://docs.aws.amazon.com/cli/latest/reference/sts/decode-authorization-message.html)。

# 用于控制访问 Amazon EC2 API 的示例策略
<a name="ExamplePolicies_EC2"></a>

您可以使用 IAM 策略向用户授予使用 Amazon EC2 所需的权限。有关分步说明，请参阅《IAM 用户指南》**中的[创建 IAM 策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html)。

以下示例显示了您可用于向用户授予使用 Amazon EC2 的权限的策略语句。这些策略设计用于采用 AWS CLI 或 AWS SDK 发出的请求。在以下示例中，将每个 *user input placeholder* 替换为您自己的信息。

**Topics**
+ [只读访问权限](#iam-example-read-only)
+ [限制对特定区域的访问](#iam-example-region)
+ [使用实例](#iam-example-instances)
+ [启动实例 (RunInstances)](#iam-example-runinstances)
+ [使用竞价型实例](#iam-example-spot-instances)
+ [使用预留实例](#iam-example-reservedinstances)
+ [标记资源](#iam-example-taggingresources)
+ [使用 IAM 角色](#iam-example-iam-roles)
+ [使用路由表](#iam-example-route-tables)
+ [允许特定实例查看其他 AWS 服务中的资源](#iam-example-source-instance)
+ [使用启动模板](#iam-example-launch-templates)
+ [使用实例元数据](#iam-example-instance-metadata)
+ [使用 Amazon EBS 卷和快照](#iam-example-ebs)

有关用于 Amazon EC2 控制台的策略示例，请参阅 [用于控制对 Amazon EC2 控制台的访问的示例策略](iam-policies-ec2-console.md)。

## 示例：只读访问权限
<a name="iam-example-read-only"></a>

以下策略为用户授予使用名称以 `Describe` 开头的所有 Amazon EC2 API 操作的权限。`Resource` 元素使用通配符表示用户可以通过这些 API 操作指定所有资源。在 API 操作不支持资源级权限的情况下，也需要 \$1 通配符。有关哪些 ARN 可用于哪些 Amazon EC2 API 操作的更多信息，请参阅 [Amazon EC2 的操作、资源和条件键](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonec2.html)。

用户无权对资源执行任何操作 (除非其他语句为用户授予执行此操作的权限)，因为在默认情况下会对用户拒绝使用 API 操作的权限。

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement": [
    {
      "Effect": "Allow",
      "Action": "ec2:Describe*",
      "Resource": "*"
    }
   ]
}
```

------

## 示例：限制对特定区域的访问权限
<a name="iam-example-region"></a>

以下策略拒绝用户使用所有 Amazon EC2 API 操作的权限，除非区域为欧洲地区（法兰克福）。该区域使用全局条件键 `aws:RequestedRegion`，所有 Amazon EC2 API 操作均支持此条件键。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
       {
      "Effect": "Deny",
      "Action": "ec2:*",
      "Resource": "*",
      "Condition": {
        "StringNotEquals": {
          "aws:RequestedRegion": "eu-central-1"
        }
      }
    }  
  ]
}
```

------

或者，您也可以使用条件键 `ec2:Region`，此条件键是 Amazon EC2 特定的，所有 Amazon EC2 API 操作均支持它。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
       {
      "Effect": "Deny",
      "Action": "ec2:*",
      "Resource": "*",
      "Condition": {
        "StringNotEquals": {
          "ec2:Region": "eu-central-1"
        }
      }
    }  
  ]
}
```

------

## 使用实例
<a name="iam-example-instances"></a>

**Topics**
+ [示例：描述、启动、停止和终止所有实例](#iam-example-instances-all)
+ [示例：描述所有实例，以及仅停止、启动和终止特定实例](#iam-example-instances-specific)

### 示例：描述、启动、停止和终止所有实例
<a name="iam-example-instances-all"></a>

以下策略为用户授予使用 `Action` 元素中指定的 API 操作的权限。`Resource` 元素使用 \$1 通配符表示用户可以通过这些 API 操作指定所有资源。在 API 操作不支持资源级权限的情况下，也需要 \$1 通配符。有关哪些 ARN 可用于哪些 Amazon EC2 API 操作的更多信息，请参阅 [Amazon EC2 的操作、资源和条件键](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonec2.html)。

用户无权使用任何其他 API 操作 (除非其他语句允许用户执行此操作)，因为用户在默认情况下没有使用 API 操作的权限。

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ec2:DescribeInstances", 
        "ec2:DescribeImages",
        "ec2:DescribeKeyPairs", 
        "ec2:DescribeSecurityGroups",
        "ec2:DescribeAvailabilityZones",
        "ec2:RunInstances", 
        "ec2:TerminateInstances",
        "ec2:StopInstances", 
        "ec2:StartInstances"
      ],
      "Resource": "*"
    }
   ]
}
```

------

### 示例：描述所有实例，以及仅停止、启动和终止特定实例
<a name="iam-example-instances-specific"></a>

以下策略允许用户描述所有实例，但只能启动和停止实例 i-1234567890abcdef0 和 i-0598c7d356eba48d7，且只能终止在 `us-east-1` 区域中具有“`purpose=test`”资源标签的实例。

第一条语句为 `Resource` 元素使用 \$1 通配符以指示用户可以在操作中指定所有资源；在本例中，用户可以列出所有实例。在 API 操作不支持资源级权限的情况下 (在此情况下，为 `ec2:DescribeInstances`)，也需要 \$1 通配符。有关哪些 ARN 可用于哪些 Amazon EC2 API 操作的更多信息，请参阅 [Amazon EC2 的操作、资源和条件键](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonec2.html)。

第二条语句为 `StopInstances` 和 `StartInstances` 操作使用资源级权限。特定实例在 `Resource` 元素中通过其 ARN 进行指示。

第三条语句允许用户终止在 `us-east-1` 区域中属于指定 AWS 账户的所有实例（但仅在实例具有 `"purpose=test"` 标签的情况下）。当策略语句生效时，`Condition` 元素具备资格。

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement": [
   {
   "Effect": "Allow",
      "Action": "ec2:DescribeInstances",
      "Resource": "*"
   },
   {
      "Effect": "Allow",
      "Action": [
        "ec2:StopInstances", 
        "ec2:StartInstances"
      ],
      "Resource": [
        "arn:aws:ec2:us-east-1:111122223333:instance/i-1234567890abcdef0",
        "arn:aws:ec2:us-east-1:111122223333:instance/i-0598c7d356eba48d7"
      ]
    },
    {
      "Effect": "Allow",
      "Action": "ec2:TerminateInstances",
      "Resource": "arn:aws:ec2:us-east-1:111122223333:instance/*",
      "Condition": {
         "StringEquals": {
            "aws:ResourceTag/purpose": "test"
         }
      }
   }

   ]
}
```

------

## 启动实例 (RunInstances)
<a name="iam-example-runinstances"></a>

[RunInstances](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RunInstances.html) API 操作可启动一个或多个按需实例或一个或多个 Spot 实例。`RunInstances` 需要 AMI 并创建实例。用户可以在请求中指定键对和安全组。启动到 VPC 中需要子网，会创建网络接口。从 Amazon EBS-backed AMI 启动将创建卷。因此，用户必须具有使用这些 Amazon EC2 资源的权限。您可以创建要求用户对 `RunInstances` 指定可选参数或限制用户针对某个参数使用特定值的策略语句。

有关启动实例所需的资源级权限的更多信息，请参阅 [Amazon EC2 的操作、资源和条件键](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonec2.html)。

默认情况下，用户没有描述、启动、停止或终止生成的实例的权限。授予用户管理所生成实例的权限的一种方法是：为每个实例创建一个特定标签，然后创建一个允许用户使用该标签管理实例的语句。有关更多信息，请参阅 [使用实例](#iam-example-instances)。

**Topics**
+ [AMI](#iam-example-runinstances-ami)
+ [实例类型](#iam-example-runinstances-instance-type)
+ [子网](#iam-example-runinstances-subnet)
+ [EBS 卷](#iam-example-runinstances-volumes)
+ [标签](#iam-example-runinstances-tags)
+ [启动模板中的标签](#iam-example-tags-launch-template)
+ [Elastic GPUs](#iam-example-runinstances-egpu)
+ [启动模板](#iam-example-runinstances-launch-templates)

### AMI
<a name="iam-example-runinstances-ami"></a>

以下策略仅允许用户使用指定的 AMI、`ami-9e1670f7` 和 `ami-45cf5c3c` 启动实例。用户无法使用其他 AMI 启动实例（除非其他语句允许用户执行此操作）。

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement": [
   {
      "Effect": "Allow",
      "Action": "ec2:RunInstances",
      "Resource": [
        "arn:aws:ec2:us-east-1::image/ami-9e1670f7",
        "arn:aws:ec2:us-east-1::image/ami-45cf5c3c",
        "arn:aws:ec2:us-east-1:111122223333:instance/*",
        "arn:aws:ec2:us-east-1:111122223333:volume/*",
        "arn:aws:ec2:us-east-1:111122223333:key-pair/*",
        "arn:aws:ec2:us-east-1:111122223333:security-group/*",
        "arn:aws:ec2:us-east-1:111122223333:subnet/*",
        "arn:aws:ec2:us-east-1:111122223333:network-interface/*"
      ]
    }
   ]
}
```

------

另外，以下策略允许用户从 Amazon 或某些受信任和经过验证的合作伙伴拥有的所有 AMI 启动实例。第一个语句的 `Condition` 元素测试 `ec2:Owner` 是不是 `amazon`。用户无法使用其他 AMI 启动实例（除非其他语句允许用户执行此操作）。

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement": [
         {
      "Effect": "Allow",
      "Action": "ec2:RunInstances",
      "Resource": [ 
         "arn:aws:ec2:us-east-1::image/ami-*"
      ],
      "Condition": {
         "StringEquals": {
            "ec2:Owner": "amazon"
         }
      }
   },
   {
      "Effect": "Allow",
      "Action": "ec2:RunInstances",
      "Resource": [ 
         "arn:aws:ec2:us-east-1:111122223333:instance/*",
         "arn:aws:ec2:us-east-1:111122223333:subnet/*",
         "arn:aws:ec2:us-east-1:111122223333:volume/*",
         "arn:aws:ec2:us-east-1:111122223333:network-interface/*",
         "arn:aws:ec2:us-east-1:111122223333:key-pair/*",
         "arn:aws:ec2:us-east-1:111122223333:security-group/*"
         ]
      }
   ]
}
```

------

### 实例类型
<a name="iam-example-runinstances-instance-type"></a>

以下策略仅允许用户使用 `t2.micro` 或 `t2.small` 实例类型启动实例，您也可以通过此操作控制成本。用户无法启动更大的实例，因为第一条语句的 `Condition` 元素会测试 `ec2:InstanceType` 是否是 `t2.micro` 或 `t2.small`。

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement": [
        {
      "Effect": "Allow",
      "Action": "ec2:RunInstances",
      "Resource": [
         "arn:aws:ec2:us-east-1:111122223333:instance/*"
      ],
      "Condition": {
         "StringEquals": {
            "ec2:InstanceType": ["t2.micro", "t2.small"]
         }
      }
   },
   {
      "Effect": "Allow",
      "Action": "ec2:RunInstances",
      "Resource": [
         "arn:aws:ec2:us-east-1::image/ami-*",
         "arn:aws:ec2:us-east-1:111122223333:subnet/*",
         "arn:aws:ec2:us-east-1:111122223333:network-interface/*",
         "arn:aws:ec2:us-east-1:111122223333:volume/*",
         "arn:aws:ec2:us-east-1:111122223333:key-pair/*",
         "arn:aws:ec2:us-east-1:111122223333:security-group/*"
         ]
      }
   ]
}
```

------

或者，您也可以创建一个策略，以拒绝用户启动 `t2.micro` 和 `t2.small` 实例类型之外的任何实例的权限。

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement": [
        { 
      "Effect": "Deny",
      "Action": "ec2:RunInstances",
      "Resource": [
         "arn:aws:ec2:us-east-1:111122223333:instance/*"
      ],
      "Condition": {
         "StringNotEquals": {
            "ec2:InstanceType": ["t2.micro", "t2.small"]
         }
      }
   },
   {
      "Effect": "Allow",
      "Action": "ec2:RunInstances",
      "Resource": [
         "arn:aws:ec2:us-east-1::image/ami-*",
         "arn:aws:ec2:us-east-1:111122223333:network-interface/*",
         "arn:aws:ec2:us-east-1:111122223333:instance/*",
         "arn:aws:ec2:us-east-1:111122223333:subnet/*",
         "arn:aws:ec2:us-east-1:111122223333:volume/*",
         "arn:aws:ec2:us-east-1:111122223333:key-pair/*",
         "arn:aws:ec2:us-east-1:111122223333:security-group/*"
         ]
      }
   ]
}
```

------

### 子网
<a name="iam-example-runinstances-subnet"></a>

以下策略仅允许用户使用指定子网 `subnet-12345678` 启动实例。组无法将实例启动到任何其他子网中 (除非其他语句授予执行此操作的用户权限)。

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement": [
    {
      "Effect": "Allow",
      "Action": "ec2:RunInstances",
      "Resource": [
        "arn:aws:ec2:us-east-1:111122223333:subnet/subnet-12345678",
        "arn:aws:ec2:us-east-1:111122223333:network-interface/*",
        "arn:aws:ec2:us-east-1:111122223333:instance/*",
        "arn:aws:ec2:us-east-1:111122223333:volume/*",
        "arn:aws:ec2:us-east-1::image/ami-*",
        "arn:aws:ec2:us-east-1:111122223333:key-pair/*",
        "arn:aws:ec2:us-east-1:111122223333:security-group/*"
      ]
    }
   ]
}
```

------

或者，您也可以创建一个策略，以拒绝用户将实例启动到任何其他子网的权限。该语句通过拒绝创建网络接口的权限来执行此操作，除非指定了子网 `subnet-12345678`。此拒绝会覆盖创建的任何其他策略以允许将实例启动到其他子网中。

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement": [
         {
      "Effect": "Deny",
      "Action": "ec2:RunInstances",
      "Resource": [
         "arn:aws:ec2:us-east-1:111122223333:network-interface/*"
      ],
      "Condition": {
         "ArnNotEquals": {
            "ec2:Subnet": "arn:aws:ec2:us-east-1:111122223333:subnet/subnet-12345678"
         }
      }
   },
   {
      "Effect": "Allow",
      "Action": "ec2:RunInstances",
      "Resource": [
         "arn:aws:ec2:us-east-1::image/ami-*",
         "arn:aws:ec2:us-east-1:111122223333:network-interface/*",
         "arn:aws:ec2:us-east-1:111122223333:instance/*",
         "arn:aws:ec2:us-east-1:111122223333:subnet/*",
         "arn:aws:ec2:us-east-1:111122223333:volume/*",
         "arn:aws:ec2:us-east-1:111122223333:key-pair/*",
         "arn:aws:ec2:us-east-1:111122223333:security-group/*"
         ]
      }
   ]
}
```

------

### EBS 卷
<a name="iam-example-runinstances-volumes"></a>

仅当实例的 EBS 卷为加密卷时，下面的策略才允许用户启动实例。用户必须从使用加密快照创建的 AMI 启动实例，以确保根卷是加密的。此外，用户在启动期间附加到此实例的任何其他卷也必须是加密的。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
                {
            "Effect": "Allow",
            "Action": "ec2:RunInstances",
            "Resource": [
                "arn:aws:ec2:*:*:volume/*"
            ],
            "Condition": {
                "Bool": {
                    "ec2:Encrypted": "true"
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": "ec2:RunInstances",
            "Resource": [
                "arn:aws:ec2:*::image/ami-*",
                "arn:aws:ec2:*:*:network-interface/*",
                "arn:aws:ec2:*:*:instance/*",
                "arn:aws:ec2:*:*:subnet/*",
                "arn:aws:ec2:*:*:key-pair/*",
                "arn:aws:ec2:*:*:security-group/*"
            ]
        }
    ]
}
```

------

### 标签
<a name="iam-example-runinstances-tags"></a>

**在创建时标记实例**

下面的策略允许用户启动实例并在创建期间标记实例。对于应用标签的资源创建操作，用户必须具有使用 `CreateTags` 操作的权限。第二个语句使用 `ec2:CreateAction` 条件键使用户只能在 `RunInstances` 上下文中且只能为实例创建标签。用户无法标记现有资源，并且用户无法使用 `RunInstances` 请求标记卷。

有关更多信息，请参阅 [在创建过程中授予标记 Amazon EC2 资源的权限](supported-iam-actions-tagging.md)。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	  
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
         "ec2:RunInstances"
      ],
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": [
         "ec2:CreateTags"
      ],
      "Resource": "arn:aws:ec2:us-east-1:111122223333:instance/*",
      "Condition": {
         "StringEquals": {
             "ec2:CreateAction" : "RunInstances"
          }
       }
    }
  ]
}
```

------

**在创建时使用特定标签标记实例和卷**

下面的策略包含 `aws:RequestTag` 条件键，该条件键要求用户标记使用标签 `RunInstances` 和 `environment=production` 通过 `purpose=webserver` 创建的任何卷。如果用户不传递这些特定标签，或者根本不指定任何标签，则请求失败。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	  
  "Statement": [
   {
      "Effect": "Allow",
      "Action": [
         "ec2:RunInstances"
      ],
      "Resource": [
         "arn:aws:ec2:us-east-1::image/*",
         "arn:aws:ec2:us-east-1:111122223333:subnet/*",
         "arn:aws:ec2:us-east-1:111122223333:network-interface/*",
         "arn:aws:ec2:us-east-1:111122223333:security-group/*",
         "arn:aws:ec2:us-east-1:111122223333:key-pair/*"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
         "ec2:RunInstances"
      ],
      "Resource": [
          "arn:aws:ec2:us-east-1:111122223333:volume/*",
          "arn:aws:ec2:us-east-1:111122223333:instance/*"
      ],
      "Condition": {
         "StringEquals": {
             "aws:RequestTag/environment": "production" ,
             "aws:RequestTag/purpose": "webserver"
          }
       }
    },
    {
      "Effect": "Allow",
      "Action": [
         "ec2:CreateTags"
      ],
      "Resource": "arn:aws:ec2:us-east-1:111122223333:*/*",
      "Condition": {
         "StringEquals": {
             "ec2:CreateAction" : "RunInstances"
          }
       }
    }
  ]
}
```

------

**在创建时使用至少一个特定标记标记实例和卷**

下面的策略对 `ForAnyValue` 条件使用了 `aws:TagKeys` 修饰符，以指示必须在请求中指定至少一个标签，并且其必须包含键 `environment` 或 `webserver`。标签必须应用于实例及卷。可以在请求中指定任何标签值。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	  
  "Statement": [
   {
      "Effect": "Allow",
      "Action": [
         "ec2:RunInstances"
      ],
      "Resource": [
         "arn:aws:ec2:us-east-1::image/*",
         "arn:aws:ec2:us-east-1:111122223333:subnet/*",
         "arn:aws:ec2:us-east-1:111122223333:network-interface/*",
         "arn:aws:ec2:us-east-1:111122223333:security-group/*",
         "arn:aws:ec2:us-east-1:111122223333:key-pair/*"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
          "ec2:RunInstances"
      ],
      "Resource": [
          "arn:aws:ec2:us-east-1:111122223333:volume/*",
          "arn:aws:ec2:us-east-1:111122223333:instance/*"
      ],
      "Condition": {
          "ForAnyValue:StringEquals": {
              "aws:TagKeys": ["environment","webserver"]
          }
       }
    },
    {
      "Effect": "Allow",
      "Action": [
          "ec2:CreateTags"
      ],
      "Resource": "arn:aws:ec2:us-east-1:111122223333:*/*",
      "Condition": {
          "StringEquals": {
              "ec2:CreateAction" : "RunInstances"
          }
       }
    }
  ]
}
```

------

**如果在创建时标记实例，则必须使用特定标签标记它们**

在下面的策略中，用户不必在请求中指定标签，但如果用户指定标签，则标签必须为 `purpose=test`。不允许使用任何其他标签。用户可以在 `RunInstances` 请求中向任何可标记资源应用标签。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	  
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
         "ec2:RunInstances"
      ],
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": [
         "ec2:CreateTags"
      ],
      "Resource": "arn:aws:ec2:us-east-1:111122223333:*/*",
      "Condition": {
         "StringEquals": {
             "aws:RequestTag/purpose": "test",
             "ec2:CreateAction" : "RunInstances"
          },
          "ForAllValues:StringEquals": {
              "aws:TagKeys": "purpose"
          }
       }
    }
  ]
}
```

------

禁止任何人在创建时为 RunInstances 调用标签



------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowRun",
            "Effect": "Allow",
            "Action": [
                "ec2:RunInstances"
            ],
            "Resource": [
                "arn:aws:ec2:us-east-1::image/*",
                "arn:aws:ec2:us-east-1:*:subnet/*",
                "arn:aws:ec2:us-east-1:*:network-interface/*",
                "arn:aws:ec2:us-east-1:*:security-group/*",
                "arn:aws:ec2:us-east-1:*:key-pair/*",
                "arn:aws:ec2:us-east-1:*:volume/*",
                "arn:aws:ec2:us-east-1:*:instance/*",
                "arn:aws:ec2:us-east-1:*:spot-instances-request/*"
            ]
        },
        {
            "Effect": "Deny",
            "Action": "ec2:CreateTags",
            "Resource": "*"
        }
    ]
}
```

------

仅允许为 spot-instances-request 使用特定标签。第二个意外的不一致之处在这里发挥了作用。在正常情况下，不指定标签将导致 Unauthenticated 错误。对于 spot-instances-request，如果没有 spot-instances-request 标签，则不会评估此策略，因此无标签的 Spot on Run 请求将成功。

### 启动模板中的标签
<a name="iam-example-tags-launch-template"></a>

在以下示例中，用户可以启动实例，但前提是他们使用特定的启动模板 (`lt-09477bcd97b0d310e`)。`ec2:IsLaunchTemplateResource` 条件键禁止用户覆盖在启动模板中指定的任何资源。语句的第二部分允许用户在创建时标记实例 — 如果在启动模板中为实例指定了标签，则该语句部分是必需的。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	  
  "Statement": [
   {
      "Effect": "Allow",
      "Action": "ec2:RunInstances",
      "Resource": "*",
      "Condition": {
         "ArnLike": {
             "ec2:LaunchTemplate": "arn:aws:ec2:us-east-1:111122223333:launch-template/lt-09477bcd97b0d310e" 
          },
          "Bool": {
             "ec2:IsLaunchTemplateResource": "true"
          }
       }
    },
    {
      "Effect": "Allow",
      "Action": [
         "ec2:CreateTags"
      ],
      "Resource": "arn:aws:ec2:us-east-1:111122223333:instance/*",
      "Condition": {
         "StringEquals": {
             "ec2:CreateAction" : "RunInstances"
          }
       }
    }
  ]
}
```

------

### Elastic GPUs
<a name="iam-example-runinstances-egpu"></a>

在以下策略中，用户可以启动实例并指定要附加到实例的 Elastic GPU。用户可以在任何区域中启动实例，但他们只能在 `us-east-2` 区域中启动期间附加 Elastic GPU。

`ec2:ElasticGpuType` 条件键确保实例使用 `eg1.medium` 或 `eg1.large` 弹性 GPU 类型。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
             {
            "Effect": "Allow",
            "Action": [
                "ec2:RunInstances"
            ],
            "Resource": [
                "arn:aws:ec2:*:111122223333:elastic-gpu/*"
            ],
            "Condition": {
                "StringEquals": {
                    "ec2:Region": "us-east-2",
                    "ec2:ElasticGpuType": [
                        "eg1.medium",
                        "eg1.large"
                    ]
                }  
            }
        },
        {
            "Effect": "Allow",
            "Action": "ec2:RunInstances",
            "Resource": [
                "arn:aws:ec2:*::image/ami-*",
                "arn:aws:ec2:*:111122223333:network-interface/*",
                "arn:aws:ec2:*:111122223333:instance/*",
                "arn:aws:ec2:*:111122223333:subnet/*",
                "arn:aws:ec2:*:111122223333:volume/*",
                "arn:aws:ec2:*:111122223333:key-pair/*",
                "arn:aws:ec2:*:111122223333:security-group/*"
            ]
        }
    ]
}
```

------

### 启动模板
<a name="iam-example-runinstances-launch-templates"></a>

在以下示例中，用户可以启动实例，但前提是他们使用特定的启动模板 (`lt-09477bcd97b0d310e`)。用户可以在 `RunInstances` 操作中指定参数以覆盖启动模板中的任何参数。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	  
  "Statement": [
         {
      "Effect": "Allow",
      "Action": "ec2:RunInstances",
      "Resource": "*",
      "Condition": {
         "ArnLike": {
             "ec2:LaunchTemplate": "arn:aws:ec2:us-east-1:111122223333:launch-template/lt-09477bcd97b0d310e" 
          }
       }
    }
  ]
}
```

------

在该示例中，只有在用户使用启动模板时，他们才能启动实例。该策略使用 `ec2:IsLaunchTemplateResource` 条件键防止用户覆盖启动模板中任何预先存在的 ARN。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	  
  "Statement": [
         {
      "Effect": "Allow",
      "Action": "ec2:RunInstances",
      "Resource": "*",
      "Condition": {
         "ArnLike": {
             "ec2:LaunchTemplate": "arn:aws:ec2:us-east-1:111122223333:launch-template/*" 
          },
          "Bool": {
             "ec2:IsLaunchTemplateResource": "true"
          }
       }
    }
  ]
}
```

------

以下示例策略允许用户启动实例，但前提是他们使用启动模板。用户无法覆盖请求中的子网和网络接口参数；只能在启动模板中指定这些参数。语句的第一部分使用 [NotResource](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_notresource.html) 元素允许子网和网络接口以外的所有其他资源。语句的第二部分允许子网和网络接口资源，但前提是它们来自于启动模板。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	  
  "Statement": [
        {
      "Effect": "Allow",
      "Action": "ec2:RunInstances",
      "NotResource": ["arn:aws:ec2:us-east-1:111122223333:subnet/*",
                      "arn:aws:ec2:us-east-1:111122223333:network-interface/*" ],
      "Condition": {
         "ArnLike": {
             "ec2:LaunchTemplate": "arn:aws:ec2:us-east-1:111122223333:launch-template/*" 
          }
       }
    },
   {
      "Effect": "Allow",
      "Action": "ec2:RunInstances",
      "Resource": ["arn:aws:ec2:us-east-1:111122223333:subnet/*",
                   "arn:aws:ec2:us-east-1:111122223333:network-interface/*" ],
      "Condition": {
         "ArnLike": {
             "ec2:LaunchTemplate": "arn:aws:ec2:us-east-1:111122223333:launch-template/*" 
          },
          "Bool": {
             "ec2:IsLaunchTemplateResource": "true"
          }
       }
    }
  ]
}
```

------

以下示例允许用户启动实例，但前提是他们使用启动模板，并且启动模板具有标签 `Purpose=Webservers`。用户无法覆盖 `RunInstances` 操作中的任何启动模板参数。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	  
  "Statement": [
        {
      "Effect": "Allow",
      "Action": "ec2:RunInstances",
      "NotResource": "arn:aws:ec2:us-east-1:111122223333:launch-template/*",
      "Condition": {
         "ArnLike": {
             "ec2:LaunchTemplate": "arn:aws:ec2:us-east-1:111122223333:launch-template/*" 
          },
         "Bool": {
             "ec2:IsLaunchTemplateResource": "true"
          }
       }
    },
    {
      "Effect": "Allow",
      "Action": "ec2:RunInstances",
      "Resource": "arn:aws:ec2:us-east-1:111122223333:launch-template/*",
      "Condition": {
       "StringEquals": {
           "aws:ResourceTag/Purpose": "Webservers" 
        }
       }
     }
  ]
}
```

------

## 使用竞价型实例
<a name="iam-example-spot-instances"></a>

您可以使用 RunInstances 操作创建竞价型实例请求，并在创建时标记竞价型实例请求。要为 RunInstances 指定的资源为 `spot-instances-request`。

在 IAM 策略中评估 `spot-instances-request` 资源，如下所示：
+ 如果您在创建时未标记竞价型实例请求，则 Amazon EC2 不会在 RunInstances 语句中评估 `spot-instances-request` 资源。
+ 如果您在创建时标记竞价型实例请求，则 Amazon EC2 会在 RunInstances 语句中评估 `spot-instances-request` 资源。

因此，对于 `spot-instances-request` 资源，以下规则适用于 IAM 策略：
+ 如果您使用 RunInstances 创建竞价型实例请求，并且您不打算在创建时标记竞价型实例请求，则无需明确允许 `spot-instances-request` 资源；调用将成功。
+ 如果您使用 RunInstances 创建竞价型实例请求并打算在创建时标记竞价型实例请求，则必须在 RunInstances 允许语句中包含 `spot-instances-request` 资源，否则调用将失败。
+ 如果您使用 RunInstances 创建竞价型实例请求并打算在创建时标记竞价型实例请求，则必须在 CreateTags 允许语句中指定 `spot-instances-request` 资源或 `*` 通配符，否则调用将失败。

您可以使用 RunInstances 或 RequestSpotInstances 请求竞价型实例。以下示例 IAM 策略仅在使用 RunInstances 请求竞价型实例时适用。

**示例：使用 RunInstances 请求竞价型实例**

以下策略允许用户使用 RunInstances 操作请求竞价型实例。由 RunInstances 创建的 `spot-instances-request` 资源将请求 Spot 实例。

**注意**  
要使用 RunInstances 创建竞价型实例请求，您可以从 `spot-instances-request` 列表中省略 `Resource`（如果您不打算在创建时标记竞价型实例请求）。这是因为，如果在创建时未标记竞价型实例请求，则 Amazon EC2 不会在 RunInstances 语句中评估 `spot-instances-request` 资源。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowRun",
            "Effect": "Allow",
            "Action": [
                "ec2:RunInstances"
            ],
            "Resource": [
                "arn:aws:ec2:us-east-1::image/*",
                "arn:aws:ec2:us-east-1:*:subnet/*",
                "arn:aws:ec2:us-east-1:*:network-interface/*",
                "arn:aws:ec2:us-east-1:*:security-group/*",
                "arn:aws:ec2:us-east-1:*:key-pair/*",
                "arn:aws:ec2:us-east-1:*:volume/*",
                "arn:aws:ec2:us-east-1:*:instance/*",
                "arn:aws:ec2:us-east-1:*:spot-instances-request/*"
            ]
        }
    ]
}
```

------

**警告**  
**不支持 – 示例：拒绝用户使用 RunInstances 请求竞价型实例的权限**  
`spot-instances-request` 资源不支持以下策略。  
以下策略旨在向用户授予启动按需型实例的权限，但拒绝用户请求竞价型实例的权限。由 RunInstances 创建的 `spot-instances-request` 资源是请求 Spot 实例的资源。第二个语句旨在拒绝针对 `spot-instances-request` 资源的 RunInstances 操作。但不支持此条件，这是因为，如果在创建时未标记竞价型实例请求，则 Amazon EC2 不会在 RunInstances 语句中评估 `spot-instances-request` 资源。  

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowRun",
            "Effect": "Allow",
            "Action": [
                "ec2:RunInstances"
            ],
            "Resource": [
                "arn:aws:ec2:us-east-1::image/*",
                "arn:aws:ec2:us-east-1:*:subnet/*",
                "arn:aws:ec2:us-east-1:*:network-interface/*",
                "arn:aws:ec2:us-east-1:*:security-group/*",
                "arn:aws:ec2:us-east-1:*:key-pair/*",
                "arn:aws:ec2:us-east-1:*:volume/*",
                "arn:aws:ec2:us-east-1:*:instance/*"
            ]
        },
        {
            "Sid": "DenySpotInstancesRequestsNOTSUPPORTEDDONOTUSE",
            "Effect": "Deny",
            "Action": "ec2:RunInstances",
            "Resource": "arn:aws:ec2:us-east-1:*:spot-instances-request/*"
        }
    ]
}
```

**示例：在创建时标记竞价型实例请求**

以下策略允许用户标记在实例启动期间创建的所有资源。第一个语句允许 RunInstances 创建列出的资源。由 RunInstances 创建的 `spot-instances-request` 资源是请求 Spot 实例的资源。第二个语句提供了一个 `*` 通配符，以允许在实例启动时创建所有资源时对其进行标记。

**注意**  
如果您在创建时标记竞价型实例请求，则 Amazon EC2 会在 RunInstances 语句中评估 `spot-instances-request` 资源。因此，您必须明确允许 RunInstances 操作的 `spot-instances-request` 资源，否则调用将失败。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowRun",
            "Effect": "Allow",
            "Action": [
                "ec2:RunInstances"
            ],
            "Resource": [
                "arn:aws:ec2:us-east-1::image/*",
                "arn:aws:ec2:us-east-1:*:subnet/*",
                "arn:aws:ec2:us-east-1:*:network-interface/*",
                "arn:aws:ec2:us-east-1:*:security-group/*",
                "arn:aws:ec2:us-east-1:*:key-pair/*",
                "arn:aws:ec2:us-east-1:*:volume/*",
                "arn:aws:ec2:us-east-1:*:instance/*",
                "arn:aws:ec2:us-east-1:*:spot-instances-request/*"
            ]
        },
        {
            "Sid": "TagResources",
            "Effect": "Allow",
            "Action": "ec2:CreateTags",
            "Resource": "*"
        }
    ]
}
```

------

**示例：拒绝在创建时标记竞价型实例请求**

以下策略拒绝用户标记在实例启动期间创建的资源的权限。

第一个语句允许 RunInstances 创建列出的资源。由 RunInstances 创建的 `spot-instances-request` 资源是请求 Spot 实例的资源。第二个语句提供了一个 `*` 通配符，以拒绝在实例启动时创建所有资源时对其进行标记。如果在创建时标记 `spot-instances-request` 或任何其他资源，则 RunInstances 调用将失败。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowRun",
            "Effect": "Allow",
            "Action": [
                "ec2:RunInstances"
            ],
            "Resource": [
                "arn:aws:ec2:us-east-1::image/*",
                "arn:aws:ec2:us-east-1:*:subnet/*",
                "arn:aws:ec2:us-east-1:*:network-interface/*",
                "arn:aws:ec2:us-east-1:*:security-group/*",
                "arn:aws:ec2:us-east-1:*:key-pair/*",
                "arn:aws:ec2:us-east-1:*:volume/*",
                "arn:aws:ec2:us-east-1:*:instance/*",
                "arn:aws:ec2:us-east-1:*:spot-instances-request/*"
            ]
        },
        {
            "Sid": "DenyTagResources",
            "Effect": "Deny",
            "Action": "ec2:CreateTags",
            "Resource": "*"
        }
    ]
}
```

------

**警告**  
**不支持 – 示例：仅在为竞价型实例请求分配了特定标签时允许创建该请求**  
`spot-instances-request` 资源不支持以下策略。  
以下策略旨在向 RunInstances 授予权限以仅在使用特定标签标记竞价型实例请求时创建该请求。  
第一个语句允许 RunInstances 创建列出的资源。  
第二个语句旨在向用户授予权限以仅在竞价型实例请求具有标签 `environment=production` 时创建该请求。如果将此条件应用于由 RunInstances 创建的其他资源，则不指定标签会导致 `Unauthenticated` 错误。但是，如果没有为竞价型实例请求指定标签，则 Amazon EC2 不会在 RunInstances 语句中评估 `spot-instances-request` 资源，这会导致 RunInstances 创建未标记的竞价型实例请求。  
请注意，请指定 `environment=production` 之外的其他标签会导致错误 `Unauthenticated`，这是因为，如果用户标记竞价型实例请求，则 Amazon EC2 会在 RunInstances 语句中评估 `spot-instances-request` 资源。  

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowRun",
            "Effect": "Allow",
            "Action": [
                "ec2:RunInstances"
            ],
            "Resource": [
                "arn:aws:ec2:us-east-1::image/*",
                "arn:aws:ec2:us-east-1:*:subnet/*",
                "arn:aws:ec2:us-east-1:*:network-interface/*",
                "arn:aws:ec2:us-east-1:*:security-group/*",
                "arn:aws:ec2:us-east-1:*:key-pair/*",
                "arn:aws:ec2:us-east-1:*:volume/*",
                "arn:aws:ec2:us-east-1:*:instance/*"
            ]
        },
        {
            "Sid": "RequestSpotInstancesOnlyIfTagIsEnvironmentProductionNOTSUPPORTEDDONOTUSE",
            "Effect": "Allow",
            "Action": "ec2:RunInstances",
            "Resource": "arn:aws:ec2:us-east-1:*:spot-instances-request/*",
            "Condition": {
                "StringEquals": {
                    "aws:RequestTag/environment": "production"
                }
            }
        },
        {
            "Sid": "TagResources",
            "Effect": "Allow",
            "Action": "ec2:CreateTags",
            "Resource": "*"
        }

    ]
}
```

**示例：在为竞价型实例请求分配了特定标签的情况下拒绝创建该请求**

如果使用 `environment=production` 标记了竞价型实例请求，则以下策略将拒绝 RunInstances 创建该请求的权限。

第一个语句允许 RunInstances 创建列出的资源。

第二个语句在竞价型实例请求具有标签 `environment=production` 时拒绝用户创建该请求的权限。指定 `environment=production` 作为标签会导致 `Unauthenticated` 错误。指定其他标签或不指定标签将导致创建竞价型实例请求。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowRun",
            "Effect": "Allow",
            "Action": [
                "ec2:RunInstances"
            ],
            "Resource": [
                "arn:aws:ec2:us-east-1::image/*",
                "arn:aws:ec2:us-east-1:*:subnet/*",
                "arn:aws:ec2:us-east-1:*:network-interface/*",
                "arn:aws:ec2:us-east-1:*:security-group/*",
                "arn:aws:ec2:us-east-1:*:key-pair/*",
                "arn:aws:ec2:us-east-1:*:volume/*",
                "arn:aws:ec2:us-east-1:*:instance/*",
                "arn:aws:ec2:us-east-1:*:spot-instances-request/*"
            ]
        },
        {
            "Sid": "DenySpotInstancesRequests",
            "Effect": "Deny",
            "Action": "ec2:RunInstances",
            "Resource": "arn:aws:ec2:us-east-1:*:spot-instances-request/*",
            "Condition": {
                "StringEquals": {
                    "aws:RequestTag/environment": "production"
                }
            }
        },
        {
            "Sid": "TagResources",
            "Effect": "Allow",
            "Action": "ec2:CreateTags",
            "Resource": "*"
        }
    ]
}
```

------

## 示例：使用预留实例
<a name="iam-example-reservedinstances"></a>

下面的策略向用户授予在账户中查看、修改和购买预留实例的权限。

无法为个别的预留实例设置资源级别的许可。此策略表示用户可以访问账户中的所有预留实例。

`Resource` 元素使用 \$1 通配符指示用户可以在操作中指定所有资源；在本例中，他们可以列出并修改账户中的所有 预留实例。他们还可以使用账户凭证购买预留实例。在 API 操作不支持资源级权限的情况下，也需要 \$1 通配符。

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ec2:DescribeReservedInstances", 
        "ec2:ModifyReservedInstances",
        "ec2:PurchaseReservedInstancesOffering", 
        "ec2:DescribeAvailabilityZones",
        "ec2:DescribeReservedInstancesOfferings"
      ],
      "Resource": "*"
    }
   ]
}
```

------

要允许用户查看和修改账户中的 预留实例，但不允许购买新的 预留实例，请使用以下命令：

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
   "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ec2:DescribeReservedInstances", 
        "ec2:ModifyReservedInstances",
        "ec2:DescribeAvailabilityZones"
      ],
      "Resource": "*"
    }
  ]
}
```

------

## 示例：标记资源
<a name="iam-example-taggingresources"></a>

仅当标签包含键 `CreateTags` 和值 `environment` 时，下面的策略才允许用户使用 `production` 操作向实例应用标签。不允许使用其他标签，并且用户无法为任何其他资源类型添加标签。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
              {
            "Effect": "Allow",
            "Action": [
                "ec2:CreateTags"
            ],
            "Resource": "arn:aws:ec2:us-east-1:111122223333:instance/*",
            "Condition": {
                "StringEquals": {
                    "aws:RequestTag/environment": "production"
                }
            }
        }
    ]
}
```

------

以下策略允许用户标记已具有键为 `owner`、值为用户名的标签的任何可标记资源。此外，用户还必须在请求中指定键为 `anycompany:environment-type`、值为 `test` 或 `prod` 的标签。用户可以在请求中指定其他的标签。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
               {
            "Effect": "Allow",
            "Action": [
                "ec2:CreateTags"
            ],
            "Resource": "arn:aws:ec2:us-east-1:111122223333:*/*",
            "Condition": {
                "StringEquals": {
                    "aws:RequestTag/anycompany:environment-type": ["test","prod"],
                    "aws:ResourceTag/owner": "${aws:username}"
                } 
            }
        }
    ]
}
```

------

您可以创建允许用户删除资源的特定标签的 IAM 策略。例如，当在请求中指定的标签键为 `environment` 或 `cost-center` 时，下面的策略允许用户删除卷的标签。可以为此标签指定任何值，但标签键必须匹配某个指定键。

**注意**  
如果删除资源，则所有与资源相关的标签都将被删除。用户不需要使用 `ec2:DeleteTags` 操作删除具有标签的资源的权限，他们仅需要执行删除操作的权限。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
       {
      "Effect": "Allow",
      "Action": "ec2:DeleteTags",
      "Resource": "arn:aws:ec2:us-east-1:111122223333:volume/*",
      "Condition": {
        "ForAllValues:StringEquals": {
          "aws:TagKeys": ["environment","cost-center"]
        }
      }
    }
  ]
}
```

------

该策略仅允许用户删除任何资源上的 `environment=prod` 标签，但前提是已使用键为 `owner`、值为用户名的标签标记该资源。用户无法删除资源的任何其他标签。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
      {
      "Effect": "Allow",
      "Action": [
        "ec2:DeleteTags"
      ],
      "Resource": "arn:aws:ec2:us-east-1:111122223333:*/*",
      "Condition": {
        "StringEquals": {
          "aws:RequestTag/environment": "prod",
          "aws:ResourceTag/owner": "${aws:username}"
        },
        "ForAllValues:StringEquals": {
          "aws:TagKeys": ["environment"]
        }
      }
    }
  ]
}
```

------

## 示例：使用 IAM 角色
<a name="iam-example-iam-roles"></a>

以下策略允许用户将 IAM 角色附加、替换到具有标签 `department=test` 的实例或与之分离。替换或分离 IAM 角色需要一个关联 ID，因此该策略还授予用户使用 `ec2:DescribeIamInstanceProfileAssociations` 操作的权限。

用户必须具有使用 `iam:PassRole` 操作的权限，才能将角色传递到实例。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ec2:AssociateIamInstanceProfile",
        "ec2:ReplaceIamInstanceProfileAssociation",
        "ec2:DisassociateIamInstanceProfile"
      ],
      "Resource": "arn:aws:ec2:us-east-1:111122223333:instance/*",
      "Condition": {
        "StringEquals": {
          "aws:ResourceTag/department":"test"
        }
      }
    },
    {
      "Effect": "Allow",
      "Action": "ec2:DescribeIamInstanceProfileAssociations",
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": "iam:PassRole",
      "Resource": "arn:aws:iam::111122223333:role/DevTeam*"
    }
  ]
}
```

------

以下策略允许用户为所有实例附加或替换 IAM 角色。用户只能附加或替换名称以 `TestRole-` 开头的 IAM 角色。对于 `iam:PassRole` 操作，请确保您指定的是 IAM 角色的名称而不是实例配置文件的名称（如果名称不同）。有关更多信息，请参阅 [实例配置文件](iam-roles-for-amazon-ec2.md#ec2-instance-profile)。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ec2:AssociateIamInstanceProfile",
                "ec2:ReplaceIamInstanceProfileAssociation"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": "ec2:DescribeIamInstanceProfileAssociations",
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": "iam:PassRole",
            "Resource": "arn:aws:iam::111122223333:role/TestRole-*"
        }
    ]
}
```

------

## 示例：使用路由表
<a name="iam-example-route-tables"></a>

以下策略允许用户添加、删除和替换仅与 VPC `vpc-ec43eb89` 关联的路由表的路由。要为 `ec2:Vpc` 条件键指定 VPC，必须指定 VPC 的完整 ARN。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
              {
            "Effect": "Allow",
            "Action": [
                "ec2:DeleteRoute",
                "ec2:CreateRoute",
                "ec2:ReplaceRoute"
            ],
            "Resource": [
                "arn:aws:ec2:us-east-1:111122223333:route-table/*"
            ],
            "Condition": {
                "StringEquals": {
                    "ec2:Vpc": "arn:aws:ec2:us-east-1:111122223333:vpc/vpc-ec43eb89"
                }
            }
        }
    ]
}
```

------

## 示例：允许特定实例查看其他 AWS 服务中的资源
<a name="iam-example-source-instance"></a>

下面是您可能附加到 IAM 角色的策略的示例。该策略允许实例查看不同 AWS 服务中的资源。它使用 `ec2:SourceInstanceARN` 全局条件键指定从中发出请求的实例必须是实例 `i-093452212644b0dd6`。如果同一个 IAM 角色还与另一个实例关联，则另一个实例无法执行任何这些操作。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
              {
            "Effect": "Allow",
            "Action": [
                "ec2:DescribeVolumes",
                "s3:ListAllMyBuckets",
                "dynamodb:ListTables",
                "rds:DescribeDBInstances"
            ],
            "Resource": [
                "*"
            ],
            "Condition": {
                "ArnEquals": {
                    "ec2:SourceInstanceARN": "arn:aws:ec2:us-east-1:111122223333:instance/i-093452212644b0dd6"
                }
            }
        }
    ]
}
```

------

## 示例：使用启动模板
<a name="iam-example-launch-templates"></a>

以下策略允许用户创建启动模板版本和修改启动模板，但仅适用于特定的启动模板 (`lt-09477bcd97b0d3abc`)。用户无法使用其他启动模板。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
   {
      "Action": [
        "ec2:CreateLaunchTemplateVersion",
        "ec2:ModifyLaunchTemplate"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:ec2:us-east-1:111122223333:launch-template/lt-09477bcd97b0d3abc"
    }
  ]
}
```

------

以下策略允许用户删除任何启动模板和启动模板版本，但前提是启动模板具有标签 `Purpose`=`Testing`。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
       {
      "Action": [
        "ec2:DeleteLaunchTemplate",
        "ec2:DeleteLaunchTemplateVersions"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:ec2:us-east-1:111122223333:launch-template/*",
      "Condition": {
        "StringEquals": {
          "aws:ResourceTag/Purpose": "Testing"
        }
      }
    }
  ]
}
```

------

## 使用实例元数据
<a name="iam-example-instance-metadata"></a>

以下策略确保用户只能使用 实例元数据服务版本 2 (IMDSv2) 检索[实例元数据](ec2-instance-metadata.md)。您可以将以下四个策略合并为一个具有四个语句的策略。当合并为一个策略时，您可以将该策略用作服务控制策略 (SCP)。它可以很好地用作应用于现有 IAM 策略的*拒绝*策略（取消和限制现有权限），也可以很好地用作在账户、组织单元（OU）或整个组织间全局应用的 SCP。

**注意**  
以下 RunInstances 元数据选项策略必须与授予主体使用 RunInstances 启动实例的权限的策略结合使用。如果主体没有同时具有 RunInstances 权限，则无法启动实例。有关更多信息，请参阅[使用实例](#iam-example-instances)和[启动实例 (RunInstances)](#iam-example-runinstances) 中的策略。

**重要**  
如果您使用自动扩缩组且需要要求对所有新实例使用 IMDSv2，您的自动扩缩组必须使用*启动模板*。  
当自动扩缩组使用启动模板时，会在创建新自动扩缩组时检查 IAM 主体的 `ec2:RunInstances` 权限。当更新现有自动扩缩组以使用新启动模板或新版本的启动模板时，也会检查这些内容。  
只有在创建或更新正在使用启动模板的自动扩缩组时，才会检查对 `RunInstances` 的 IAM 主体使用 IMDSv1 的限制。对于配置为使用 `Latest` 或 `Default` 启动模板的自动扩缩组，在创建启动模板的新版本时不会检查权限。要检查权限，您必须将自动扩缩组配置为使用*特定版本* 的启动模板。  
通过对创建的新主体使用服务控制策略（SCP）或 IAM 权限边界，请对组织中的所有账户禁用启动配置。对于具有自动扩缩组权限的现有 IAM 主体，请使用此条件键更新其关联策略。要禁用启动配置，请使用值指定为 `"autoscaling:LaunchConfigurationName"` 的 `null` 条件键创建或修改相关 SCP、权限边界或 IAM 策略。
对于新启动模板，请在启动模板中配置实例元数据选项。对于现有启动模板，创建启动模板的新版本，并在新版本中配置实例元数据选项。
在向任何主体授予使用启动模板的权限的策略中，通过指定 `$latest` 来限制 `$default` 和 `"autoscaling:LaunchTemplateVersionSpecified": "true"` 的关联。通过限制只使用特定版本的启动模板，您可以确保使用在其中配置实例元数据选项的版本启动新实例。有关更多信息，请参阅 *Amazon EC2 Auto Scaling API 参考* 中的 [LaunchTemplateSpecification](https://docs.aws.amazon.com/autoscaling/ec2/APIReference/API_LaunchTemplateSpecification.html)，特别是 `Version` 参数。
对于使用启动配置的自动扩缩组，请将启动配置替换为启动模板。有关更多信息，请参阅《Amazon EC2 Auto Scaling User Guide》**中的 [Migrate your Auto Scaling groups to launch templates](https://docs.aws.amazon.com/autoscaling/ec2/userguide/migrate-to-launch-templates.html)。
对于使用启动模板的自动扩缩组，请确保它使用配置了实例元数据选项的新启动模板，或使用配置了实例元数据选项的新版本的当前启动模板。有关更多信息，请参阅 [update-auto-scaling-group](https://docs.aws.amazon.com/cli/latest/reference/autoscaling/update-auto-scaling-group.html)。

**Topics**
+ [要求使用 IMDSv2](#iam-example-instance-metadata-requireIMDSv2)
+ [拒绝退出 IMDSv2](#iam-example-instance-metadata-denyoptoutIMDSv2)
+ [指定最大跃点数限制](#iam-example-instance-metadata-maxHopLimit)
+ [限制可以修改实例元数据选项的用户](#iam-example-instance-metadata-limit-modify-IMDS-options)
+ [要求从 IMDSv2 检索角色凭证](#iam-example-instance-metadata-require-roles-to-use-IMDSv2-credentials)

### 要求使用 IMDSv2
<a name="iam-example-instance-metadata-requireIMDSv2"></a>

以下策略指定您不能调用 RunInstances API，除非该实例也选择需要使用 IMDSv2（由 `"ec2:MetadataHttpTokens": "required"` 指示）。如果您未指定实例需要 IMDSv2，则在调用 RunInstances API 时会收到 `UnauthorizedOperation` 错误。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
               {
            "Sid": "RequireImdsV2",
            "Effect": "Deny",
            "Action": "ec2:RunInstances",
            "Resource": "arn:aws:ec2:*:*:instance/*",
            "Condition": {
                "StringNotEquals": {
                    "ec2:MetadataHttpTokens": "required"
                }
            }
        }
    ]
}
```

------

### 拒绝退出 IMDSv2
<a name="iam-example-instance-metadata-denyoptoutIMDSv2"></a>

以下策略指定您不能调用 `ModifyInstanceMetadataOptions` API 并允许选择 IMDSv1 或 IMDSv2。如果您调用 `ModifyInstanceMetadataOptions` API，则必须将 `HttpTokens` 属性设置为 `required`。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [{
        "Sid": "DenyIMDSv1HttpTokensModification",
        "Effect": "Deny",
        "Action": "ec2:ModifyInstanceMetadataOptions",
        "Resource": "arn:aws:ec2:*:*:instance/*",
        "Condition": {
            "StringNotEquals": {
                "ec2:Attribute/HttpTokens": "required"
            },
            "Null": {
                "ec2:Attribute/HttpTokens": false
            }
        }
    }]
}
```

------

### 指定最大跃点数限制
<a name="iam-example-instance-metadata-maxHopLimit"></a>

以下策略指定您不能调用 RunInstances API，除非您还指定了跃点限制，且跃点限制不能超过 3。如果您无法执行此操作，则在调用 RunInstances API 时会收到 `UnauthorizedOperation` 错误。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
               {
            "Sid": "MaxImdsHopLimit",
            "Effect": "Deny",
            "Action": "ec2:RunInstances",
            "Resource": "arn:aws:ec2:*:*:instance/*",
            "Condition": {
                "NumericGreaterThan": {
                    "ec2:MetadataHttpPutResponseHopLimit": "3"
                }
            }
        }
    ]
}
```

------

### 限制可以修改实例元数据选项的用户
<a name="iam-example-instance-metadata-limit-modify-IMDS-options"></a>

以下策略仅允许具有 `ec2-imds-admins` 角色的用户对实例元数据选项进行更改。如果除 `ec2-imds-admins` 角色以外的任何主体尝试调用 ModifyInstanceMetadataOptions API，则会收到 `UnauthorizedOperation` 错误。此语句可用于控制 ModifyInstanceMetadataOptions API 的使用；目前对于 ModifyInstanceMetadataOptions API 没有精细访问控制（条件）。

### 要求从 IMDSv2 检索角色凭证
<a name="iam-example-instance-metadata-require-roles-to-use-IMDSv2-credentials"></a>

以下策略指定如果将此策略应用于某个角色，并且该角色由 EC2 服务代入且生成的凭证用于对请求进行签名，则必须由从 IMDSv2 中检索的 EC2 角色凭证对该请求进行签名。否则，它的所有 API 调用都会收到 `UnauthorizedOperation` 错误。此语句/策略可广泛应用，因为如果请求未由 EC2 角色证书签名，则其为无效。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
               {
            "Sid": "RequireAllEc2RolesToUseV2",
            "Effect": "Deny",
            "Action": "*",
            "Resource": "*",
            "Condition": {
                "NumericLessThan": {
                    "ec2:RoleDelivery": "2.0"
                }
            }
        }
    ]
}
```

------

## 使用 Amazon EBS 卷和快照
<a name="iam-example-ebs"></a>

有关使用 Amazon EBS 卷和快照的策略示例，请参阅 [Amazon EBS 的基于身份的策略示例](https://docs.aws.amazon.com/ebs/latest/userguide/security_iam_id-based-policy-examples.html)。

# 用于控制对 Amazon EC2 控制台的访问的示例策略
<a name="iam-policies-ec2-console"></a>

您可以使用 IAM 策略向用户授予使用 Amazon EC2 所需的权限。有关分步说明，请参阅《IAM 用户指南》**中的[创建 IAM 策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html)。

控制台使用其他 API 操作实现其功能，因此这些策略可能不会按预期方式起作用。例如，只拥有 `DescribeVolumes` API 操作使用权限的用户在控制台中查看卷时会遇到错误。此部分演示使用户可以使用控制台的特定部分的策略。有关创建 Amazon EC2 控制台的策略的更多信息，请参阅发布的以下AWS安全博客：[授予用户在 Amazon EC2 控制台中工作的权限](https://aws.amazon.com/blogs/security/granting-users-permission-to-work-in-the-amazon-ec2-console/)。

以下示例显示了您可用于向用户授予使用 Amazon EC2 的权限的策略语句。将每个*用户输入占位符*替换为您自己的信息。这些策略设计用于采用 AWS 管理控制台 发出的请求。Amazon EC2 控制台可能会调用多个 API 操作来显示单个资源，但在用户尝试执行任务且控制台显示错误之前，这可能并不明显。有关更多信息，请参阅以下 AWS Security Blog 文章：[Granting Users Permission to Work in the Amazon EC2 Console](https://aws.amazon.com/blogs/security/granting-users-permission-to-work-in-the-amazon-ec2-console/)。

**Topics**
+ [只读访问权限](#ex-read-only)
+ [使用 EC2 启动实例向导](#ex-launch-wizard)
+ [使用安全组](#ex-security-groups)
+ [使用弹性 IP 地址](#ex-eip)
+ [使用预留实例](#ex-reservedinstances)

为帮助了解在控制台中执行任务所需的相应 API 操作，您可以使用能够记录调用的服务，例如 AWS CloudTrail。如果您的策略不授予创建或修改特定资源的权限，则控制台显示一个包含诊断信息的编码消息。您可以使用适用于 AWS STS 的 [DecodeAuthorizationMessage](https://docs.aws.amazon.com/STS/latest/APIReference/API_DecodeAuthorizationMessage.html) API 操作或 AWS CLI 中的 [decode-authorization-message](https://docs.aws.amazon.com/cli/latest/reference/sts/decode-authorization-message.html) 命令对该消息解码。

## 示例：只读访问权限
<a name="ex-read-only"></a>

要允许用户在 Amazon EC2 控制台中查看所有资源，您可以使用与以下示例相同的策略：[示例：只读访问权限](ExamplePolicies_EC2.md#iam-example-read-only)用户无法对这些资源执行任何操作或创建新资源 (除非其他语句为用户授予执行此操作的权限)。

**查看实例、AMI 和快照**

或者，您可以提供对资源子集的只读访问权限。为此，请对每个资源将 `ec2:Describe` API 操作中的 \$1 通配符替换为特定 `ec2:Describe` 操作。以下策略允许用户在 Amazon EC2 控制台中查看所有实例、AMI 和快照。`ec2:DescribeTags` 操作允许用户查看公用 AMI。控制台需要标记信息来显示公用 AMI；但是，您可以删除此操作以允许用户只查看私有 AMI。

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement": [{
      "Effect": "Allow",
      "Action": [
         "ec2:DescribeInstances", 
         "ec2:DescribeImages",
         "ec2:DescribeTags", 
         "ec2:DescribeSnapshots"
      ],
      "Resource": "*"
   }
   ]
}
```

------

**注意**  
Amazon EC2 `ec2:Describe*` API 操作不支持资源级权限，因此您无法控制用户可以在控制台中查看哪些单个资源。因此，在以上语句的 `Resource` 元素中需要 \$1 通配符。有关哪些 ARN 可用于哪些 Amazon EC2 API 操作的更多信息，请参阅 [Amazon EC2 的操作、资源和条件键](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonec2.html)。

**查看实例和 CloudWatch 指标**

以下策略允许用户在 Amazon EC2 控制台中查看实例，以及在 **Instances** 页面的 **Monitoring** 选项卡中查看 CloudWatch 警报和指标。Amazon EC2 控制台使用 CloudWatch API 显示警报和指标，因此您必须授权用户执行 `cloudwatch:DescribeAlarms`、`cloudwatch:DescribeAlarmsForMetric`、`cloudwatch:ListMetrics`、`cloudwatch:GetMetricStatistics` 和 `cloudwatch:GetMetricData` 操作。

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement": [{
      "Effect": "Allow",
      "Action": [
         "ec2:DescribeInstances",
         "ec2:DescribeInstanceTypes",
         "cloudwatch:DescribeAlarms",
         "cloudwatch:DescribeAlarmsForMetric",
         "cloudwatch:ListMetrics",
         "cloudwatch:GetMetricStatistics",
         "cloudwatch:GetMetricData"
      ],
      "Resource": "*"
   }
   ]
}
```

------

## 示例：使用 EC2 启动实例向导
<a name="ex-launch-wizard"></a>

Amazon EC2 启动实例向导是一个屏幕，其中包含用于配置和启动实例的选项。您的策略必须包含允许用户使用向导选项的 API 操作使用权限。如果您的策略不包含使用这些操作的权限，则向导中的一些项目无法正确加载，用户无法完成启动。

**启动实例向导基本访问权限**

要成功完成启动，必须为用户授予使用 `ec2:RunInstances` API 操作以及至少以下 API 操作的权限：
+ `ec2:DescribeImages`：查看并选择 AMI。
+ `ec2:DescribeInstanceTypes`：查看并选择一种实例类型。
+ `ec2:DescribeVpcs`：查看可用网络选项。
+ `ec2:DescribeSubnets`：查看所选 VPC 的所有可用子网。
+ `ec2:DescribeSecurityGroups` 或 `ec2:CreateSecurityGroup`：查看并选择现有安全组，或者创建新的安全组。
+ `ec2:DescribeKeyPairs` 或 `ec2:CreateKeyPair`：选择现有密钥对，或者创建新密钥对。
+ `ec2:AuthorizeSecurityGroupIngress`：添加入站规则。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ec2:DescribeInstances",
                "ec2:DescribeImages",
                "ec2:DescribeInstanceTypes",
                "ec2:DescribeKeyPairs",
                "ec2:DescribeVpcs",
                "ec2:DescribeSubnets",
                "ec2:DescribeSecurityGroups",
                "ec2:CreateSecurityGroup",
                "ec2:AuthorizeSecurityGroupIngress",
                "ec2:CreateKeyPair"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": "ec2:RunInstances",
            "Resource": "*"
        }
    ]
}
```

------

您可以向策略添加 API 操作以便为用户提供更多选项，例如：
+ `ec2:DescribeAvailabilityZones`：查看并选择特定可用区。
+ `ec2:DescribeNetworkInterfaces`：查看并选择所选子网的现有网络接口。
+ 要向 VPC 安全组添加出站规则，必须为用户授予使用 `ec2:AuthorizeSecurityGroupEgress` API 操作的权限。要修改或删除现有规则，必须为用户授予使用相关 `ec2:RevokeSecurityGroup*` API 操作的权限。
+ `ec2:CreateTags`：标记通过 `RunInstances` 创建的资源。有关更多信息，请参阅 [在创建过程中授予标记 Amazon EC2 资源的权限](supported-iam-actions-tagging.md)。如果用户没有使用此操作的权限而又尝试在启动实例向导的标记页上应用标签，则启动失败。
**重要**  
启动实例时指定 **Name**（名称）会创建一个标签并需要 `ec2:CreateTags` 操作。向用户授予使用 `ec2:CreateTags` 操作的权限时请谨慎，因为这样做会限制您使用 `aws:ResourceTag` 条件键限制用户使用其他资源的功能。如果您授予用户使用 `ec2:CreateTags` 操作的权限，则他们可以更改资源的标签以绕过这些限制。有关更多信息，请参阅 [使用基于属性的访问控制访问权限](iam-policies-for-amazon-ec2.md#control-access-with-tags)。
+ 要在选择 AMI 时使用 Systems Manager 参数，您必须将 `ssm:DescribeParameters` 和 `ssm:GetParameters` 添加到 IAM 策略中。`ssm:DescribeParameters` 会授予用户查看和选择 Systems Manager 参数的权限。`ssm:GetParameters` 则会授予用户获取 Systems Manager 参数值的权限。您还可以限制对特定 Systems Manager 参数的访问权限。有关更多信息，请参阅本节后文中的**限制对特定 Systems Manager 参数的访问**。

当前，Amazon EC2 `Describe*` API 操作不支持资源级权限，因此您无法限制用户可以在启动实例向导中查看的单个资源。但是，您可以对 `ec2:RunInstances` API 操作应用资源级权限，以限制用户可以用于启动实例的资源。如果用户选择未授权他们使用的选项，则启动会失败。

**限制对特定实例类型、子网和区域的访问**

以下策略允许用户使用 Amazon 拥有的 AMI 启动 `t2.micro` 实例，并且仅在特定子网 (`subnet-1a2b3c4d`) 中启动。用户只能在指定区域中启动。如果用户在启动实例向导中选择不同区域或选择不同实例类型、AMI 或子网，则启动会失败。

第一条语句为用户授予权限以查看启动实例向导中的选项或创建新选项，如上例所示。第二条语句为用户授予将网络接口、卷、密钥对、安全组和子网资源 (在 VPC 中启动实例需要这些资源) 用于 `ec2:RunInstances` 操作的权限。有关使用 `ec2:RunInstances` 操作的更多信息，请参阅 [启动实例 (RunInstances)](ExamplePolicies_EC2.md#iam-example-runinstances)。第三和第四条语句分别为用户授予权限以使用实例（仅当实例是 `t2.micro` 实例时）和 AMI 资源（仅当 AMI 由 Amazon 或某些受信任或经过验证的合作伙伴所有时）。

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement": [{
      "Effect": "Allow",
      "Action": [
         "ec2:DescribeInstances",
         "ec2:DescribeImages",
         "ec2:DescribeInstanceTypes",
         "ec2:DescribeKeyPairs", 
         "ec2:CreateKeyPair", 
         "ec2:DescribeVpcs", 
         "ec2:DescribeSubnets", "ec2:DescribeSecurityGroups", 
         "ec2:CreateSecurityGroup", 
         "ec2:AuthorizeSecurityGroupIngress"
	  ],
	  "Resource": "*"
   },
   {
      "Effect": "Allow",
      "Action":"ec2:RunInstances",
      "Resource": [
         "arn:aws:ec2:us-east-2:111122223333:network-interface/*",
         "arn:aws:ec2:us-east-2:111122223333:volume/*",
         "arn:aws:ec2:us-east-2:111122223333:key-pair/*",
         "arn:aws:ec2:us-east-2:111122223333:security-group/*",
         "arn:aws:ec2:us-east-2:111122223333:subnet/subnet-1a2b3c4d"
      ]
   },
   {
      "Effect": "Allow",
      "Action": "ec2:RunInstances",
      "Resource": [
         "arn:aws:ec2:us-east-2:111122223333:instance/*"
      ],
      "Condition": {
         "StringEquals": {
            "ec2:InstanceType": "t2.micro"
         }
      }
   },
   {
      "Effect": "Allow",
      "Action": "ec2:RunInstances",
      "Resource": [ 
            "arn:aws:ec2:us-east-2::image/ami-*"
      ],
      "Condition": {
         "StringEquals": {
            "ec2:Owner": "amazon"
         }
      }
   }
   ]
}
```

------

**限制对特定 Systems Manager 参数的访问**

以下策略授予访问权限以使用具有特定名称的 Systems Manager 参数。

第一条语句授予用户权限，可在启动实例向导中选择 AMI 时查看 Systems Manager 参数。第二条语句授予用户仅使用名为 `prod-*` 的参数的权限。

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement": [{
      "Effect": "Allow",
      "Action": [
         "ssm:DescribeParameters"
      ],
      "Resource": "*"
   },
   {
      "Effect": "Allow",
      "Action": [
         "ssm:GetParameters"
      ],
     "Resource": "arn:aws:ssm:us-east-2:123456123456:parameter/prod-*"
   }
   ]
}
```

------

## 示例：使用安全组
<a name="ex-security-groups"></a>

**查看安全组以及添加和删除规则**

以下策略为用户授予相应的权限，以便在 Amazon EC2 控制台中查看安全组、添加和删除入站和出站规则，以及为具有标签 `Department=Test` 的现有安全组列出并修改规则描述。

在第一条语句中，`ec2:DescribeTags` 操作允许用户在控制台中查看标签，这样，用户更易于识别自己可修改的安全组。

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement": [{
      "Effect": "Allow",
      "Action": [
         "ec2:DescribeSecurityGroups", 
         "ec2:DescribeSecurityGroupRules", 
         "ec2:DescribeTags"
      ],
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": [
         "ec2:AuthorizeSecurityGroupIngress", 
         "ec2:RevokeSecurityGroupIngress", 
         "ec2:AuthorizeSecurityGroupEgress", 
         "ec2:RevokeSecurityGroupEgress", 
         "ec2:ModifySecurityGroupRules", 
         "ec2:UpdateSecurityGroupRuleDescriptionsIngress", 
         "ec2:UpdateSecurityGroupRuleDescriptionsEgress"
      ],
      "Resource": [
         "arn:aws:ec2:us-east-2:111122223333:security-group/*"
      ],
      "Condition": {
         "StringEquals": {
            "aws:ResourceTag/Department": "Test"
         }
      }
   },
   {
      "Effect": "Allow",
      "Action": [
         "ec2:ModifySecurityGroupRules"
      ],
      "Resource": [
         "arn:aws:ec2:us-east-2:111122223333:security-group-rule/*"
      ]
   }
]}
```

------

**使用 Create Security Group（创建安全组）对话框**

您可以创建一个策略，以允许用户使用 Amazon EC2 控制台中的 **Create Security Group (创建安全组)** 对话框。要使用此对话框，必须为用户授予使用至少以下 API 操作的权限：
+ `ec2:CreateSecurityGroup`: 创建新安全组。
+ `ec2:DescribeVpcs`查看 **VPC** 列表中的现有 VPC 列表。

借助这些权限，用户可以成功创建新安全组，但是他们不能向其中添加任何规则。要在 **Create Security Group (创建安全组)** 对话框中使用规则，您可以向策略添加以下 API 操作：
+ `ec2:AuthorizeSecurityGroupIngress`：添加入站规则。
+ `ec2:AuthorizeSecurityGroupEgress`：向 VPC 安全组添加出站规则。
+ `ec2:RevokeSecurityGroupIngress`：修改或删除现有入站规则。如果要允许用户使用控制台中的 **Copy to new** 功能，这十分有用。此功能会打开 **Create Security Group (创建安全组)** 对话框，并使用所选安全组的规则进行填充。
+ `ec2:RevokeSecurityGroupEgress`：修改或删除适用于 VPC 安全组的出站规则。若要允许用户修改或删除允许所有出站流量的默认出站规则，这十分有用。
+ `ec2:DeleteSecurityGroup`：适用于无效规则无法保存的情况。控制台首先创建安全组，然后添加指定的规则。如果规则无效，则操作会失败，而控制台会尝试删除安全组。用户仍会停留在“**Create Security Group**”对话框中，这样就能更正无效规则和尝试重新创建安全组。此 API 操作不是必需的，但是如果用户在无权使用它的情况下尝试创建具有无效规则的安全组，则会创建不包含任何规则的安全组，用户必须在之后添加规则。
+ `ec2:UpdateSecurityGroupRuleDescriptionsIngress`：添加或更新入口（入站）安全组规则的描述。
+ `ec2:UpdateSecurityGroupRuleDescriptionsEgress`：添加或更新出口（出站）安全组规则的描述。
+ `ec2:ModifySecurityGroupRules`：修改安全组规则。
+ `ec2:DescribeSecurityGroupRules`：列出安全组规则。

以下策略向用户授予使用 **Create Security Group (创建安全组)** 对话框，以及为与特定 VPC (`vpc-1a2b3c4d`) 关联的安全组创建入站和出站规则的权限。用户可以为 VPC 创建安全组，但是无法向它们添加任何规则。同样，用户无法向不与 VPC `vpc-1a2b3c4d` 关联的任何现有安全组添加任何规则。还向用户授予了在控制台中查看所有安全组的权限。这样，用户更易于识别自己可添加入站规则的安全组。此策略还为用户授予删除与 VPC `vpc-1a2b3c4d` 关联的安全组的权限。

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement": [{
      "Effect": "Allow",
      "Action": [
        "ec2:DescribeSecurityGroups", 
        "ec2:CreateSecurityGroup", 
        "ec2:DescribeVpcs"
      ],
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "ec2:DeleteSecurityGroup", 
        "ec2:AuthorizeSecurityGroupIngress", 
        "ec2:AuthorizeSecurityGroupEgress"
      ],
      "Resource": "arn:aws:ec2:us-east-2:111122223333:security-group/*",
      "Condition":{
         "ArnEquals": {
            "ec2:Vpc": "arn:aws:ec2:us-east-2:111122223333:vpc/vpc-1a2b3c4d"
         }
      }
    }
   ]
}
```

------

## 示例：使用弹性 IP 地址
<a name="ex-eip"></a>

为了让用户能够查看 Amazon EC2 控制台中的弹性 IP 地址，您必须授予用户使用 `ec2:DescribeAddresses` 操作的权限。

要允许用户使用弹性 IP 地址，可将以下操作添加到您策略中。
+ `ec2:AllocateAddress`：分配弹性 IP 地址。
+ `ec2:ReleaseAddress`: 解除弹性 IP 地址。
+ `ec2:AssociateAddress`：将弹性 IP 地址与实例或网络接口关联。
+ `ec2:DescribeNetworkInterfaces` 和 `ec2:DescribeInstances`：使用 **Associate Address (关联地址)** 屏幕。屏幕显示了您可以将弹性 IP 地址关联到的可用实例或网络接口。
+ `ec2:DisassociateAddress`：取消弹性 IP 地址与实例或网络接口的关联。

以下策略允许用户查看弹性 IP 地址并将其分配给实例和与实例相关联。用户不可以将弹性 IP 地址与网络接口关联、取消弹性 IP 地址的关联或释放弹性 IP 地址。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ec2:DescribeAddresses",
                "ec2:AllocateAddress",
                "ec2:DescribeInstances",
                "ec2:AssociateAddress"
            ],
            "Resource": "*"
        }
    ]
}
```

------

## 示例：使用预留实例
<a name="ex-reservedinstances"></a>

以下策略允许用户查看和修改账户中的预留实例，同时也能在 AWS 管理控制台 内购买新的预留实例。

此策略允许用户查看账户中的所有预留实例和按需型实例。无法为单个预留实例设置资源级别的权限。

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement": [{
      "Effect": "Allow",
      "Action": [
         "ec2:DescribeReservedInstances", 
         "ec2:ModifyReservedInstances",
         "ec2:PurchaseReservedInstancesOffering", 
         "ec2:DescribeInstances",
         "ec2:DescribeInstanceTypes",
         "ec2:DescribeAvailabilityZones", 
         "ec2:DescribeReservedInstancesOfferings"
      ],
      "Resource": "*"
   }
   ]
}
```

------

必须执行 `ec2:DescribeAvailabilityZones` 操作才能确保 Amazon EC2 控制台可以显示有关您能够购买预留实例的可用区的信息。`ec2:DescribeInstances` 操作不是必须的，但是请确保用户可查看账户内的实例并且能够购买预留实例，以匹配正确的规格。

您可以调整 API 操作，以限制用户访问，例如删除`ec2:DescribeInstances`，而`ec2:DescribeAvailabilityZones`表示用户有只读形式的访问权。

# Amazon EC2 的 AWS 托管式策略
<a name="security-iam-awsmanpol"></a>

要向用户、组和角色添加权限，与自己编写策略相比，使用 AWS 托管式策略更简单。创建仅为团队提供所需权限的 [IAM 客户管理型策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create-console.html)需要时间和专业知识。要快速入门，您可以使用我们的 AWS 托管式策略。这些策略涵盖常见使用案例，可在您的 AWS 账户中使用。有关 AWS 托管式策略的更多信息，请参阅《IAM 用户指南》**中的 [AWS 托管式策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#aws-managed-policies)。

AWS 服务负责维护和更新 AWS 托管式策略。您无法更改 AWS 托管式策略中的权限。服务偶尔会向 AWS 托管式策略添加额外权限以支持新特征。此类更新会影响附加策略的所有身份（用户、组和角色）。当启动新特征或新操作可用时，服务最有可能会更新 AWS 托管式策略。服务不会从 AWS 托管式策略中删除权限，因此策略更新不会破坏您的现有权限。

此外，AWS 还支持跨多种服务的工作职能的托管式策略。例如，**ReadOnlyAccess** AWS 托管式策略提供对所有 AWS 服务和资源的只读访问权限。当服务启动新特征时，AWS 会为新操作和资源添加只读权限。有关工作职能策略的列表和说明，请参阅*《IAM 用户指南》*中的[适用于工作职能的 AWS 托管策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_job-functions.html)。

## AWS 托管策略：AmazonEC2FullAccess
<a name="security-iam-awsmanpol-AmazonEC2FullAccess"></a>

您可以将 `AmazonEC2FullAccess` 策略附加得到 IAM 身份。此策略授予允许完全访问 Amazon EC2 的权限。

要查看此策略的权限，请参阅《AWS 托管式策略参考》中的 [https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonEC2FullAccess.html](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonEC2FullAccess.html)**。

## AWS 托管式策略：AmazonEC2ReadOnlyAccess
<a name="security-iam-awsmanpol-AmazonEC2ReadOnlyAccess"></a>

您可以将 `AmazonEC2ReadOnlyAccess` 策略附加到 IAM 身份。此策略授予允许对 Amazon EC2 进行只读访问的权限。

要查看此策略的权限，请参阅《AWS 托管式策略参考》中的 [https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonEC2ReadOnlyAccess.html](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonEC2ReadOnlyAccess.html)**。

## AWS 托管式策略：AmazonEC2ImageReferencesAccessPolicy
<a name="security-iam-awsmanpol-AmazonEC2ImageReferencesAccessPolicy"></a>

您可以将 `AmazonEC2ImageReferencesAccessPolicy` 策略附加到 IAM 身份。此策略授予使用 EC2 DescribeImageReferences API 所需的权限，包括查看 EC2 实例、启动模板、Systems Manager 参数和 Image Builder 配方的权限。该策略支持 `IncludeAllResourceTypes` 标志，并且当 AWS 添加对新资源类型的支持时将继续工作，从而无需进行未来的策略更新。

要查看此策略的权限，请参阅《AWS 托管式策略参考》中的 [https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonEC2ImageReferencesAccessPolicy.html](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonEC2ImageReferencesAccessPolicy.html)**。

## AWS 托管式策略：AWSEC2CapacityReservationFleetRolePolicy
<a name="security-iam-awsmanpol-AWSEC2CapacityReservationFleetRolePolicy"></a>

此策略将附加到名为 **AWSServiceRoleForEC2CapacityReservationFleet** 的服务相关角色，以允许服务代表您在容量预留实例集中创建、修改和取消容量预留。有关更多信息，请参阅 [将服务相关角色用于容量预留实例集使用 EC2 容量管理器的服务相关角色](using-service-linked-roles.md)。

要查看此策略的权限，请参阅《AWS 托管式策略参考》中的 [https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSEC2CapacityReservationFleetRolePolicy.html](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSEC2CapacityReservationFleetRolePolicy.html)**。

## AWS 托管式策略：AWSEC2FleetServiceRolePolicy
<a name="security-iam-awsmanpol-AWSEC2FleetServiceRolePolicy"></a>

此策略将附加到名为 **AWSServiceRoleForEC2Fleet** 的服务相关角色，以允许 EC2 实例集代表您请求、启动、终止和标记实例。有关更多信息，请参阅 [EC2 队列的服务相关角色](ec2-fleet-prerequisites.md#ec2-fleet-service-linked-role)。

要查看此策略的权限，请参阅《AWS 托管式策略参考》中的 [https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSEC2FleetServiceRolePolicy.html](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSEC2FleetServiceRolePolicy.html)**。

## AWS 托管式策略：AWSEC2SpotFleetServiceRolePolicy
<a name="security-iam-awsmanpol-AWSEC2SpotFleetServiceRolePolicy"></a>

此策略将附加到名为 **AWSServiceRoleForEC2SpotFleet** 的服务相关角色，以允许竞价型实例集代表您启动和管理实例。有关更多信息，请参阅 [Spot 队列的服务相关角色](spot-fleet-prerequisites.md#service-linked-roles-spot-fleet-requests)。

要查看此策略的权限，请参阅《AWS 托管式策略参考》中的 [https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSEC2SpotFleetServiceRolePolicy.html](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSEC2SpotFleetServiceRolePolicy.html)**。

## AWS 托管式策略：AWSEC2SpotServiceRolePolicy
<a name="security-iam-awsmanpol-AWSEC2SpotServiceRolePolicy"></a>

此策略将附加到名为 **AWSServiceRoleForEC2Spot** 的服务相关角色，以允许 Amazon EC2 代表您启动和管理 Spot 实例。有关更多信息，请参阅 [竞价型实例请求的服务相关角色](service-linked-roles-spot-instance-requests.md)。

要查看此策略的权限，请参阅《AWS 托管式策略参考》中的 [https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSEC2SpotServiceRolePolicy.html](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSEC2SpotServiceRolePolicy.html)**。

## AWS 托管式策略：AWSEC2VssSnapshotPolicy
<a name="security-iam-awsmanpol-AWSEC2VssSnapshotPolicy"></a>

您可以将此托管策略附加到用于 Amazon EC2 Windows 实例的 IAM 实例配置文件角色。该策略授予允许 Amazon EC2 代表您创建和管理 VSS 快照的权限。

要查看此策略的权限，请参阅《AWS 托管式策略参考》中的 [https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSEC2VssSnapshotPolicy.html](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSEC2VssSnapshotPolicy.html)**。

## AWS 托管式策略：DeclarativePoliciesEC2Report
<a name="security-iam-awsmanpol-DeclarativePoliciesEC2Report"></a>

此策略将附加到名为 `AWSServiceRoleForDeclarativePoliciesEC2Report` 的服务相关角色，以提供对为声明式策略生成账户状态报告所需的只读 API 的访问权限。

要查看此策略的权限，请参阅《AWS 托管式策略参考》中的 [https://docs.aws.amazon.com/aws-managed-policy/latest/reference/DeclarativePoliciesEC2Report.html](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/DeclarativePoliciesEC2Report.html)**。

## AWS 托管式策略：EC2FastLaunchFullAccess
<a name="security-iam-awsmanpol-EC2FastLaunchFullAccess"></a>

您可以将 `EC2FastLaunchFullAccess` 策略附加到实例配置文件或其他 IAM 角色。此策略会授予对 EC2 Fast Launch 操作的完全访问权限以及目标权限，如下所示。

**权限详细信息**
+ **EC2 Fast Launch** – 授予管理访问权限，便于角色启用或禁用 EC2 Fast Launch 并描述 EC2 Fast Launch 映像。
+ **Amazon EC2**：授予对 Amazon EC2 RunInstances、CreateTags，以及启动模版描述、创建和修改操作的访问权限。此外还授予了创建网络和安全组资源、授权入口规则以及删除 EC2 Fast Launch 所创建资源的访问权限。
+ **IAM** – 授予访问权限，以获取和使用名称包含 `ec2fastlaunch` 的实例配置文件，进而创建 EC2FastLaunchServiceRolePolicy 服务相关角色。
+ **CloudFormation**：向 EC2 Fast Launch 授予了描述和创建 CloudFormation 堆栈以及删除所创建堆栈的访问权限。

要查看此策略的权限，请参阅《AWS 托管式策略参考》中的 [https://docs.aws.amazon.com/aws-managed-policy/latest/reference/EC2FastLaunchFullAccess.html](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/EC2FastLaunchFullAccess.html)**。

## AWS 托管式策略：AWSEC2CapacityManagerServiceRolePolicy
<a name="security-iam-awsmanpol-AWSEC2CapacityManagerServiceRolePolicy"></a>

此策略将附加到名为 **AWSServiceRoleForEC2CapacityManager** 的服务相关角色，以允许 EC2 容量管理器代表您管理容量资源并与 AWS Organizations 集成。有关更多信息，请参阅 [EC2 容量管理器的服务相关角色](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-service-linked-roles-cm.html)。

要查看此策略的权限，请参阅《AWS 托管式策略参考》中的 [https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSEC2CapacityManagerServiceRolePolicy.html](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSEC2CapacityManagerServiceRolePolicy.html)**。

## AWS 托管式策略：EC2FastLaunchServiceRolePolicy
<a name="security-iam-awsmanpol-EC2FastLaunchServiceRolePolicy"></a>

此策略将附加到名为 **AWSServiceRoleForEC2FastLaunch** 的服务相关角色，以允许 Amazon EC2 创建和管理一组预置快照，从而减少从启用了 EC2 Fast Launch 的 AMI 启动实例所需的时间。有关更多信息，请参阅 [用于 EC2 Fast Launch 的服务相关角色](slr-windows-fast-launch.md)。

要查看此策略的权限，请参阅《AWS 托管式策略参考》中的 [https://docs.aws.amazon.com/aws-managed-policy/latest/reference/EC2FastLaunchServiceRolePolicy.html](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/EC2FastLaunchServiceRolePolicy.html)**。

## AWS 托管式策略：Ec2InstanceConnect
<a name="Ec2InstanceConnect"></a>

您可以将 `Ec2InstanceConnect` 策略附加到 IAM 身份。此策略授予权限，允许客户调用 EC2 Instance Connect 向其 EC2 实例发布临时密钥并通过 ssh 或 EC2 Instance Connect CLI 进行连接。

要查看此策略的权限，请参阅《AWS 托管式策略参考》中的 [https://docs.aws.amazon.com/aws-managed-policy/latest/reference/EC2InstanceConnect.html](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/EC2InstanceConnect.html)**。

## AWS 托管式策略：Ec2InstanceConnectEndpoint
<a name="Ec2InstanceConnectEndpoint"></a>

此策略附加到名为 **AWSServiceRoleForEC2InstanceConnect** 的服务相关角色，以允许 EC2 Instance Connect 端点代表您执行操作。有关更多信息，请参阅 [EC2 Instance Connect Endpoint 的服务相关角色](eice-slr.md)。

要查看此策略的权限，请参阅《AWS 托管式策略参考》中的 [https://docs.aws.amazon.com/aws-managed-policy/latest/reference/Ec2InstanceConnectEndpoint.html](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/Ec2InstanceConnectEndpoint.html)**。有关此策略更新的说明，请参阅 [AWS 托管策略的 Amazon EC2 更新](#security-iam-awsmanpol-updates)。

## AWS 托管策略的 Amazon EC2 更新
<a name="security-iam-awsmanpol-updates"></a>

查看有关 Amazon EC2 的 AWS 托管策略的更新的详细信息（此服务开始跟踪这些更改）。


| 更改 | 描述 | 日期 | 
| --- | --- | --- | 
|  [AWSEC2CapacityManagerServiceRolePolicy](#security-iam-awsmanpol-AWSEC2CapacityManagerServiceRolePolicy) - 新策略  | Amazon EC2 新增了此策略，以便可以代表您管理容量资源并与 AWS Organizations 集成。 | 2025 年 10 月 15 日 | 
|  [AmazonEC2ImageReferencesAccessPolicy](#security-iam-awsmanpol-AmazonEC2ImageReferencesAccessPolicy)：新策略  | Amazon EC2 添加了此策略，以提供扫描 EC2 DescribeImageReferences API 支持的所有资源类型的权限。 | 2025 年 8 月 26 日 | 
| [Ec2InstanceConnectEndpoint](#Ec2InstanceConnectEndpoint) - 更新的策略 | 为了支持修改现有实例连接端点，Amazon EC2 更新了此策略，以添加分配和取消分配 IPv6 地址的权限，并修改 EC2 实例连接端点创建的网络接口上的安全组。Amazon EC2 还更新了此策略，用 StringLike 条件运算符替换了 Null 条件运算符。 | 2025 年 7 月 31 日 | 
| [EC2FastLaunchServiceRolePolicy](#security-iam-awsmanpol-EC2FastLaunchServiceRolePolicy) - 更新的策略 | 为了防止出现孤立资源，Amazon EC2 对此策略进行了更新，增加了描述卷、卷属性和网络接口的权限，并增加了删除 EC2 Fast Launch 创建的卷和网络接口的权限。 | 2025 年 7 月 17 日 | 
| [EC2FastLaunchFullAccess](#security-iam-awsmanpol-EC2FastLaunchFullAccess) - 更新的策略 | Amazon EC2 对此策略进行了更新，包含了启动模板创建和修改操作的权限，以及创建网络和安全组资源、授权入口规则以及删除 EC2 Fast Launch 所创建资源的权限。此外还可以描述和创建 CloudFormation 堆栈，以及删除 EC2 Fast Launch 创建的堆栈。 | 2025 年 5 月 14 日 | 
| [EC2FastLaunchServiceRolePolicy](#security-iam-awsmanpol-EC2FastLaunchServiceRolePolicy) - 更新的策略 | Amazon EC2 对此策略进行了更新，增加了可让 EC2 Fast Launch 创建和管理事件规则的 Amazon EventBridge 访问权限。此外，EC2 Fast Launch 现在还可以描述 CloudFormation 堆栈，利用关联到 AWS License Manager 的 AMI 启动实例，获取由其创建并且可以停用的 AWS KMS 授权列表，以及删除由其创建的启动模板。 | 2025 年 5 月 14 日 | 
| [AWSEC2CapacityReservationFleetRolePolicy](#security-iam-awsmanpol-AWSEC2CapacityReservationFleetRolePolicy) – 更新了权限 | Amazon EC2 更新了 AWSEC2CapacityReservationFleetRolePolicy 托管式策略，使用 ArnLike 条件运算符，而不是 StringLike 条件运算符。 | 2025 年 3 月 3 日 | 
| [AmazonEC2ReadOnlyAccess](#security-iam-awsmanpol-AmazonEC2ReadOnlyAccess)：添加了权限 | Amazon EC2 添加了一项权限，允许使用 GetSecurityGroupsForVpc 操作检索安全组。 | 2024 年 12 月 27 日 | 
| [EC2FastLaunchFullAccess](#security-iam-awsmanpol-EC2FastLaunchFullAccess)：新策略 | Amazon EC2 添加了此策略，以便在实例中执行与 EC2 Fast Launch 功能相关的 API 操作。对从启用了 EC2 Fast Launch 的 AMI 启动的实例，该策略可以附加到其实例配置文件。 | 2024 年 5 月 14 日 | 
| [AWSEC2VssSnapshotPolicy](#security-iam-awsmanpol-AWSEC2VssSnapshotPolicy)：新策略 | Amazon EC2 添加了 AWSEC2VssSnapshotPolicy 策略，该策略包含创建标签并将标签添加到亚马逊机器映像（AMI）和 EBS 快照的权限。 | 2024 年 3 月 28 日 | 
| [Ec2InstanceConnectEndpoint](#Ec2InstanceConnectEndpoint)：新策略 | Amazon EC2 添加了 Ec2InstanceConnectEndpoint 策略。此策略附加到 AWSServiceRoleForEC2InstanceConnect 服务相关角色，以允许 Amazon EC2 在您创建 EC2 Instance Connect Endpoint 时代表您执行操作。 | 2023 年 1 月 24 日 | 
| [EC2FastLaunchServiceRolePolicy](#security-iam-awsmanpol-EC2FastLaunchServiceRolePolicy)：新策略 | Amazon EC2 添加了 EC2 Fast Launch 功能，如此一来，只需创建一组预置快照，便能让 Windows AMI 更快地启动实例。 | 2021 年 11 月 26 日 | 
| Amazon EC2 开始跟踪更改 | Amazon EC2 已开始跟踪 AWS 托管式策略的更改 | 2021 年 3 月 1 日 | 

# 适用于 Amazon EC2 的 IAM 角色
<a name="iam-roles-for-amazon-ec2"></a>

应用程序必须通过 AWS 凭证签署其 API 请求。因此，如果您是应用程序开发人员，您需要一个策略来为 EC2 实例上运行的应用程序管理凭证。例如，您可以安全地将您的 AWS 凭证分配至实例，从而允许这些实例上的应用程序使用您的凭证签署请求，并保护您的凭证不被其他用户使用。但是，要将凭证安全地分配至每个实例是有难度的，尤其是 AWS 以您的名义创建的实例，例如竞价型实例或自动扩缩组中的实例。当您轮换 AWS 凭证时，您还必须能够更新每项实例上的凭证。

我们设计了 IAM 角色，以便您的应用程序能够安全地从实例发出 API 请求，而无需管理应用程序使用的安全凭证。您可以使用 IAM 角色委托授权以发出 API 请求，而不用创建并分配您的 AWS 凭证，如下所示：

1. 创建一个 IAM 角色。

1. 定义能够担任此角色的账户或 AWS 服务。

1. 定义担任角色后应用程序可以使用的 API 操作和资源。

1. 在您启动实例时指定角色，或者将角色附加到现有实例。

1. 让应用程序检索一组临时证书并使用它们。

例如，您可以使用 IAM 角色为在实例上运行的应用程序授予使用 Amazon S3 中的存储桶所需的权限。您可以通过创建 JSON 格式的策略为 IAM 角色指定权限。这些类似于您为 用户创建的策略。如果您更改了某个角色，系统会将此更改传播到所有实例。

**注意**  
Amazon EC2 IAM 角色凭证不受角色中配置的会话持续时间上限的限制。有关更多信息，请参阅《IAM 用户指南》**中的[担任角色的方法](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_manage-assume.html)。

在创建 IAM 角色时，请关联最低权限 IAM policies，这些策略将限制对应用程序所需的特定 API 调用的访问权限。对于 Windows 到 Windows 的通信，请使用明确定义且良好记录的 Windows 组和角色以授予 Windows 实例之间的应用程序级访问权限。组和角色允许客户定义最低权限的应用程序和 NTFS 文件夹级别的权限，从而限制对应用程序特定的要求的访问。

您只能将一个 IAM 角色附加到实例，但可以将同一角色附加到多个实例。有关创建和使用 IAM 角色的更多信息，请参阅 *IAM 用户指南* 中的[角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)。

您可以将资源级权限应用到您的 IAM 策略，以便控制用户为一个实例附加、替换或分离 IAM 角色的能力。有关更多信息，请参阅 [Amazon EC2 API 操作支持的资源级权限](iam-policies-for-amazon-ec2.md#ec2-supported-iam-actions-resources) 以及以下示例：[示例：使用 IAM 角色](ExamplePolicies_EC2.md#iam-example-iam-roles)。

**Topics**
+ [实例配置文件](#ec2-instance-profile)
+ [使用案例的权限](#generate-policy-for-iam-role)
+ [检索安全凭证](instance-metadata-security-credentials.md)
+ [将角色附加到实例的权限](permission-to-pass-iam-roles.md)
+ [将角色附加到实例](attach-iam-role.md)
+ [实例身份角色](#ec2-instance-identity-roles)

## 实例配置文件
<a name="ec2-instance-profile"></a>

Amazon EC2 使用*实例配置文件* 作为 IAM 角色的容器。使用 IAM 控制台创建 IAM 角色时，控制台自动创建实例配置文件，按相应的角色为文件命名。如果您使用 Amazon EC2 控制台启动一个带 IAM 角色的实例或将一个 IAM 角色附加到实例，则请根据实例配置文件名称列表选择角色。

如果您使用 AWS CLI、API 或 AWS 开发工具包创建角色，则是以单独操作的形式创建角色和实例配置文件，可以为它们提供不同的名称。如果您使用 AWS CLI、API 或 AWS 开发工具包启动带有 IAM 角色的实例，或将 IAM 角色附加到实例，请指定实例配置文件名称。

一个实例配置文件只能包含一个 IAM 角色。您可以将一个 IAM 角色包含在多个实例配置文件中。

要更新实例的权限，请替换其实例配置文件。我们不建议从实例配置文件中移除角色，因为此更改最长需要一小时才会生效。

有关更多信息，请参阅《IAM 用户指南》**中的[使用实例配置文件](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-ec2_instance-profiles.html)。

## 使用案例的权限
<a name="generate-policy-for-iam-role"></a>

首次为应用程序创建 IAM 角色时，有时授予的权限可能超出所需权限。在生产环境中启动应用程序之前，您可以根据 IAM 角色的访问活动生成 IAM 策略。IAM 访问分析器会查看您的 AWS CloudTrail 日志并生成一个策略模板，其中包含角色在指定日期范围内使用的权限。您可以使用模板创建具有精细权限的托管策略，然后将其附加到 IAM 角色。这样，您仅需授予角色与特定使用案例中的 AWS 资源进行交互所需的权限。这可帮助您遵循[授予最低权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege)的最佳实践。有关更多信息，请参阅《IAM 用户指南》**中的 [IAM Access Analyzer 策略生成](https://docs.aws.amazon.com/IAM/latest/UserGuide/access-analyzer-policy-generation.html)。

# 从实例元数据中检索安全凭证
<a name="instance-metadata-security-credentials"></a>

实例上的应用程序通过实例元数据条目 `iam/security-credentials/`*role-name* 检索角色提供的安全证书。该应用程序具有使用您通过与角色关联的安全凭证为其定义的操作和资源的权限。这些安全凭证是临时的，我们会自动更换它们。我们会在旧凭证过期前至少五分钟提供可用的新凭证。

有关实例元数据的更多信息，请参阅 [使用实例元数据管理 EC2 实例](ec2-instance-metadata.md)。

**警告**  
如果您使用的服务采用了带有 IAM 角色的实例元数据，请确保服务代表您进行 HTTP 调用时不会泄露您的凭证。可能泄露您的凭证的服务类型包括 HTTP 代理、HTML/CSS 验证程序服务和支持 XML 包含的 XML 处理程序。

对于您的 Amazon EC2 工作负载，我们建议您使用下述方法检索会话凭证。借助这些凭证，您的工作负载能够发出 AWS API 请求，而无需使用 `sts:AssumeRole` 来代入已与实例关联的相同角色。除非您需要为基于属性的访问权限控制 (ABAC) 传递会话标签或传递会话策略以进一步限制角色的权限，否则您无需调用角色代入，因为此操作会创建一组新的相同临时角色会话凭证。

如果您的工作负载使用某个角色代入自己，则必须创建明确允许该角色代入自己的信任策略。如果您没有创建信任策略，您会收到 `AccessDenied` 错误。有关更多信息，请参阅《IAM 用户指南》**中[更新角色信任策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_update-role-trust-policy.html)。

------
#### [ IMDSv2 ]

**Linux**  
从 Linux 实例运行以下命令，检索某个 IAM 角色的安全凭证。

```
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/iam/security-credentials/role-name
```

**Windows**  
从 Windows 实例运行以下 cmdlet，检索某个 IAM 角色的安全凭证。

```
[string]$token = Invoke-RestMethod `
    -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} `
    -Method PUT -Uri http://169.254.169.254/latest/api/token
```

```
Invoke-RestMethod `
    -Headers @{"X-aws-ec2-metadata-token" = $token} `
    -Method GET -Uri http://169.254.169.254/latest/meta-data/iam/security-credentials/role-name
```

------
#### [ IMDSv1 ]

**Linux**  
从 Linux 实例运行以下命令，检索某个 IAM 角色的安全凭证。

```
curl http://169.254.169.254/latest/meta-data/iam/security-credentials/role-name
```

**Windows**  
从 Windows 实例运行以下 cmdlet，检索某个 IAM 角色的安全凭证。

```
Invoke-RestMethod -uri http://169.254.169.254/latest/meta-data/iam/security-credentials/role-name
```

------

下面是示例输出。如果您无法检索安全凭证，请参阅《IAM 用户指南》**中的[我无法访问我的 EC2 实例的临时安全凭证](https://docs.aws.amazon.com/IAM/latest/UserGuide/troubleshoot_iam-ec2.html#troubleshoot_iam-ec2_no-keys)。

```
{
  "Code" : "Success",
  "LastUpdated" : "2012-04-26T16:39:16Z",
  "Type" : "AWS-HMAC",
  "AccessKeyId" : "ASIAIOSFODNN7EXAMPLE",
  "SecretAccessKey" : "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
  "Token" : "token",
  "Expiration" : "2017-05-17T15:09:54Z"
}
```

对于实例上运行的应用程序、AWS CLI 和 Tools for Windows PowerShell 命令，您无需显式获取临时安全凭证 – AWS开发工具包、AWS CLI 和 Windows PowerShell 工具会自动从 EC2 实例元数据服务中获取凭证并使用这些凭证。要使用临时安全凭证在实例外部发出调用 (例如，为了测试 IAM 策略)，您必须提供访问密钥、私有密钥和会话令牌。有关更多信息，请参阅 *IAM 用户指南*中的[使用临时安全凭证以请求对 AWS 资源的访问权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_use-resources.html)。

# 授予将 IAM 角色附加到实例的权限
<a name="permission-to-pass-iam-roles"></a>

您的 AWS 账户中的身份（例如 IAM 用户）必须具有特定权限才能使用 IAM 角色启动 Amazon EC2 实例、将 IAM 角色附加到实例、替换实例的 IAM 角色或从实例分离 IAM 角色。您必须根据需要授予使用以下 API 操作的权限：
+ `iam:PassRole`
+ `ec2:AssociateIamInstanceProfile`
+ `ec2:DisassociateIamInstanceProfile`
+ `ec2:ReplaceIamInstanceProfileAssociation`

**注意**  
如果您将 `iam:PassRole` 的资源指定为 `*`，这将授予将任何 IAM 角色传递给实例的访问权限。要遵循[最低权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege)的最佳实践，请使用 `iam:PassRole` 指定特定 IAM 角色的 ARN，如以下示例策略所示。

**编程访问策略示例**  
以下 IAM 策略授予使用 IAM 角色启动实例、将 IAM 角色附加到实例或者使用 AWS CLI 或 Amazon EC2 API 替换实例的 IAM 角色的权限。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
         "ec2:RunInstances",
         "ec2:AssociateIamInstanceProfile",
         "ec2:DisassociateIamInstanceProfile",
         "ec2:ReplaceIamInstanceProfileAssociation"
      ],
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": "iam:PassRole",
      "Resource": "arn:aws:iam::123456789012:role/DevTeam*"
    }
  ]
}
```

------

**控制台访问权限的其他要求**  
要授予使用 Amazon EC2 控制台完成相同任务的权限，您还必须包含 `iam:ListInstanceProfiles` API 操作。

# 将 IAM 角色附加到实例
<a name="attach-iam-role"></a>

在启动过程中或启动之后，您可以创建一个 IAM 角色并将其附加到实例。您也可以替换或分离 IAM 角色。

**在实例启动期间创建和附加 IAM 角色（推荐）**

1. 在 EC2 实例启动期间，展开**高级详细信息**。

1. 在 **IAM 实例配置文件**部分中，选择**创建新的 IAM 角色**。

1. 将打开内联角色创建表单，您可以：
   + 指定**角色名称**（例如 `EC2-S3-Access-Role`）
   + 通过选择 AWS 托管式策略或创建自定义策略来为实例定义权限

     例如，要授予 S3 访问权限，请选择 `AmazonS3ReadOnlyAccess` 托管式策略
   + 查看允许 `ec2.amazonaws.com` 代入该角色的信任策略
   + 为元数据添加可选标签

1. 选择**创建角色**。

   系统会自动选择新创建的角色，并在实例启动时通过实例配置文件将其附加到您的实例。

**注意**  
在实例启动期间使用控制台创建角色时，系统会自动创建一个与该角色同名的实例配置文件。实例配置文件是一个容器，用于在启动时将 IAM 角色信息传递给实例。

**重要**  
您只能将一个 IAM 角色附加到一个实例，但可以将同一角色附加到多个实例。
关联具有最低权限的 IAM 策略，从而仅允许访问应用程序所需的特定 API 调用。

有关创建和使用 IAM 角色的更多信息，请参阅 *IAM 用户指南* 中的[角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)。

**在实例启动期间附加现有的 IAM 角色**  
要在启动时使用 Amazon EC2 控制台将现有的 IAM 角色附加到实例，请展开**高级详细信息**。对于 **IAM 实例配置文件**，请从下拉列表中选择该 IAM 角色。

**注意**  
如果您是使用 IAM 控制台创建的 IAM 角色，则为您创建了实例配置文件，并提供了与角色相同的名称。如果使用 AWS CLI、API 或 AWS SDK 创建了 IAM 角色，则可能为实例配置文件指定了与角色不同的名称。

您可以将 IAM 角色附加到正在运行或已停止的实例。如果实例已附加 IAM 角色，则必须将其替换为新的 IAM 角色。

------
#### [ Console ]<a name="attach-iam-role-console"></a>

**将 IAM 角色附加到实例**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 在导航窗格中，选择**实例**。

1. 选择实例。

1. 依次选择 **Actions**（操作）、**Security**（安全）和 **Modify IAM role**（修改 IAM 角色）。

1. 对于 **IAM 角色**，选择 IAM 实例配置文件。

1. 选择**更新 IAM 角色**。

------
#### [ AWS CLI ]
<a name="attach-iam-role-instance-cli"></a>
**将 IAM 角色附加到实例**  
使用 [associate-iam-instance-profile](https://docs.aws.amazon.com/cli/latest/reference/ec2/associate-iam-instance-profile.html) 命令将 IAM 角色附加到该实例。指定实例配置文件时，您可以使用实例配置文件的 Amazon 资源名称（ARN），也可以使用其名称。

```
aws ec2 associate-iam-instance-profile \
    --instance-id i-1234567890abcdef0 \
    --iam-instance-profile Name="TestRole-1"
```

------
#### [ PowerShell ]

**将 IAM 角色附加到实例**  
使用 [Register-EC2IamInstanceProfile](https://docs.aws.amazon.com/powershell/latest/reference/items/Register-EC2IamInstanceProfile.html) cmdlet。

```
Register-EC2IamInstanceProfile `
    -InstanceId i-1234567890abcdef0 `
    -IamInstanceProfile_Name TestRole-1
```

------

要在已附加了 IAM 角色的实例上替换该 IAM 角色，该实例必须处于正在运行状态。如果要更改实例的 IAM 角色而先不分离现有角色，则您可以执行此操作。例如，您可以执行此操作，以确保正在实例上运行的应用程序所执行的 API 操作不会被中断。

------
#### [ Console ]<a name="replace-iam-role-console"></a>

**替换实例的 IAM 角色**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 在导航窗格中，选择**实例**。

1. 选择实例。

1. 依次选择 **Actions**（操作）、**Security**（安全）和 **Modify IAM role**（修改 IAM 角色）。

1. 对于 **IAM 角色**，选择 IAM 实例配置文件。

1. 选择**更新 IAM 角色**。

------
#### [ AWS CLI ]<a name="replace-iam-role-cli"></a>

**替换实例的 IAM 角色**

1. 需要时使用 [describe-iam-instance-profile-associations](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-iam-instance-profile-associations.html) 命令来获取关联 ID。

   ```
   aws ec2 describe-iam-instance-profile-associations \
       --filters Name=instance-id,Values=i-1234567890abcdef0 \
       --query IamInstanceProfileAssociations.AssociationId
   ```

1. 使用 [replace-iam-instance-profile-association](https://docs.aws.amazon.com/cli/latest/reference/ec2/replace-iam-instance-profile-association.html) 命令。指定现有实例配置文件的关联 ID，以及新实例配置文件的 ARN 或名称。

   ```
   aws ec2 replace-iam-instance-profile-association \
       --association-id iip-assoc-0044d817db6c0a4ba \
       --iam-instance-profile Name="TestRole-2"
   ```

------
#### [ PowerShell ]

**替换实例的 IAM 角色**

1. 需要时使用 [Get-EC2IamInstanceProfileAssociation](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2IamInstanceProfileAssociation.html) cmdlet 来获取关联 ID。

   ```
   (Get-EC2IamInstanceProfileAssociation -Filter @{Name="instance-id"; Values="i-0636508011d8e966a"}).AssociationId
   ```

1. 使用 [Set-EC2IamInstanceProfileAssociation](https://docs.aws.amazon.com/powershell/latest/reference/items/Set-EC2IamInstanceProfileAssociation.html) cmdlet。指定现有实例配置文件的关联 ID，以及新实例配置文件的 ARN 或名称。

   ```
   Set-EC2IamInstanceProfileAssociation `
       -AssociationId iip-assoc-0044d817db6c0a4ba `
       -IamInstanceProfile_Name TestRole-2
   ```

------

您可以将 IAM 角色从正在运行或已停止的实例上分离。

------
#### [ Console ]<a name="detach-iam-role-console"></a>

**从实例中分离 IAM 角色**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 在导航窗格中，选择**实例**。

1. 选择实例。

1. 依次选择 **Actions**（操作）、**Security**（安全）和 **Modify IAM role**（修改 IAM 角色）。

1. 对于 **IAM 角色**，请选择**无 IAM 角色**。

1. 选择**更新 IAM 角色**。

1. 提示进行确认时，输入**分离**，然后选择**分离**。

------
#### [ AWS CLI ]<a name="detach-iam-role-cli"></a>

**从实例中分离 IAM 角色**

1. 需要时使用 [describe-iam-instance-profile-associations](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-iam-instance-profile-associations.html)，来获取要替换的 IAM 实例配置文件的关联 ID。

   ```
   aws ec2 describe-iam-instance-profile-associations \
       --filters Name=instance-id,Values=i-1234567890abcdef0 \
       --query IamInstanceProfileAssociations.AssociationId
   ```

1. 使用 [disassociate-iam-instance-profile](https://docs.aws.amazon.com/cli/latest/reference/ec2/disassociate-iam-instance-profile.html) 命令。

   ```
   aws ec2 disassociate-iam-instance-profile --association-id iip-assoc-0044d817db6c0a4ba
   ```

------
#### [ PowerShell ]

**从实例中分离 IAM 角色**

1. 需要时使用 [Get-EC2IamInstanceProfileAssociation](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2IamInstanceProfileAssociation.html)，来获取要分离的 IAM 实例配置文件的关联 ID。

   ```
   (Get-EC2IamInstanceProfileAssociation -Filter @{Name="instance-id"; Values="i-0636508011d8e966a"}).AssociationId
   ```

1. 使用 [Unregister-EC2IamInstanceProfile](https://docs.aws.amazon.com/powershell/latest/reference/items/Unregister-EC2IamInstanceProfile.html) cmdlet。

   ```
   Unregister-EC2IamInstanceProfile -AssociationId iip-assoc-0044d817db6c0a4ba
   ```

------

## Amazon EC2 实例的实例身份角色
<a name="ec2-instance-identity-roles"></a>

您启动的每个 Amazon EC2 实例都有一个代表其身份的*实例身份角色*。实例身份角色是一种 IAM 角色。集成使用实例身份角色的 AWS 服务和功能可以使用它来标识服务的实例。

实例身份角色凭证可通过 `/identity-credentials/ec2/security-credentials/ec2-instance` 的实例元数据服务（IMDS）访问。凭证由 AWS 临时访问密钥对和会话令牌组成。它们用于对使用实例身份角色的 AWS 服务签署 AWS Sigv4 请求。无论实例上是否启用了使用实例身份角色的服务或功能，凭证都存在于实例元数据中。

实例身份角色会在实例启动时自动创建，没有 role-trust 策略文档，并且不受任何身份或资源策略的约束。

### 支持的服务
<a name="iir-supported-services"></a>

以下 AWS 服务使用实例身份角色：
+ **Amazon EC2**：[EC2 Instance Connect](connect-linux-inst-eic.md) 使用实例身份角色来更新 Linux 实例的主机密钥。
+ **Amazon GuardDuty**：[GuardDuty 运行时监控](https://docs.aws.amazon.com/guardduty/latest/ug/runtime-monitoring.html)使用实例身份角色，允许运行时代理向 GuardDuty VPC 端点发送安全遥测数据。
+ **AWS Lambda**：[Lambda 托管实例](https://docs.aws.amazon.com/lambda/latest/dg/lambda-managed-instances.html)使用实例身份角色进行生命周期挂钩、遥测和构件分发。
+ **AWS Security Token Service（AWS STS）**– 实例身份角色凭证可与 AWS STS [https://docs.aws.amazon.com/STS/latest/APIReference/API_GetCallerIdentity.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_GetCallerIdentity.html) 操作结合使用。
+ **AWS Systems Manager** – 使用[默认主机管理配置](https://docs.aws.amazon.com/systems-manager/latest/userguide/fleet-manager-default-host-management-configuration.html)时，AWS Systems Manager 将使用实例身份角色提供的身份来注册 EC2 实例。标识实例后，Systems Manager 可将 `AWSSystemsManagerDefaultEC2InstanceManagementRole` IAM 角色传递给实例。

实例身份角色不能与其他 AWS 服务或功能结合使用，因为其并未与实例身份角色集成。

### 实例身份角色 ARN
<a name="iir-arn"></a>

实例身份角色 ARN 采用以下格式：

```
arn:aws-partition:iam::account-number:assumed-role/aws:ec2-instance/instance-id
```

例如：

```
arn:aws:iam::0123456789012:assumed-role/aws:ec2-instance/i-1234567890abcdef0
```

有关 ARN 的更多信息，请参阅《IAM 用户指南》**中的 [Amazon 资源名称（ARN）](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference-arns.html)。

# Amazon EC2 实例的更新管理
<a name="update-management"></a>

我们建议您定期修补、更新和保护 EC2 实例上的操作系统和应用程序。您可以使用 [AWS Systems Manager Patch Manager](https://docs.aws.amazon.com/systems-manager/latest/userguide/patch-manager.html) 自动执行为操作系统和应用程序安装安全相关更新的过程。

对于自动扩缩组中的 EC2 实例，您可以使用 [https://docs.aws.amazon.com/systems-manager-automation-runbooks/latest/userguide/automation-aws-patchasginstance.html](https://docs.aws.amazon.com/systems-manager-automation-runbooks/latest/userguide/automation-aws-patchasginstance.html) 运行手册以避免正在修补的实例被替换。或者，您也可以使用任何自动更新服务或建议的过程安装应用程序供应商提供的更新。

**资源**
+ **AL2023**：《Amazon Linux 2023 User Guide》**中的 [Updating AL2023](https://docs.aws.amazon.com/linux/al2023/ug/updating.html)
+ **AL2**：《Amazon Linux 2 User Guide》**中的 [Manage software on your Amazon Linux 2 instance](https://docs.aws.amazon.com/linux/al2/ug/managing-software.html)
+ **Windows 实例**：[更新管理](ec2-windows-security-best-practices.md#ec2-windows-update-management)

# Windows 实例的安全最佳实践
<a name="ec2-windows-security-best-practices"></a>

建议您对 Windows 实例遵循以下安全最佳实践。

**Topics**
+ [高级安全最佳实践](#high-level-security)
+ [更新管理](#ec2-windows-update-management)
+ [配置管理](#configuration-management)
+ [变更管理](#change-management)
+ [Amazon EC2 Windows 实例的审计和问责](#audit-accountability)

## 高级安全最佳实践
<a name="high-level-security"></a>

对于 Windows 实例，您应遵循以下高级安全最佳实践：
+ **最小访问权限**：仅授予对受信任的和预期的系统和位置的访问权限。这适用于所有 Microsoft 产品，例如 Active Directory、Microsoft 业务生产力服务器以及基础设施服务（例如远程桌面服务、反向代理服务器、IIS Web 服务器等）。使用 AWS 功能（例如 Amazon EC2 实例安全组、网络访问控制列表 (ACL) 和 Amazon VPC 公有/私有子网）跨架构中的多个位置对安全性进行分层。在 Windows 实例中，客户可以使用 Windows 防火墙在其部署中进一步对深度防御策略进行分层。只安装系统按设计运行所需的操作系统组件和应用程序。将 IIS 等基础设施服务配置为在服务账户下运行，或使用应用程序池身份等功能以跨基础设施本地和远程访问资源。
+ **最低权限**：确定实例和账户执行其功能所需的最低权限集。限制服务器和用户以仅允许这些已定义的权限。使用基于角色的访问控制等技术来减小管理账户的表面面积，并创建最受限的角色来完成任务。使用 NTFS 中的加密文件系统（EFS）等操作系统功能来对敏感数据进行静态加密，并控制应用程序和用户对该数据的访问。
+ **配置管理**：创建一个基准服务器配置，其中包含最新的安全修补程序和基于主机的保护套件，其中包括防病毒、防恶意软件、入侵检测/防护和文件完整性监控。根据当前记录的基准评测每个服务器，以确定和标记任何偏差。确保将每个服务器配置为生成和安全存储适当的日志和审计数据。
+ **更改管理**：创建流程来控制对服务器配置基准进行的更改，并致力于完全自动化的更改流程。此外，通过将 Just Enough Administration (JEA) 与 Windows PowerShell DSC 结合使用来限制对最少所需功能的管理访问。
+ **补丁管理**：实施定期安装补丁、更新和保护 EC2 实例上的操作系统和应用程序的流程。
+ **审计日志**：审计访问权限和对 Amazon EC2 实例进行的所有更改，以验证服务器完整性并确保仅进行授权更改。利用 [IIS 增强日志记录](https://learn.microsoft.com/en-us/iis/get-started/whats-new-in-iis-85/enhanced-logging-for-iis85)等功能来增强默认日志记录功能。AWS 功能（例如 VPC 流日志和 AWS CloudTrail）也可用于审计网络访问权限，包括允许/拒绝的请求和 API 调用。

## 更新管理
<a name="ec2-windows-update-management"></a>

为确保在 Amazon EC2 上运行 Windows Server 时的最佳结果，我们建议您实施以下最佳实践：
+ [Configure Windows Update](#windows-update)
+ [Update drivers](#drivers)
+ [Use the latest Windows AMIs](#AMI)
+ [Test performance before migration](#test)
+ [Update launch agents](#agents)
+ 在安装更新之后重启 Windows 实例。有关更多信息，请参阅 [重启 Amazon EC2 实例](ec2-instance-reboot.md)。

有关如何将 Windows 实例升级或迁移到 Windows Server 新版本的信息，请参阅[将 EC2 Windows 实例升级到更高版本的 Windows Server](serverupgrade.md)。

**配置 Windows 更新**  
默认情况下，从 AWS Windows Server AMI 启动的实例不会通过 Windows 更新接收更新。

**更新 Windows 驱动程序**

维护所有 Windows EC2 实例上的最新驱动程序，以确保在您的实例集中应用最新的问题修复和性能增强。您需要更新 AWS PV、Amazon ENA 和 AWS NVMe 驱动程序，具体取决于您的实例类型。
+ 使用 [SNS 主题](xen-drivers-overview.md#drivers-subscribe-notifications)接收新驱动程序版本的更新。
+ 使用 AWS Systems Manager Automation 运行手册 [AWSSupport-UpgradeWindowsAWSDrivers](https://docs.aws.amazon.com/systems-manager-automation-runbooks/latest/userguide/automation-awssupport-upgradewindowsawsdrivers.html) 跨实例中轻松应用更新。

**使用最新 Windows AMI 启动实例**

AWS 每月发布新的 Windows AMI，其中包含最新的操作系统补丁、驱动程序和启动代理。您应该在启动新实例或构建自己的自定义映像时利用最新的 AMI。
+ 要查看每个版本的 AWS Windows AMI 的更新，请参阅 [AWS Windows AMI 版本历史记录](https://docs.aws.amazon.com/ec2/latest/windows-ami-reference/ec2-windows-ami-version-history.html)。
+ 要使用最新 AMI 进行构建，请参阅[使用 Systems Manager Parameter Store 查询最新的 Windows AMI](https://aws.amazon.com/blogs/mt/query-for-the-latest-windows-ami-using-systems-manager-parameter-store/)。
+ 有关可用于启动数据库实例的专用 Windows AMI 以及合规性强化用例的更多信息，请参阅《AWS Windows AMI Reference》**中的 [Specialized Windows AMIs](https://docs.aws.amazon.com/ec2/latest/windows-ami-reference/specialized-windows-amis.html)。

**在迁移前测试系统/应用程序性能**

将企业应用程序迁移到 AWS 可能涉及很多变量和配置。始终对 EC2 解决方案进行性能测试，以确保：
+ 已正确配置实例类型，包括实例大小、增强联网和租赁（共享或专用）。
+ 实例拓扑适用于工作负载，并在必要时利用高性能功能（如专用租赁、放置组、实例存储卷和裸机）。

**安装最新版本的 EC2Launch v2**  
安装最新的 EC2Launch v2 代理，以确保在您的实例集中应用最新的增强。有关更多信息，请参阅 [安装 EC2Launch v2](ec2launch-v2-install.md)。

如果有混合实例集，或者要继续使用 EC2Launch（Windows Server 2016 和 2019）或 EC2 Config（仅限旧式操作系统）代理，请更新到相应代理的最新版本。

以下 Windows Server 版本和启动代理的组合支持自动更新。您可以在 **Amazon EC2 启动代理**下的 [SSM 快速设置主机管理](https://docs.aws.amazon.com/systems-manager/latest/userguide/quick-setup-host-management.html)控制台中选择自动更新。


| Windows 版本 | EC2Launch v1 | EC2Launch v2 | 
| --- | --- | --- | 
| 2016 | ✓ | ✓ | 
| 2019 | ✓ | ✓ | 
| 2022 |  | ✓ | 
+ 有关更新到 EC2Launch v2 的更多信息，请参阅 [安装最新版本的 EC2Launch v2](ec2launch-v2-install.md)。
+ 有关手动更新 EC2Config 的信息，请参阅 [安装最新版的 EC2Config](UsingConfig_Install.md)。
+ 有关手动更新 EC2Launch 的信息，请参阅 [安装最新版本的 EC2Launch](ec2launch-download.md)。

## 配置管理
<a name="configuration-management"></a>

亚马逊机器映像（AMI）为 Amazon EC2 实例提供了初始配置，其中包括 Windows OS 和可选的客户特定的自定义项，例如应用程序和安全控制。创建包含自定义安全配置基准的 AMI 目录可确保使用标准安全控制启动所有 Windows 实例。可以将安全基准烘焙成 AMI，在启动 EC2 实例时动态引导它，或将它打包为产品，以便通过 AWS Service Catalog 产品组合进行统一分发。有关保护 AMI 的更多信息，请参阅[构建 AMI 的最佳实践](https://docs.aws.amazon.com/marketplace/latest/userguide/best-practices-for-building-your-amis.html)。

每个 Amazon EC2 实例都应遵循组织安全标准。请勿安装任何不需要的 Windows 角色和功能，并安装软件来抵御恶意代码（防病毒软件、防恶意软件、利用缓解）、监控主机完整性并执行入侵检测。配置安全软件来监控和维护 OS 安全设置，保护关键 OS 文件的完整性，并在偏离安全基准时发出警报。考虑实施由 Microsoft、互联网安全中心 (CIS) 或美国国家标准与技术研究院 (NIST) 发布的建议安全配置基准。考虑对特定的应用程序服务器使用其他 Microsoft 工具，例如 [SQL Server 的最佳实践分析器](https://www.microsoft.com/en-us/download/details.aspx?id=29302)。

AWS 客户还可以运行 Amazon Inspector 评估，以改进 Amazon EC2 实例上部署的应用程序的安全性和合规性。Amazon Inspector 将自动评估应用程序以查看是否存在漏洞或偏离最佳实践，并且包含一个知识库，其中包含映射到常见安全合规性标准（例如，PCI DSS）和漏洞定义的几百条规则。内置规则的示例包括检查是否启用了远程根登录或是否安装了易受攻击的软件版本。AWS 安全研究员会定期更新这些规则。

在保护 Windows 实例时，建议您实施 Active Directory 域服务，以便为分布式位置启用可扩展的、安全的且可管理的基础设施。此外，在通过 Amazon EC2 控制台或使用 Amazon EC2 预配置工具（例如 AWS CloudFormation）启动实例后，最好是使用本机操作系统功能（例如 Microsoft Windows PowerShell DSC），以便在发生配置偏差时维护配置状态。

## 变更管理
<a name="change-management"></a>

在启动时将初始安全基准应用于 Amazon EC2 实例后，可以控制正在进行的 Amazon EC2 更改来维护虚拟机的安全性。建立变更管理流程以授权和合并对 AWS 资源（例如，安全组、路由表和网络 ACL）以及操作系统和应用程序配置（例如 Windows 或应用程序修补、软件升级或配置文件更新）进行的更改。

AWS 提供了多种工具来帮助管理对 AWS 资源（包括 AWS CloudTrail、AWS Config、CloudFormation 和 AWS Elastic Beanstalk 以及 Systems Center Operations Manager 和 System Center Virtual Machine Manager 的管理包）进行的更改。请注意，Microsoft 会在每月的第二个星期二（或根据需要）发布 Windows 补丁，而 AWS 将在 Microsoft 发布补丁后五天内更新所有由 AWS 管理的 Windows AMI。因此，必须持续修补所有基准 AMI、使用最新的 AMI ID 更新 CloudFormation 模板和自动扩缩组配置，并实施工具来自动实施运行的实例修补管理。

Microsoft 提供了几个用于管理 Windows 操作系统和应用程序更改的选项。例如，SCCM 提供了环境修改的完整生命周期覆盖。选择相应工具，以便满足业务需求并控制更改如何影响应用程序 SLA、容量、安全性和灾难恢复过程。避免手动更改，并改用自动化配置管理软件或命令行工具（例如 EC2 Run Command 或 Windows PowerShell）来实施脚本化的、可重复的变更流程。要帮助达到此要求，请使用带增强日志记录的堡垒主机来进行与 Windows 实例的所有交互，以确保自动记录所有事件和任务。

## Amazon EC2 Windows 实例的审计和问责
<a name="audit-accountability"></a>

AWS CloudTrail、AWS Config 和 AWS Config 规则 提供了审计和更改跟踪功能来审计 AWS 资源更改。将 Windows 事件日志配置为将本地日志文件发送到集中式日志管理系统，以便保留日志数据来进行安全和操作行为分析。Microsoft System Center Operations Manager (SCOM) 聚合有关部署到 Windows 实例的 Microsoft 应用程序的信息，并根据应用程序角色和服务来应用预配置的规则集和自定义规则集。System Center Management Packs 基于 SCOM 而构建，旨在提供特定于应用程序的监控和配置准则。这些[管理包](https://learn.microsoft.com/en-us/archive/technet-wiki/16174.microsoft-management-packs)支持 Windows Server Active Directory、SharePoint Server 2013、Exchange Server 2013、Lync Server 2013、SQL Server 2014 和许多其他的服务器和技术。

除了 Microsoft 系统管理工具之外，客户还可以使用 Amazon CloudWatch 监控实例 CPU 利用率、磁盘性能、网络 I/O 以及执行主机和实例状态检查。EC2Config、EC2Launch 和 EC2Launch v2 启动代理提供对 Windows 实例的其他高级功能的访问。例如，它们可以将 Windows 系统、安全性、应用程序和 Internet Information Services (IIS) 日志导出到 CloudWatch Logs，这些日志随后可与 Amazon CloudWatch 指标和警报集成。此外，客户可以创建脚本来将 Windows 性能计数器导出到 Amazon CloudWatch 自定义指标。

# Amazon EC2 密钥对和 Amazon EC2 实例
<a name="ec2-key-pairs"></a>

密钥对（由公有密钥和私有密钥组成）是一组安全凭证，可在连接到 Amazon EC2 实例时用来证明您的身份。对于 Linux 实例，私有密钥可使您安全地 SSH 到您的实例。对于 Windows 实例，需要用私有密钥才能解密管理员密码，然后您可以使用该密码连接到您的实例。

Amazon EC2 在您的实例上存储公有密钥，您需要存储私有密钥，如下图所示。重要的是，您要将您的私有密钥存储在一个安全的位置，因为拥有您的私有密钥的任何人都可以连接到使用密钥对的实例。

![\[密钥对包含您的计算机的私有密钥，以及您的实例的公有密钥。\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/images/ec2-key-pair.png)


启动实例时，您可以[指定密钥对](ec2-instance-launch-parameters.md#liw-key-pair)，这样便可使用需要密钥对的方法连接到您的实例。根据安全管理方式的不同，您可以为所有实例指定相同的密钥对，也可以指定不同的密钥对。

对于 Linux 实例，实例首次启动时，您在启动时指定的公有密钥将放在 Linux 实例 `~/.ssh/authorized_keys` 内的条目中。在使用 SSH 连接到 Linux 实例时，要进行登录，您必须指定与公有密钥对应的私有密钥。

有关连接到 EC2 实例的更多信息，请参阅 [连接到您的 EC2 实例](connect.md)。

**重要**  
由于 Amazon EC2 不保存私有密钥的副本，因此，如果您丢失私有密钥，则无法恢复它。但是，仍可通过一种方法连接到丢失了密钥对的实例。有关更多信息，请参阅 [我丢失了私有密钥。如何连接到我的实例？](TroubleshootingInstancesConnecting.md#replacing-lost-key-pair)。

作为密钥对的替代，您可以使用 [AWS Systems Manager Session Manager](https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager.html)，通过基于浏览器的交互式、一键式 Shell 或 AWS Command Line Interface（AWS CLI）连接到您的实例。

**Topics**
+ [为您的 Amazon EC2 实例创建密钥对](create-key-pairs.md)
+ [描述密钥对](describe-keys.md)
+ [删除您的密钥对](delete-key-pair.md)
+ [在 Linux 实例上添加或更换公有密钥](replacing-key-pair.md)
+ [验证您的密钥对的指纹](verify-keys.md)

# 为您的 Amazon EC2 实例创建密钥对
<a name="create-key-pairs"></a>

您可以使用 Amazon EC2 创建密钥对，或者可以使用第三方工具创建密钥对，然后将它们导入 Amazon EC2。

Amazon EC2 支持适用于 Linux 和 Windows 实例的 2048 位 SSH-2 RSA 密钥。Amazon EC2 还支持 Linux 实例的 ED25519 密钥。

有关在创建密钥对后如何连接到实例的说明，请参阅[使用 SSH 连接到 Linux 实例](connect-to-linux-instance.md)和[使用 RDP 连接到 Windows 实例](connecting_to_windows_instance.md)。

**Topics**
+ [使用 Amazon EC2 创建密钥对](#having-ec2-create-your-key-pair)
+ [使用 AWS CloudFormation 创建密钥对](#create-key-pair-cloudformation)
+ [使用第三方工具创建密钥对，并将公有密钥导入 Amazon EC2](#how-to-generate-your-own-key-and-import-it-to-aws)

## 使用 Amazon EC2 创建密钥对
<a name="having-ec2-create-your-key-pair"></a>

当您使用 Amazon EC2 创建密钥对时，公有密钥将存储在 Amazon EC2 中，您需要存储私有密钥。

您最多可以为每个区域创建 5000 个密钥对。要申请增加，请创建支持案例。有关更多信息，请参阅 *支持 用户指南*中的[创建支持案例](https://docs.aws.amazon.com/awssupport/latest/user/case-management.html#creating-a-support-case)。

------
#### [ Console ]

**要使用 Amazon EC2 创建密钥对**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 在导航窗格中的 **Network & Security** 下，选择 **Key Pairs**。

1. 选择 **Create key pair (创建密钥对)**。

1. 对于 **Name (名称)**，为模板输入一个描述性名称。Amazon EC2 将公有密钥与您指定的密钥名称相关联。密钥名称最多可包含 255 个 ASCII 字符。它不能包含前导空格或尾随空格。

1. 选择适合您操作系统的密钥对类型：

   （Linux 实例）对于**密钥对类型**，选择 **RSA** 或者 **ED25519**。

   （Windows 实例）对于**密钥对类型**，请选择 **RSA**。Windows 实例不支持 **ED25519** 密钥。

1. 对于 **Private key file format**（私有密钥文件格式），选择要保存私有密钥的格式。要以可与 OpenSSH 一起使用的格式保存私有密钥，请选择 **pem**。要以可与 PuTTY 一起使用的格式保存私有密钥，请选择 **ppk**。

1. 要添加标签到公有密钥，请选择 **Add tag**（添加标签），然后输入标签的键和值。对每个标签重复此操作。

1. 选择 **Create key pair (创建密钥对)**。

1. 您的浏览器会自动下载私有密钥文件。基本文件名是指定为密钥对名称的名称，文件扩展名由您选择的文件格式确定。将私有密钥文件保存在安全位置。
**重要**  
这是您保存私有密钥文件的唯一机会。

1. 如果您计划在 macOS 或 Linux 计算机上使用 SSH 客户端连接到 Linux 实例，请使用以下命令设置私有密钥文件的权限，以确保只有您可以读取该文件。

   ```
   chmod 400 key-pair-name.pem
   ```

   如果不设置这些权限，则无法使用此密钥对连接到实例。有关更多信息，请参阅 [错误：未保护的私有密钥文件](TroubleshootingInstancesConnecting.md#troubleshoot-unprotected-key)。

------
#### [ AWS CLI ]

**要使用 Amazon EC2 创建密钥对**

1. 按如下方式使用 [https://docs.aws.amazon.com/cli/latest/reference/ec2/create-key-pair.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/create-key-pair.html) 命令生成密钥对，并将私有密钥保存到 `.pem` 文件中。`--query` 选项会将私有密钥材料打印到输出中。`--output` 选项会将私有密钥材料保存到指定的文件中。扩展名应为 `.pem` 或 `.ppk`，具体取决于密钥格式。私有密钥名称可以与公有密钥名称不同，但为方便起见，建议使用相同的名称。

   ```
   aws ec2 create-key-pair \
       --key-name my-key-pair \
       --key-type rsa \
       --key-format pem \
       --query "KeyMaterial" \
       --output text > my-key-pair.pem
   ```

1. 如果您计划在 macOS 或 Linux 计算机上使用 SSH 客户端连接到 Linux 实例，请使用以下命令设置私有密钥文件的权限，以确保只有您可以读取该文件。

   ```
   chmod 400 key-pair-name.pem
   ```

   如果不设置这些权限，则无法使用此密钥对连接到实例。有关更多信息，请参阅 [错误：未保护的私有密钥文件](TroubleshootingInstancesConnecting.md#troubleshoot-unprotected-key)。

------
#### [ PowerShell ]

**要使用 Amazon EC2 创建密钥对**  
按如下所示使用 [https://docs.aws.amazon.com/powershell/latest/reference/items/New-EC2KeyPair.html](https://docs.aws.amazon.com/powershell/latest/reference/items/New-EC2KeyPair.html) cmdlet 生成密钥，并将其保存到 `.pem` 或 `.ppk` 文件中。**Out-File** cmdlet 会将私有密钥材料保存到具有指定扩展名的文件中。扩展名应为 `.pem` 或 `.ppk`，具体取决于密钥格式。私有密钥名称可以与公有密钥名称不同，但为方便起见，建议使用相同的名称。

```
(New-EC2KeyPair `
    -KeyName "my-key-pair" `
    -KeyType "rsa" `
    -KeyFormat "pem").KeyMaterial | Out-File -Encoding ascii -FilePath C:\path\my-key-pair.pem
```

------

## 使用 AWS CloudFormation 创建密钥对
<a name="create-key-pair-cloudformation"></a>

当您使用 CloudFormation 创建新的密钥对时，私有密钥会保存到 AWS Systems Manager Parameter Store。参数名称有以下形式：

```
/ec2/keypair/key_pair_id
```

有关更多信息，请参阅《AWS Systems Manager 用户指南》**中的 [AWS Systems Manager Parameter Store](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html)。

**使用 CloudFormation 创建密钥对**

1. 在您的模板中指定 [AWS::EC2::KeyPair](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-keypair.html) 资源。

   ```
   Resources:
     NewKeyPair:
       Type: 'AWS::EC2::KeyPair'
       Properties: 
         KeyName: new-key-pair
   ```

1. 按如下方式使用 [https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-key-pairs.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-key-pairs.html) 命令获取密钥对的 ID。

   ```
   aws ec2 describe-key-pairs --filters Name=key-name,Values=new-key-pair --query KeyPairs[*].KeyPairId --output text
   ```

   下面是示例输出。

   ```
   key-05abb699beEXAMPLE
   ```

1. 按如下方式使用 [https://docs.aws.amazon.com/cli/latest/reference/ssm/get-parameter.html](https://docs.aws.amazon.com/cli/latest/reference/ssm/get-parameter.html) 命令获取密钥的参数，并将密钥材料保存在 `.pem` 文件中。

   ```
   aws ssm get-parameter --name /ec2/keypair/key-05abb699beEXAMPLE --with-decryption --query Parameter.Value --output text > new-key-pair.pem
   ```

**所需的 IAM 权限**

要启用 CloudFormation 以代表您管理 Parameter Store 参数，由 CloudFormation 或您用户担任的 IAM 角色必须拥有以下权限：
+ `ssm:PutParameter` – 授予权限以创建私有密钥材料的参数。
+ `ssm:DeleteParameter` – 授予权限以删除存储私有密钥材料的参数。无论密钥对是由 CloudFormation 导入还是创建的，都需要此权限。

当 CloudFormation 删除由堆栈创建或导入的密钥对时，它会执行权限检查，以确定您是否有权删除参数，即使 CloudFormation 仅在创建密钥对而非导入密钥对时才创建参数。CloudFormation 使用与您账户中的任何参数都不匹配的虚构参数名称测试所需的权限。因此，您可能会在 `AccessDeniedException` 错误消息中看到虚构的参数名称。

## 使用第三方工具创建密钥对，并将公有密钥导入 Amazon EC2
<a name="how-to-generate-your-own-key-and-import-it-to-aws"></a>

如果不使用 Amazon EC2 创建密钥对，则可以使用第三方工具创建一个 RSA 或 ED25519 密钥对，然后将公有密钥导入 Amazon EC2。

**密钥对的要求**
+ 支持的类型：
  + （Linux 和 Windows）RSA
  + （仅限 Linux）ED25519
**注意**  
Windows 实例不支持 ED25519 密钥。
  + Amazon EC2 不接受 DSA 密钥。
+ 支持的格式：
  + OpenSSH 公有密钥格式（对于 Linux，格式为 `~/.ssh/authorized_keys`）。
  + （仅限 Linux）如果您在使用 EC2 Instance Connect API 时使用 SSH 进行连接，则也支持 SSH2 格式。
  + SSH 私有密钥文件格式必须为 PEM 或 PPK
  + （仅 RSA）Base64 编码的 DER 格式
  + （仅 RSA）SSH 公有密钥文件格式如 [RFC 4716](https://www.ietf.org/rfc/rfc4716.txt) 所指定
+ 支持的长度：
  + 1024、2048 和 4096。
  + （仅限 Linux）如果您在使用 EC2 Instance Connect API 时使用 SSH 进行连接，则支持的长度为 2048 和 4096。

**要使用第三方工具创建密钥对**

1. 使用您选择的第三方工具生成密钥对。例如，您可以使用 **ssh-keygen**（通过标准 OpenSSH 安装提供的工具）。也可以使用 Java、Ruby、Python 以及多种其他提供标准库的编程语言来创建密钥对。
**重要**  
私有密钥必须采用 PEM 或 PPK 格式。例如，使用 `ssh-keygen -m PEM` 生成 PEM 格式的 OpenSSH 密钥。

1. 将公有密钥保存至本地文件。例如，`~/.ssh/my-key-pair.pub`（Linux、macOS）或 `C:\keys\my-key-pair.pub`（Windows）。此文件的文件扩展名并不重要。

1. 将私有密钥保存至扩展名为 `.pem` 或 `.ppk` 的本地文件。例如，`~/.ssh/my-key-pair.pem` 或 `~/.ssh/my-key-pair.ppk`（Linux、macOS）或 `C:\keys\my-key-pair.pem` 或 `C:\keys\my-key-pair.ppk`（Windows）。文件扩展名很重要，因为根据您用来连接实例的工具不同，您将需要特定的文件格式。OpenSSH 需要一个 `.pem` 文件，而 PuTTY 需要一个 `.ppk` 文件。
**重要**  
将私有密钥文件保存在安全位置。当您启动实例时，您将需要提供公有密钥的名称；当您每次连接到实例时，您将需要提供相应的私有密钥。

创建密钥对后，使用以下方法之一将公有密钥导入到 Amazon EC2。

------
#### [ Console ]

**要将公有密钥导入至 Amazon EC2**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 在导航窗格中，选择 **Key Pairs (密钥对)**。

1. 选择 **Import key pair (导入密钥对)**。

1. 对于 **Name**（名称），为公有密钥输入一个描述性名称。该名称最多可包含 255 个 ASCII 字符。它不能包含前导空格或尾随空格。
**注意**  
当您从 EC2 控制台连接到实例时，控制台会建议使用此名称作为私有密钥文件的名称。

1. 选择 **Browse (浏览)** 以导航到您的公有密钥并选择它，或者将公有密钥的内容粘贴到 **Public key contents (公有密钥内容)** 字段中。

1. 选择 **Import key pair (导入密钥对)**。

1. 验证您导入的公有密钥是否显示在密钥对列表中。

------
#### [ AWS CLI ]

**要将公有密钥导入至 Amazon EC2**  
使用 [https://docs.aws.amazon.com/cli/latest/reference/ec2/import-key-pair.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/import-key-pair.html) 命令。

```
aws ec2 import-key-pair \
    --key-name my-key-pair \
    --public-key-material fileb://path/my-key-pair.pub
```

**验证密钥对是否已成功导入**  
使用 [https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-key-pairs.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-key-pairs.html) 命令。

```
aws ec2 describe-key-pairs --key-names my-key-pair
```

------
#### [ PowerShell ]

**要将公有密钥导入至 Amazon EC2**  
使用 [https://docs.aws.amazon.com/powershell/latest/reference/items/Import-EC2KeyPair.html](https://docs.aws.amazon.com/powershell/latest/reference/items/Import-EC2KeyPair.html) cmdlet。

```
$publickey=[Io.File]::ReadAllText("C:\Users\TestUser\.ssh\id_rsa.pub")
Import-EC2KeyPair `
    -KeyName my-key-pair `
    -PublicKey $publickey
```

**验证密钥对是否已成功导入**  
使用 [https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2KeyPair.html](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2KeyPair.html) cmdlet。

```
Get-EC2KeyPair -KeyName my-key-pair
```

------

# 描述密钥对
<a name="describe-keys"></a>

您可以描述存储在 Amazon EC2 中的密钥对。您还可以检索公有密钥材料并识别启动时指定的公有密钥。

**Topics**
+ [描述密钥对](#describe-public-key)
+ [检索公有密钥材料](#retrieving-the-public-key)
+ [确定启动时指定的公有密钥](#identify-key-pair-specified-at-launch)

## 描述密钥对
<a name="describe-public-key"></a>

您可以查看有关存储在 Amazon EC2 中的公有密钥的以下信息：公有密钥名称、ID、密钥类型、指纹、公有密钥材料、Amazon EC2 创建密钥的日期和时间（采用 UTC 时区）（如果密钥是由第三方工具创建的，则是将该密钥导入 Amazon EC2 的日期和时间），以及与该公有密钥相关联的所有标签。

------
#### [ Console ]

**查看有关密钥对的信息**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 在左侧导航器中，选择 **Key Pairs**（密钥对）。

1. 您可以在**Key pairs**（密钥对）表中查看每个公有密钥的相关信息。  
![\[密钥对表。\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/images/key-pairs-describe-console.png)

1. 要查看公有密钥的标签，请选中密钥旁边的复选框，然后选择**操作**、**管理标签**。

------
#### [ AWS CLI ]

**查看有关密钥对的信息**  
使用 [https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-key-pairs.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-key-pairs.html) 命令。

```
aws ec2 describe-key-pairs --key-names key-pair-name
```

------
#### [ PowerShell ]

**查看有关密钥对的信息**  
使用 [https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2KeyPair.html](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2KeyPair.html) cmdlet。

```
Get-EC2KeyPair -KeyName key-pair-name
```

------

## 检索公有密钥材料
<a name="retrieving-the-public-key"></a>

您可以获取密钥对的公有密钥材料。以下是一个示例公有密钥。请注意，添加的换行符是为了提高可读性。

```
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQClKsfkNkuSevGj3eYhCe53pcjqP3maAhDFcvBS7O6V
hz2ItxCih+PnDSUaw+WNQn/mZphTk/a/gU8jEzoOWbkM4yxyb/wB96xbiFveSFJuOp/d6RJhJOI0iBXr
lsLnBItntckiJ7FbtxJMXLvvwJryDUilBMTjYtwB+QhYXUMOzce5Pjz5/i8SeJtjnV3iAoG/cQk+0FzZ
qaeJAAHco+CY/5WrUBkrHmFJr6HcXkvJdWPkYQS3xqC0+FmUZofz221CBt5IMucxXPkX4rWi+z7wB3Rb
BQoQzd8v7yeb7OzlPnWOyN0qFU0XA246RA8QFYiCNYwI3f05p6KLxEXAMPLE
```

------
#### [ Private key ]

**使用 ssh-keygen 检索公有密钥材料（Linux）**  
在本地 Linux 或 macOS 计算机上，使用 **ssh-keygen** 命令。指定您已在其中下载私有密钥的路径（`.pem` 文件）。

```
ssh-keygen -y -f /path_to_key_pair/my-key-pair.pem
```

如果此 **ssh-keygen** 命令运行失败，请运行以下 **chmod** 命令，确保私有密钥文件具有所需的权限。

```
chmod 400 key-pair-name.pem
```

**使用 PuTTYgen 检索公有密钥材料（Windows）**  
在本地 Windows 计算机上，启动 PuTTYgen。选择 **Load**（加载）。选择 `.ppk` 或者 `.pem` 私有密钥文件。PuTTYgen 在 **Public key for pasting into OpenSSH authorized\$1keys file (粘贴到 OpenSSH authorized\$1keys 文件的公有密钥)** 下方显示公有密钥。也可以通过以下方式查看公有密钥：选择 **Save public key (保存公有密钥)**，请指定文件的名称，然后打开文件。

------
#### [ AWS CLI ]

**检索公有密钥材料**  
使用以下 [describe-key-pairs](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-key-pairs.html) 命令并指定 `--include-public-key` 选项。

```
aws ec2 describe-key-pairs \
    --key-names key-pair-name \
    --include-public-key \
    --query "KeyPairs[].PublicKey"
```

------
#### [ PowerShell ]

**检索公有密钥材料**  
使用 [Get-EC2KeyPair](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2KeyPair.html) cmdlet。

```
(Get-EC2KeyPair -KeyName key-pair-name -IncludePublicKey $true).PublicKey
```

------
#### [ IMDSv2 ]

**Linux**  
在 Linux 实例上运行以下命令。

```
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/public-keys/0/openssh-key
```

**Windows**  
在 Windows 实例上运行以下 cmdlet。

```
[string]$token = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} -Method PUT -Uri http://169.254.169.254/latest/api/token
```

```
Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key
```

------
#### [ IMDSv1 ]

**Linux**  
在 Linux 实例上运行以下命令。

```
curl http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key
```

**Windows**  
在 Windows 实例上运行以下 cmdlet。

```
Invoke-RestMethod -uri  http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key
```

------

## 确定启动时指定的公有密钥
<a name="identify-key-pair-specified-at-launch"></a>

如果您在启动实例时指定公有密钥，则该实例将记录公有密钥名称。即使更改了实例上的公有密钥或添加了公有密钥，报告的实例公有密钥对名称也不会更改。

------
#### [ Console ]

**识别在实例启动时指定的公有密钥**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 在导航窗格中，选择**实例**。

1. 选择实例。

1. 在**详细信息**选项卡的**实例详细信息**下，找到**启动时分配的密钥对**。

------
#### [ AWS CLI ]

**识别在实例启动时指定的公有密钥**  
使用以下 [describe-instances](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instances.html) 命令。

```
aws ec2 describe-instances \
    --instance-id i-1234567890abcdef0 \
    --query "Reservations[].Instances[].KeyName" \
    --output text
```

下面是示例输出。

```
key-pair-name
```

------
#### [ PowerShell ]

**识别在实例启动时指定的公有密钥**  
使用 [Get-EC2Instance](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2Instance.html) cmdlet。

```
(Get-EC2Instance -InstanceId i-1234567890abcdef0).Instances | Select KeyName
```

下面是示例输出。

```
KeyName
-------
key-pair-name
```

------

# 删除您的密钥对
<a name="delete-key-pair"></a>

您可以删除密钥对，这将移除存储在 Amazon EC2 中的公有密钥。删除密钥对不会删除匹配的私有密钥。

使用以下方法删除公有密钥时，您仅删除了[创建](create-key-pairs.md#having-ec2-create-your-key-pair)或[导入](create-key-pairs.md#how-to-generate-your-own-key-and-import-it-to-aws)密钥对时在 Amazon EC2 中存储的公有密钥。删除公有密钥并不会从您添加公有密钥的任何实例中删除公有密钥，无论是在启动实例时还是启动后。也不会删除本地计算机上的私有密钥。您可以继续连接到使用已从 Amazon EC2 删除的公有密钥启动的实例，只要您仍然拥有私有密钥（`.pem`）文件。

**重要**  
如果您使用的是自动扩缩组（例如，在 Elastic Beanstalk 环境中），请确保您要删除的公有密钥未在关联的启动模板或启动配置中指定。如果 Amazon EC2 Auto Scaling 检测到运行不正常的实例，它将启动替代实例。但是，如果找不到公有密钥，则实例启动失败。有关更多信息，请参阅《Amazon EC2 Auto Scaling 用户指南》**中的[启动模板](https://docs.aws.amazon.com/autoscaling/ec2/userguide/launch-templates.html)。

------
#### [ Console ]

**要在 Amazon EC2 上删除您的公有密钥**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 在导航窗格中，选择 **Key Pairs (密钥对)**。

1. 选择要删除的密钥对，然后依次选择 **Actions**（操作）、**Delete**（删除）。

1. 在确认字段中，输入 `Delete`，然后选择 **Delete (删除)**。

------
#### [ AWS CLI ]

**要在 Amazon EC2 上删除您的公有密钥**  
使用 [https://docs.aws.amazon.com/cli/latest/reference/ec2/delete-key-pair.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/delete-key-pair.html) 命令。

```
aws ec2 delete-key-pair --key-name my-key-pair
```

------
#### [ PowerShell ]

**要在 Amazon EC2 上删除您的公有密钥**  
使用 [https://docs.aws.amazon.com/powershell/latest/reference/items/Remove-EC2KeyPair.html](https://docs.aws.amazon.com/powershell/latest/reference/items/Remove-EC2KeyPair.html) cmdlet。

```
Remove-EC2KeyPair -KeyName my-key-pair
```

------

# 在 Linux 实例上添加或更换公有密钥
<a name="replacing-key-pair"></a>


|  | 
| --- |
| 如果您丢失了私有密钥，则无法访问任何使用该密钥对的实例。有关使用与您在启动时指定的密钥对不同的密钥对连接到实例的更多信息，请参阅[我丢失了私有密钥](TroubleshootingInstancesConnecting.md#replacing-lost-key-pair)。 | 

启动实例时，您可以[指定密钥对](ec2-instance-launch-parameters.md#liw-key-pair)。如果您在启动时指定密钥对，当您的实例首次启动时，公有密钥将放置在 `~/.ssh/authorized_keys` 内的一个条目中的 Linux 实例中。使用 SSH 初次连接到 Linux 实例时，您需要指定默认用户和与存储在 Linux 实例上的公有密钥对应的私有密钥。

连接到实例后，您可以更改用于访问实例默认系统账户的密钥对，方法是在实例上添加新的公有密钥，或者替换实例上的公有密钥（删除现有公有密钥并添加新的公有密钥）。您还可以从实例中删除所有公有密钥。

您可能会出于以下原因添加或替换密钥对：
+ 如果组织中有用户需要使用单独的密钥访问系统用户，您可以将此公有密钥添加到实例。
+ 如果某人有私有密钥的副本（`.pem` 文件），而您想要防止他们连接到实例（例如在他们已离开企业的情况下），您可以删除实例上的公有密钥，并将其替换为新的密钥。
+ 如果您从实例创建 Linux AMI，则公有密钥材料将从实例复制到 AMI。如果您从 AMI 启动实例，则新实例将包含来自原始实例的公有密钥。要防止拥有私有密钥的用户连接到新实例，您可以在创建 AMI *之前*从原始实例中删除公有密钥。

使用以下程序修改默认用户的密钥对，例如 `ec2-user`。有关向实例添加用户的信息，请参阅实例上的操作系统的文档。

**添加或替换密钥对**

1. 使用 [Amazon EC2 控制台](create-key-pairs.md#having-ec2-create-your-key-pair)或[第三方工具](create-key-pairs.md#how-to-generate-your-own-key-and-import-it-to-aws)创建新的密钥对。

1. 从新密钥对检索公有密钥。有关更多信息，请参阅 [检索公有密钥材料](describe-keys.md#retrieving-the-public-key)。

1. [连接到您的 实例](connect-to-linux-instance.md)。

1. 在实例上，使用您选择的文本编辑器，打开 `.ssh/authorized_keys` 文件。将新密钥对的公有密钥信息粘贴到现有公有密钥信息下，然后保存该文件。

1. 从实例断开连接。测试您是否可以使用新密钥对的私有密钥文件连接到实例。

1. 如果您使用 Auto Scaling、EC2 实例集或启动模板来启动实例，请检查您要替换的密钥对是否在启动模板或启动配置中已指定。如果未指定，实例启动将失败。

1. (可选) 如果您要替换现有密钥对，请连接到实例并从 `.ssh/authorized_keys` 文件中删除原始密钥对的公有密钥信息。

**要从实例中删除公有密钥**

1. [连接到您的实例](connect-to-linux-instance.md)。

1. 使用您选择的文本编辑器，在实例上打开 `.ssh/authorized_keys` 文件。删除公有密钥信息，然后保存该文件。

**警告**  
如果从实例中删除所有公有密钥并断开与实例的连接，除非配置了其他登录方式，否则将无法再次连接该实例。

# 验证您的密钥对的指纹
<a name="verify-keys"></a>

要验证您的密钥对的指纹，请将在 Amazon EC2 控制台的**密钥对**页面上显示的或由 [describe-key-pairs](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-key-pairs.html) 命令返回的指纹与您在本地计算机上使用私有密钥生成的指纹进行比较。这些指纹应该一致。

当 Amazon EC2 计算指纹时，Amazon EC2 可能会用 `=` 字符在指纹上添加填充。**ssh-keygen** 等其他工具可能会省略此填充。

如果您尝试验证 Linux EC2 实例的指纹，而不是密钥对的指纹，则请参阅[获取实例指纹](connection-prereqs-general.md#connection-prereqs-fingerprint)。

## 指纹如何计算
<a name="how-ec2-key-fingerprints-are-calculated"></a>

Amazon EC2 使用不同的哈希函数来计算 RSA 和 ED25519 密钥对的指纹。此外，对于 RSA 密钥对，Amazon EC2 使用不同的哈希函数以不同方式计算指纹，具体取决于密钥对是由 Amazon EC2 创建还是导入到 Amazon EC2 的。

下表所列的哈希函数用于计算由 Amazon EC2 创建以及导入到 Amazon EC2 的 RSA 和 ED25519 密钥对的指纹。


**（Linux 实例）用于计算指纹的哈希函数**  

| 密钥对来源 | RSA 密钥对（Windows 和 Linux） | ED25519 密钥对（Linux） | 
| --- | --- | --- | 
| 由 Amazon EC2 创建 | SHA-1 | SHA-256 | 
| 导入到 Amazon EC2 | MD5¹ | SHA-256 | 

¹ 如果您将公有的 RSA 密钥导入到 Amazon EC2，系统会使用 MD5 哈希函数计算指纹。无论您如何创建密钥对（例如，通过使用第三方工具或者从使用 Amazon EC2 创建的现有私有密钥生成新的公有密钥），都是如此。

## 在不同区域使用相同的密钥对时
<a name="when-using-same-key-pair-in-different-regions"></a>

如果您计划使用相同的密钥对连接到不同 AWS 区域 中的实例，必须将公有密钥导入到将在其中使用公有密钥的所有区域。如果使用 Amazon EC2 创建密钥对，您可以 [检索公有密钥材料](describe-keys.md#retrieving-the-public-key) 以便将公有密钥导入到其他区域。

**注意**  
如果您使用 Amazon EC2 创建 RSA 密钥对，然后从 Amazon EC2 私有密钥生成公有密钥，则导入的公有密钥的指纹将与原始公有密钥不同。这是因为使用 Amazon EC2 创建的原始 RSA 密钥的指纹是使用 SHA-1 哈希函数计算的，而导入的 RSA 密钥的指纹则使用 MD5 哈希函数计算。
对于 ED25519 密钥对，无论它们是由 Amazon EC2 创建还是导入到 Amazon EC2 的，指纹都将相同，因为两种情况下都使用相同的 SHA-256 哈希函数来计算指纹。

## 从私有密钥生成指纹
<a name="generate-fingerprint-from-private-key"></a>

使用以下命令之一可从本地机器上的私有密钥生成指纹。

如果您使用的是 Windows 本地计算机，您可以使用 Windows Subsystem for Linux (WSL) 运行以下命令。按照[如何使用 WSL 在 Windows 上安装 Linux](https://learn.microsoft.com/en-us/windows/wsl/install) 中的说明来安装 WSL 和 Linux 发行版。说明中的示例安装的是 Linux 的 Ubuntu 发行版，但您可以安装任意发行版。系统会提示您重新启动电脑以使更改生效。
+ **如果您使用 Amazon EC2 创建密钥对**

  如以下示例中所示，使用 OpenSSL 工具生成指纹。

  对于 RSA 密钥对：

  ```
  openssl pkcs8 -in path_to_private_key -inform PEM -outform DER -topk8 -nocrypt | openssl sha1 -c
  ```

  （Linux 实例）对于 ED25519 密钥对：

  ```
  ssh-keygen -l -f path_to_private_key
  ```
+ **（仅限 RSA 密钥对）如果您将公有密钥导入 Amazon EC2**

  无论密钥对的创建方式如何（例如，使用第三方工具或者从使用 Amazon EC2 创建的现有私有密钥生成新的公有密钥），都可以遵循此过程。

  如以下示例中所示，使用 OpenSSL 工具生成指纹。

  ```
  openssl rsa -in path_to_private_key -pubout -outform DER | openssl md5 -c
  ```
+ **如果您使用 OpenSSH 7.8 或更高版本创建 OpenSSH 密钥对，并将公有密钥导入到 Amazon EC2**

  如以下示例中所示，使用 **ssh-keygen** 生成指纹。

  对于 RSA 密钥对：

  ```
  ssh-keygen -ef path_to_private_key -m PEM | openssl rsa -RSAPublicKey_in -outform DER | openssl md5 -c
  ```

  （Linux 实例）对于 ED25519 密钥对：

  ```
  ssh-keygen -l -f path_to_private_key
  ```

# EC2 实例的 Amazon EC2 安全组
<a name="ec2-security-groups"></a>

*安全组* 充当 EC2 实例的虚拟防火墙，用于控制传入和传出流量。入站规则控制传入到实例的流量，出站规则控制从实例传出的流量。启动实例时，您可以指定一个或多个安全组。如果您未指定安全组，则 Amazon EC2 将对 VPC 使用默认安全组。启动实例后，您可以更改其安全组。

安全性是 AWS 和您的共同责任。有关更多信息，请参阅 [Amazon EC2 中的安全性](ec2-security.md)。AWS 提供安全组作为一项工具用于保护您的实例，您需要对其进行配置以满足您的安全需求。如果安全组无法满足您的要求，除了使用安全组外，您还可以在任何一个实例上保持自己的防火墙。

**定价**  
使用安全组不会收取任何额外费用。

**Topics**
+ [概述](#security-group-basics)
+ [为 Amazon EC2 实例创建安全组](creating-security-group.md)
+ [更改 Amazon EC2 实例的安全组](changing-security-group.md)
+ [删除 Amazon EC2 安全组](deleting-security-group.md)
+ [Amazon EC2 安全组连接跟踪](security-group-connection-tracking.md)
+ [针对不同使用案例的安全组规则](security-group-rules-reference.md)

## 概述
<a name="security-group-basics"></a>

您可以将每个实例与多个安全组关联，也可以将每个安全组与多个实例关联。为每个安全组添加规则，规定流入或流出其关联实例的流量。您可以随时修改安全组的规则。新规则和修改后的规则将自动应用到与安全组相关联的所有实例。在决定是否允许流量到达某个实例时，Amazon EC2 会评估与该实例关联的所有安全组中的所有规则。有关更多信息，请参阅 *Amazon VPC 用户指南*中的[安全组规则](https://docs.aws.amazon.com/vpc/latest/userguide/security-group-rules.html)。

下图显示了一个具有一个子网、一个互联网网关和一个安全组的 VPC。子网包含 EC2 实例。安全组与实例关联。到达实例的唯一流量是得到安全组规则允许的流量。例如，如果安全组包含一条允许来自您的网络的 SSH 流量的规则，则您可以使用 SSH 从您的计算机连接到实例。如果安全组包含一条规则，允许来自与其关联的资源的所有流量，则每个实例都可以接收从其他实例发送的任何流量。

![\[具有一个安全组的 VPC 将子网中的 EC2 实例与安全组关联起来。\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/images/ec2-security-groups.png)


安全组是有状态的 — 如果您从实例发送一个请求，则无论入站安全组规则如何，都将允许该请求的响应流量流入。此外，如果是为响应已允许的入站流量，则该响应可以出站，此时可忽略出站规则。有关更多信息，请参阅 [连接跟踪](security-group-connection-tracking.md)。

# 为 Amazon EC2 实例创建安全组
<a name="creating-security-group"></a>

安全组用作相关实例的防火墙，可在实例级别控制入站和出站的数据流。您可以向安全组添加规则，以便能够使用 SSH（Linux 实例）或 RDP（Windows 实例）连接到实例。您还可以添加允许客户端流量的规则，例如发往 Web 服务器的 HTTP 和 HTTPS 流量。

在启动某个实例时，您可以将安全组与该实例关联。在关联的安全组中添加或删除规则时，这些更改将自动应用于与安全组关联的所有实例。

启动实例后，即可关联其他安全组。有关更多信息，请参阅 [更改 Amazon EC2 实例的安全组](changing-security-group.md)。

您可以在创建安全组时添加入站和出站安全组规则，也可以稍后添加规则。有关更多信息，请参阅 [配置安全组规则](changing-security-group.md#add-remove-security-group-rules)。有关可以添加到安全组的规则示例，请参阅[针对不同使用案例的安全组规则](security-group-rules-reference.md)。

**注意事项**
+ 新安全组起初只有一条出站规则，即允许所有通信离开资源。您必须添加规则，以便允许任何入站数据流或限制出站数据流。
+ 在为允许 SSH 或 RDP 访问实例的规则配置来源时，切勿允许从任何地方进行访问，因为这将允许从互联网上的所有 IP 地址访问实例。这在测试环境中可以接受一小段时间，但是在生产环境中并不安全。
+ 如果特定端口具有多个规则，Amazon EC2 将应用最宽松的规则。例如，如果有一条规则允许从 IP 地址 203.0.113.1 访问 TCP 端口 22（SSH），而另一条规则允许从任何地方访问 TCP 端口 22，则所有人都可以访问 TCP 端口 22。
+ 您可以将多个安全组与一个实例关联。因此，一个实例可以有数百条适用的规则。访问该实例时，这可能会导致问题。因此，我们建议您尽可能使规则简洁。
+ 当您指定一个安全组作为规则的源或目标时，规则会影响与该安全组关联的所有实例。允许的传入流量基于与源安全组相关联的实例的私有 IP 地址 (而不是公有 IP 或弹性 IP 地址)。有关 IP 地址的更多信息，请参阅 [Amazon EC2 实例 IP 寻址](using-instance-addressing.md)。
+ 默认情况下，Amazon EC2 会阻止端口 25 上的流量。有关更多信息，请参阅 [对使用端口 25 发送的电子邮件的限制](ec2-resource-limits.md#port-25-throttle)。

------
#### [ Console ]

**创建安全组**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 在导航窗格中，选择 **Security Groups**（安全组）。

1. 选择 **Create security group**（创建安全组）。

1. 输入安全组的描述性名称和简要说明。在创建安全组后，您无法更改其名称和描述。

1. 对于 **VPC**，请选择将在其中运行 Amazon EC2 实例的 VPC。

1. （可选）要添加入站规则，请选择**入站规则**。对于每条规则，请选择**添加规则**并指定协议、端口和来源。例如，要允许 SSH 流量，请在**类型**中选择 **SSH**，并为**来源**指定计算机或网络的公有 IPv4 地址。

1. （可选）要添加出站规则，请选择**出站规则**。对于每条规则，请选择**添加规则**并指定协议、端口和目标。若不这样做，您可以保留允许所有出站流量的默认规则。

1. （可选）若要添加标签，请选择 **Add new tag**（添加新标签），然后输入该标签的键和值。

1. 选择**创建安全组**。

------
#### [ AWS CLI ]

**创建安全组**  
使用以下 [create-security-group](https://docs.aws.amazon.com/cli/latest/reference/ec2/create-security-group.html) 命令。

```
aws ec2 create-security-group \
    --group-name my-security-group \
    --description "my security group" \
    --vpc-id vpc-1234567890abcdef0
```

有关添加规则的示例，请参阅[配置安全组规则](changing-security-group.md#add-remove-security-group-rules)。

------
#### [ PowerShell ]

**创建安全组**  
使用 [New-EC2SecurityGroup](https://docs.aws.amazon.com/powershell/latest/reference/items/New-EC2SecurityGroup.html) cmdlet。

```
New-EC2SecurityGroup `
    -GroupName my-security-group `
    -Description "my security group" `
    -VpcId vpc-1234567890abcdef0
```

有关添加规则的示例，请参阅[配置安全组规则](changing-security-group.md#add-remove-security-group-rules)。

------

# 更改 Amazon EC2 实例的安全组
<a name="changing-security-group"></a>

您可以在启动 Amazon EC2 实例时指定安全组。启动实例后，即可添加或删除安全组。您也可以随时添加、删除或编辑关联安全组的安全组规则。

安全组与网络接口关联。添加或删除安全组会更改与主网络接口关联的安全组。您还可以更改与任何辅助网络接口关联的安全组。有关更多信息，请参阅 [修改网络接口属性](modify-network-interface-attributes.md)。

**Topics**
+ [添加或删除安全组](#add-remove-instance-security-groups)
+ [配置安全组规则](#add-remove-security-group-rules)

## 添加或删除安全组
<a name="add-remove-instance-security-groups"></a>

启动实例后，即可在关联的安全组列表中添加或删除安全组。当您将多个安全组与一个实例相关联时，将有效汇总每个安全组的规则，以创建一组规则。Amazon EC2 使用这组规则确定是否允许流量。

**要求**
+ 实例必须处于 `running` 或 `stopped` 状态。

------
#### [ Console ]

**更改实例的安全组**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 在导航窗格中，选择 **Instances (实例)**。

1. 选择您的实例，依次选择 **Actions**（操作）、**Security**（安全）和 **Change security groups**（更改安全组）。

1. 对于 **Associated security groups (关联的安全组)**，从列表中选择一个安全组，然后选择 **Add security group (添加安全组)**。

   要删除已关联的安全组，请为该安全组选择 **Remove (删除)**。

1. 选择**保存**。

------
#### [ AWS CLI ]

**更改实例的安全组**  
使用以下 [modify-instance-attribute](https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-instance-attribute.html) 命令。

```
aws ec2 modify-instance-attribute \
    --instance-id i-1234567890abcdef0 \
    --groups sg-1234567890abcdef0
```

------
#### [ PowerShell ]

**更改实例的安全组**  
使用 [Edit-EC2InstanceAttribute](https://docs.aws.amazon.com/powershell/latest/reference/items/Edit-EC2InstanceAttribute.html) cmdlet。

```
Edit-EC2InstanceAttribute `
    -InstanceId i-1234567890abcdef0 `
    -Group sg-1234567890abcdef0
```

------

## 配置安全组规则
<a name="add-remove-security-group-rules"></a>

创建安全组后，即可添加、更新或删除安全组的规则。在添加、更新或删除规则时，更改将自动应用于与安全组关联的资源。

有关可以添加到安全组的规则示例，请参阅[针对不同使用案例的安全组规则](security-group-rules-reference.md)。

**所需的权限**  
在开始之前，请确保您拥有所需权限。有关更多信息，请参阅 [示例：使用安全组](iam-policies-ec2-console.md#ex-security-groups)。

**协议和端口**
+ 使用控制台，当您选择预定义的类型时，将为您指定**协议**和**端口范围**。要输入端口范围，必须选择以下自定义类型之一：**自定义 TCP** 或**自定义 UDP**。
+ 使用 AWS CLI，您可以使用 `--protocol` 和 `--port` 选项添加带有单个端口的单个规则。要添加多个规则或具有端口范围的规则，请改用 `--ip-permissions` 选项。

**来源和目标**
+ 使用控制台，您可以将以下内容指定为入站规则的源或出站规则的目标：
  + **自定义**：IPv4 CIDR 数据块、IPv6 CIDR 数据块、安全组或前缀列表。
  + **Anywhere-IPv4** – 0.0.0.0/0 IPv4 CIDR 数据块。
  + **Anywhere-IPv6** – ::/0 IPv6 CIDR 数据块。
  + **我的 IP** – 本地计算机的公有 IPv4 地址。
+ 使用 AWS CLI，您可以使用 `--cidr` 选项指定 IPv4 CIDR 数据块，也可以使用 `--source-group` 选项指定安全组。要指定前缀列表或 IPv6 CIDR 数据块，请使用 `--ip-permissions` 选项。

**警告**  
如果要为端口 22（SSH）或 3389（RDP）添加入站规则，强烈建议仅授权特定 IP 地址或特定范围内的 IP 地址访问实例。如果选择 **Anywhere-IPv4**，则允许来自所有 IPv4 地址的流量使用指定协议访问实例。如果选择 **Anywhere-IPv6**，则允许来自所有 IPv6 地址的流量使用指定协议访问实例。

------
#### [ Console ]

**配置安全组规则**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 在导航窗格中，选择 **Security Groups**（安全组）。

1. 选择安全组。

1. 要编辑入站规则，请从**操作**或**入站规则**选项卡中选择**编辑入站规则**。

   1. 要添加规则，请选择**添加规则**，再输入规则的类型、协议、端口和来源。

      如果类型为 TCP 或 UDP，则必须输入允许的端口范围。对于自定义 ICMP，您必须从 **Protocol**（协议）中选择 ICMP 类型名称，并从 **Port range**（端口范围）中选择代码名称（如果适用）。对于任何其他类型，则会为您配置协议和端口范围。

   1. 要更新规则，请根据需要更改规则的协议、描述和来源。但是，您无法更改来源类型。例如，若来源是 IPv4 CIDR 数据块，则无法指定 IPv6 CIDR 数据块、前缀列表或安全组。

   1. 要删除规则，请选择规则的**删除**按钮。

1. 要编辑出站规则，请从**操作**或**出站规则**选项卡中选择**编辑出站规则**。

   1. 要添加规则，请选择**添加规则**，再输入规则的类型、协议、端口和目标。您也可以输入可选描述。

      如果类型为 TCP 或 UDP，则必须输入允许的端口范围。对于自定义 ICMP，您必须从 **Protocol**（协议）中选择 ICMP 类型名称，并从 **Port range**（端口范围）中选择代码名称（如果适用）。对于任何其他类型，则会为您配置协议和端口范围。

   1. 要更新规则，请根据需要更改规则的协议、描述和来源。但是，您无法更改来源类型。例如，若来源是 IPv4 CIDR 数据块，则无法指定 IPv6 CIDR 数据块、前缀列表或安全组。

   1. 要删除规则，请选择规则的**删除**按钮。

1. 选择**保存规则**。

------
#### [ AWS CLI ]

**添加安全组规则**  
使用 [authorize-security-group-ingress](https://docs.aws.amazon.com/cli/latest/reference/ec2/authorize-security-group-ingress.html) 命令添加入站规则。以下示例会允许来自指定前缀列表中的 CIDR 数据块的入站 SSH 流量。

```
aws ec2 authorize-security-group-ingress \
    --group-id sg-1234567890abcdef0 \
    --ip-permissions 'IpProtocol=tcp,FromPort=22,ToPort=22,PrefixListIds=[{PrefixListId=pl-f8a6439156EXAMPLE}]'
```

使用 [authorize-security-group-egress](https://docs.aws.amazon.com/cli/latest/reference/ec2/authorize-security-group-egress.html) 命令添加出站规则。以下示例会允许端口 80 上指向具有指定安全组的实例的出站 TCP 流量。

```
aws ec2 authorize-security-group-egress \
    --group-id sg-1234567890abcdef0 \
    --ip-permissions 'IpProtocol=tcp,FromPort=80,ToPort=80,UserIdGroupPairs=[{GroupId=sg-0aad1c26bb6EXAMPLE}]'
```

**移除安全组规则**  
使用以下 [revoke-security-group-ingress](https://docs.aws.amazon.com/cli/latest/reference/ec2/revoke-security-group-ingress.html) 命令移除入站规则。

```
aws ec2 revoke-security-group-egress \
    --group id sg-1234567890abcdef0 \
    --security-group-rule-ids sgr-09ed298024EXAMPLE
```

使用以下 [revoke-security-group-egress](https://docs.aws.amazon.com/cli/latest/reference/ec2/revoke-security-group-egress.html) 命令移除出站规则。

```
aws ec2 revoke-security-group-ingress \
    --group id sg-1234567890abcdef0 \
    --security-group-rule-ids sgr-0352250c1aEXAMPLE
```

**修改安全组规则**  
使用 [modify-security-group-rules](https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-security-group-rules.html) 命令。以下示例会更改指定安全组规则的 IPv4 CIDR 数据块。

```
aws ec2 modify-security-group-rules \
    --group id sg-1234567890abcdef0 \
    --security-group-rules 'SecurityGroupRuleId=sgr-09ed298024EXAMPLE,SecurityGroupRule={IpProtocol=tcp,FromPort=80,ToPort=80,CidrIpv4=0.0.0.0/0}'
```

------
#### [ PowerShell ]

**添加安全组规则**  
使用 [Grant-EC2SecurityGroupIngress](https://docs.aws.amazon.com/powershell/latest/reference/items/Grant-EC2SecurityGroupIngress.html) cmdlet 添加入站规则。以下示例会允许来自指定前缀列表中的 CIDR 数据块的入站 SSH 流量。

```
$plid = New-Object -TypeName Amazon.EC2.Model.PrefixListId
$plid.Id = "pl-f8a6439156EXAMPLE"
Grant-EC2SecurityGroupIngress `
    -GroupId sg-1234567890abcdef0 `
    -IpPermission @{IpProtocol="tcp"; FromPort=22; ToPort=22; PrefixListIds=$plid}
```

使用 [Grant-EC2SecurityGroupEgress](https://docs.aws.amazon.com/powershell/latest/reference/items/Grant-EC2SecurityGroupEgress.html) cmdlet 添加出站规则。以下示例会允许端口 80 上指向具有指定安全组的实例的出站 TCP 流量。

```
$uigp = New-Object -TypeName Amazon.EC2.Model.UserIdGroupPair
$uigp.GroupId = "sg-0aad1c26bb6EXAMPLE"
Grant-EC2SecurityGroupEgress `
    -GroupId sg-1234567890abcdef0 `
    -IpPermission @{IpProtocol="tcp"; FromPort=80; ToPort=80; UserIdGroupPairs=$uigp}
```

**移除安全组规则**  
使用 [Revoke-EC2SecurityGroupIngress](https://docs.aws.amazon.com/powershell/latest/reference/items/Revoke-EC2SecurityGroupIngress.html) cmdlet 移除入站规则。

```
Revoke-EC2SecurityGroupIngress `
    -GroupId sg-1234567890abcdef0 `
    -SecurityGroupRuleId sgr-09ed298024EXAMPLE
```

使用 [Revoke-EC2SecurityGroupEgress](https://docs.aws.amazon.com/powershell/latest/reference/items/Revoke-EC2SecurityGroupEgress.html) cmdlet 移除出站规则。

```
Revoke-EC2SecurityGroupEgress `
    -GroupId sg-1234567890abcdef0 `
    -SecurityGroupRuleId sgr-0352250c1aEXAMPLE
```

**修改安全组规则**  
使用 [Edit-EC2SecurityGroupRule](https://docs.aws.amazon.com/powershell/latest/reference/items/Edit-EC2SecurityGroupRule.html) cmdlet。以下示例会更改指定安全组规则的 IPv4 CIDR 数据块。

```
$sgrr = New-Object -TypeName Amazon.EC2.Model.SecurityGroupRuleRequest
$sgrr.IpProtocol = "tcp"
$sgrr.FromPort = 80
$sgrr.ToPort = 80
$sgrr.CidrIpv4 = "0.0.0.0/0"
$sgr = New-Object -TypeName Amazon.EC2.Model.SecurityGroupRuleUpdate
$sgr.SecurityGroupRuleId = "sgr-09ed298024EXAMPLE"
$sgr.SecurityGroupRule = $sgrr
Edit-EC2SecurityGroupRule  `
    -GroupId sg-1234567890abcdef0 `
    -SecurityGroupRule $sgr
```

------

# 删除 Amazon EC2 安全组
<a name="deleting-security-group"></a>

使用完为使用 Amazon EC2 实例创建的安全组后，可以将其删除。

**要求**
+ 安全组不能与实例或网络接口关联。
+ 其他安全组中的规则无法引用安全组。

------
#### [ Console ]

**删除安全组**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. （可选）要验证安全组是否未与实例关联，请执行以下操作：

   1. 在导航窗格中，选择**安全组**。

   1. 复制要删除的安全组的 ID。

   1. 在导航窗格中，选择 **Instances (实例)**。

   1. 在搜索栏中，添加**安全组 ID 等于**筛选条件，再粘贴安全组的 ID。若没有结果，则安全组未与实例关联。若有结果，则必须取消关联安全组，才能将其删除。

1. 在导航窗格中，选择**安全组**。

1. 选择安全组，然后依次选择**操作**、**删除安全组**。

1. 如果选择了多个安全组，系统会提示您进行确认。如果某些安全组无法删除，我们会显示每个安全组的状态，表明是否会被删除。要确认删除操作，请输入**删除**。

1. 选择**删除**。

------
#### [ AWS CLI ]

**删除安全组**  
使用以下 [delete-security-group](https://docs.aws.amazon.com/cli/latest/reference/ec2/delete-security-group.html) 命令。

```
aws ec2 delete-security-group --group-id sg-1234567890abcdef0
```

------
#### [ PowerShell ]

**删除安全组**  
使用 [Remove-EC2SecurityGroup](https://docs.aws.amazon.com/powershell/latest/reference/items/Remove-EC2SecurityGroup.html) cmdlet。

```
Remove-EC2SecurityGroup -GroupId sg-1234567890abcdef0
```

------

# Amazon EC2 安全组连接跟踪
<a name="security-group-connection-tracking"></a>

您的安全组使用连接跟踪来跟踪有关进出实例的流量的信息。将基于流量的连接状态应用规则以确定允许还是拒绝流量。有了这种方法，安全组就具有状态。这意味着无论出站安全组规则如何都允许对入站流量的响应流出实例，反之亦然。

例如，假设您从家中的计算机对您的实例启动 netcat 或与您的实例类似的命令，并且您的入站安全组规则允许 ICMP 流量。跟踪有关连接的信息（包括端口信息）。来自 命令的实例的响应流量不会作为新请求来跟踪，而是作为已建立的连接来跟踪，并且可以流出实例，即使您的出站安全组规则限制出站 ICMP 流量也是如此。

对于除 TCP、UDP 或 ICMP 以外的协议，仅跟踪 IP 地址和协议编号。如果您的实例将流量发送到另一个主机，且该主机在 600 秒内将同一类型的流量发送到您的实例，则无论入站安全组规则如何，您的实例的安全组都将接受该请求。安全组接受它，因为它被视为原始流量的响应流量。

更改安全组规则时，其跟踪的连接不会立即中断。在现有连接超时之前，安全组将继续允许数据包。要确保该流量立即中断，或确保所有流量无论跟踪状态如何，均遵循防火墙规则，您可以使用子网的网络 ACL。网络 ACL 是无状态的，因此不会自动允许响应流量。添加阻止任一方向的流量的网络 ACL 会破坏现有连接。有关更多信息，请参阅 *Amazon VPC 用户指南*中的[网络 ACL](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-network-acls.html)。

**注意**  
安全组对传入或传出 Route 53 Resolver 的 DNS 流量没有影响，Route 53 Resolver 有时称为“VPC\$12 IP 地址”（请参阅《Amazon Route 53 开发者指南**》中的[什么是 Amazon Route 53 Resolver？](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/resolver.html)）或“AmazonProvidedDNS”（请参阅《Amazon Virtual Private Cloud 用户指南**》中的[使用 DHCP 选项集](https://docs.aws.amazon.com/vpc/latest/userguide/DHCPOptionSet.html)）。如果希望通过 Route 53 Resolver 筛选 DNS 请求，则可以启用 Route 53 Resolver DNS Firewall（请参阅《Amazon Route 53 开发人员指南**》中的 [Route 53 Resolver DNS Firewall](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/resolver-dns-firewall.html)）。

## 未跟踪的连接
<a name="untracked-connections"></a>

并非所有通信流都会被跟踪。如果有安全组规则允许所有流量（0.0.0.0/0 或 ::/0）的 TCP 或 UDP 流，而另一个方向上存在对应的规则，允许任何端口（0-65535）的所有响应流量（0.0.0.0/0 或 ::/0），则系统不会跟踪该流量流，除非它属于[自动跟踪连接](#automatic-tracking)的一部分。基于允许响应流量的入站或出站规则允许未跟踪流的响应流量，而不是基于跟踪信息。

如果删除或修改了支持该流的规则，则会立即中断未被跟踪的通信流。例如，如果您有一个开放 (0.0.0.0/0) 出站规则，并且删除了允许所有 (0.0.0.0/0) 入站 SSH（TCP 端口 22）流量传输到实例的规则（或修改它以使不再允许连接），则您与实例的现有 SSH 连接将立即删除。该连接以前未跟踪，因此更改将断开连接。另一方面，如果您有一个较细化的入站规则，最初允许 SSH 连接（意味着已跟踪该连接），但将该规则更改为不再允许来自当前 SSH 客户端地址的新连接，则由于现有的 SSH 连接被跟踪，它不会中断。

## 自动跟踪的连接
<a name="automatic-tracking"></a>

即使安全组配置无需跟踪，也会自动跟踪通过以下各项建立的连接：
+ 仅出口互联网网关
+ Global Accelerator 加速器
+ NAT 网关
+ Network Firewall 防火墙端点
+ 网络负载均衡器
+ AWS PrivateLink（接口 VPC 端点）
+ AWS Lambda（Hyperplane 弹性网络接口）
+ DynamoDB 网关端点 – 与 DynamoDB 的每个连接都会消耗 2 个 conntrack 条目。

## 连接跟踪限额
<a name="connection-tracking-throttling"></a>

Amazon EC2 定义每个实例可以跟踪的最大连接数量。达到最大值后，由于无法建立新连接，所有发送或接收的数据包都将丢失。发生这种情况时，发送和接收数据包的应用程序无法正常通信。使用 `conntrack_allowance_available` 网络性能指标来确定该实例类型仍然可用的跟踪连接数。

要确定数据包是否因为您实例的网络流量超过了可跟踪的最大连接数量而丢弃，请使用 `conntrack_allowance_exceeded` 网络性能指标。有关更多信息，请参阅 [监控 EC2 实例上 ENA 设置的网络性能](monitoring-network-performance-ena.md)。

如果您超过了每个实例可跟踪的最大连接数量，建议您借助 Elastic Load Balancing 扩展负载均衡器注册的实例数或实例大小。

## 连接跟踪最佳实践
<a name="connection-tracking-performance"></a>

非对称路由（即流量通过一个网络接口进入实例，然后通过另一个网络接口离开）可能会降低实例在跟踪流量时所能达到的峰值性能。

为在针对安全组启用连接跟踪时保持峰值性能并优化连接管理，建议您使用以下配置：
+ 如有可能，请避免使用非对称路由拓扑。
+ 并非使用安全组进行筛选，而是使用网络 ACL。
+ 如果必须将安全组与连接跟踪结合使用，请配置尽可能短的空闲连接跟踪超时。有关空闲连接跟踪超时的详细信息，请参阅下一节。
+ 由于 Nitrov6 实例的默认超时时间较短，具有长期连接的应用程序（例如数据库连接池、持久 HTTP 连接或流式工作负载）应在实例启动时配置适当的 `TcpEstablishedTimeout` 值。
+ 对于长期连接，请将 TCP keepalive 配置为每隔少于 5 分钟发送一次，进而确保连接保持打开状态并保持其跟踪状态。这有助于防止由于空闲超时而导致连接中断，并减少重新建立连接的开销。

有关 Nitro 系统性能优化的更多信息，请参阅 [Nitro 系统性能调整注意事项](ena-nitro-perf.md)。

## 空闲连接跟踪超时
<a name="connection-tracking-timeouts"></a>

安全组会跟踪建立的每个连接，以确保返回数据包按预期交付。每个实例都有可以跟踪的最大连接数量。保持空闲状态的连接可能导致连接跟踪耗尽，并导致无法跟踪连接和丢弃数据包。您可以在弹性网络接口上设置空闲连接跟踪的超时时间。

**注意**  
此功能仅适用于[基于 Nitro 的实例](instance-types.md#instance-hypervisor-type)。在部署到生产环境之前，您应该在 Nitrov6 代实例上测试应用程序，减少 `350` 秒默认连接跟踪超时。

有三种可配置的超时：
+ **TCP 建立超时**：处于已建立状态的空闲 TCP 连接的超时时间（以秒为单位）。
  + 最小值：`60` 秒
  + 最大值：`432000` 秒
  + 默认值：[Nitrov6](https://docs.aws.amazon.com/ec2/latest/instancetypes/ec2-nitro-instances.html) 实例类型（不包括 P6e-GB200）为 `350` 秒。其他实例类型（包括 P6e-GB200）为 `432000` 秒。
  + 建议值：小于 `432000` 秒
+ **UDP 超时**：空闲 UDP 流的超时时间（以秒为单位），这些流仅在单个方向或单个请求-响应事务上看到流量。
  + 最小值：`30` 秒
  + 最大值：`60` 秒
  + 原定设置：`30` 秒
+ **UDP 流超时**：空闲 UDP 流的超时（以秒为单位），这些流被归类为已看到多个请求-响应事务的流。
  + 最小值：`60` 秒
  + 最大值：`180` 秒
  + 原定设置：`180` 秒

对于以下任何一种情况，您可能需要修改默认超时：
+  如果您[使用 Amazon EC2 网络性能指标监控跟踪的连接](monitoring-network-performance-ena.md)，那么 *conntrack\$1allowance\$1exceeded* 和 *conntrack\$1allowance\$1available* 指标使您能够监控丢弃的数据包并跟踪连接利用率，通过纵向或横向扩展操作主动管理 EC2 实例容量，从而在丢弃数据包之前帮助满足网络连接需求。如果您观察到正在 EC2 实例上丢弃 *conntrack\$1allowance\$1exceeded*，您可以设置较低的 TCP 建立超时，以解决因不正确的客户端或网络中继盒导致 TCP/UDP 会话失效的问题，您可能会受益于此操作。
+ 通常，负载均衡器或防火墙的 TCP 建立空闲超时在 60 到 90 分钟之间。如果您正在运行的工作负载需要处理来自网络防火墙等设备的大量连接（大于 100k），则建议在 EC2 网络接口上配置类似的超时时间。
+ 如果您运行的工作负载使用非对称路由拓扑，我们建议将 TCP 建立空闲超时配置为 60 秒。
+ 如果您正在运行具有大量连接的工作负载，例如 DNS、SIP、SNMP、Syslog、Radius 和主要使用 UDP 来处理请求的其他服务，则将“UDP-Stream”超时设置为 60 秒可以提高现有容量的规模/性能，并防止灰色故障。
+ 对于通过网络负载均衡器进行的 TCP/UDP 连接，将追踪所有连接。TCP 流的空闲超时值为 350 秒，而 UDP 流为 120 秒，因接口级别的超时值而异。您可能希望在网络接口级别配置超时，以便比负载均衡器的默认值具有更大的超时灵活性。

当您执行以下操作时，可以选择配置连接跟踪超时：
+ [创建网络接口](create-network-interface.md)
+ [修改网络接口属性](modify-network-interface-attributes.md)
+ [启动 EC2 实例](ec2-instance-launch-parameters.md#liw-network-settings)
+ [创建 EC2 实例启动模板](ec2-instance-launch-parameters.md#liw-network-settings)

## 示例
<a name="connection-tracking-example"></a>

在以下示例中，安全组具有允许 TCP 和 ICMP 流量的入站规则，并具有允许所有出站流量的出站规则。


**入站**  

| 协议类型 | 端口号 | 来源 | 
| --- | --- | --- | 
| TCP  | 22 (SSH) | 203.0.113.1/32 | 
| TCP  | 80 (HTTP) | 0.0.0.0/0 | 
| TCP  | 80 (HTTP) | ::/0 | 
| ICMP | 全部 | 0.0.0.0/0 | 


**出站**  

| 协议类型 | 端口号 | 目标 | 
| --- | --- | --- | 
| 全部 | 全部 | 0.0.0.0/0 | 
| All | All | ::/0 | 

通过与实例或网络接口的直接网络连接，跟踪行为如下：
+ 将会跟踪端口 22（SSH）上的入站和出站 TCP 流量，因为入站规则只允许来自 203.0.113.1/32 的流量，而不是所有 IP 地址（0.0.0.0/0）。
+ 不会跟踪端口 80（HTTP）上的入站和出站 TCP 流量，因为入站和出站规则允许来自所有 IP 地址的流量。
+ 始终跟踪 ICMP 流量。

如果您删除 IPv4 流量的出站规则，则将跟踪所有入站和出站 IPv4 流量，包括端口 80（HTTP）上的流量。如果您删除 IPv6 流量的出站规则，这同样适用于 IPv6 流量。

# 针对不同使用案例的安全组规则
<a name="security-group-rules-reference"></a>

您可以创建安全组，并添加可反映与安全组关联的实例角色的规则。例如，配置作为 Web 服务器的实例需要允许入站 HTTP 和 HTTPS 访问的安全组规则。同样，数据库实例需要允许数据库类型访问的规则，例如，对 MySQL 允许通过端口 3306 进行访问。

以下是您可以添加到允许特定类型访问的安全组的规则类型示例。

**Topics**
+ [Web 服务器规则](#sg-rules-web-server)
+ [数据库服务器规则](#sg-rules-db-server)
+ [用于从您的计算机连接到实例的规则](#sg-rules-local-access)
+ [用于在具有相同安全组的实例之间进行连接的规则](#sg-rules-other-instances)
+ [用于 ping/ICMP 的规则](#sg-rules-ping)
+ [DNS 服务器规则](#sg-rules-dns)
+ [Amazon EFS 规则](#sg-rules-efs)
+ [Elastic Load Balancing 规则](#sg-rules-elb)

有关说明，请参阅[创建安全组](creating-security-group.md)和[配置安全组规则](changing-security-group.md#add-remove-security-group-rules)。

## Web 服务器规则
<a name="sg-rules-web-server"></a>

以下入站规则允许来自任何 IP 地址的 HTTP 和 HTTPS 访问。如果您为 VPC 启用了 IPv6，则可添加规则以控制来自 IPv6 地址的入站 HTTP 和 HTTPS 流量。


| 协议类型 | 协议编号 | 端口 | 源 IP | 备注 | 
| --- | --- | --- | --- | --- | 
| TCP | 6 | 80 (HTTP) | 0.0.0.0/0 | 允许来自任何 IPv4 地址的入站 HTTP 访问。 | 
| TCP | 6 | 443 (HTTPS) | 0.0.0.0/0 | 允许来自任何 IPv4 地址的入站 HTTPS 访问 | 
| TCP | 6 | 80 (HTTP) | ::/0 | 允许来自任何 IPv6 地址的入站 HTTP 访问 | 
| TCP | 6 | 443 (HTTPS) | ::/0 | 允许来自任何 IPv6 地址的入站 HTTPS 访问 | 

## 数据库服务器规则
<a name="sg-rules-db-server"></a>

以下入站规则是您可以为数据库访问添加的规则示例，具体取决于您在实例运行的数据库类型。有关 Amazon RDS 实例的更多信息，请参阅 [Amazon RDS 用户指南](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/)。

对于源 IP，请指定以下其中一项：
+ 本地网络中的特定 IP 地址或 IP 地址范围（采用 CIDR 数据块表示法）
+ 访问数据库的一组实例的安全组 ID


| 协议类型 | 协议编号 | 端口 | 备注 | 
| --- | --- | --- | --- | 
| TCP | 6 | 1433 (MS SQL) | 访问 Microsoft SQL Server 数据库的默认端口，例如，在 Amazon RDS 实例上 | 
| TCP | 6 | 3306 (MYSQL/Aurora) | 访问 MySQL 或 Aurora 数据库的默认端口，例如，在 Amazon RDS 实例上 | 
| TCP | 6 | 5439 (Redshift) | 访问 Amazon Redshift 集群数据库的默认端口。 | 
| TCP | 6 | 5432 (PostgreSQL) | 访问 PostgreSQL 数据库的默认端口，例如，在 Amazon RDS 实例上 | 
| TCP | 6 | 1521 (Oracle) | 访问 Oracle 数据库的默认端口，例如，在 Amazon RDS 实例上 | 

您可以选择限制来自数据库服务器的出站流量。例如，您可能希望允许访问 Internet 进行软件更新，但限制所有其他类型的流量。您必须先删除允许所有出站流量的默认出站规则。


| 协议类型 | 协议编号 | 端口 | 目的地 IP | 备注 | 
| --- | --- | --- | --- | --- | 
| TCP | 6 | 80 (HTTP) | 0.0.0.0/0 | 允许对任何 IPv4 地址进行出站 HTTP 访问 | 
| TCP | 6 | 443 (HTTPS) | 0.0.0.0/0 | 允许对任何 IPv4 地址进行出站 HTTPS 访问 | 
| TCP | 6 | 80 (HTTP) | ::/0 | (仅限已启用 IPv6 的 VPC) 允许对任何 IPv6 地址进行出站 HTTP 访问 | 
| TCP | 6 | 443 (HTTPS) | ::/0 | (仅限已启用 IPv6 的 VPC) 允许对任何 IPv6 地址进行出站 HTTPS 访问 | 

## 用于从您的计算机连接到实例的规则
<a name="sg-rules-local-access"></a>

要连接到您的实例，您的安全组必须拥有允许 SSH 访问 (适用于 Linux 实例) 或 RDP 访问 (适用于 Windows 实例) 的入站规则。


| 协议类型 | 协议编号 | 端口 | 源 IP | 
| --- | --- | --- | --- | 
| TCP | 6 | 22 (SSH) | 您电脑的公有 IPv4 地址或您的本地网络中的 IP 地址范围。如果您为 VPC 启用了 IPv6，并且您的实例有一个 IPv6 地址，则可以输入一个 IPv6 地址或范围。 | 
| TCP | 6 | 3389 (RDP) | 您电脑的公有 IPv4 地址或您的本地网络中的 IP 地址范围。如果您为 VPC 启用了 IPv6，并且您的实例有一个 IPv6 地址，则可以输入一个 IPv6 地址或范围。 | 

## 用于在具有相同安全组的实例之间进行连接的规则
<a name="sg-rules-other-instances"></a>

要允许与同一安全组关联的实例之间相互通信，您必须明确添加实现此目的的规则。

**注意**  
如果您将路由配置为通过中间设备在不同子网中的两个实例之间转发流量，则必须确保这两个实例的安全组允许流量在实例之间流动。每个实例的安全组必须引用另一个实例的私有 IP 地址或包含另一个实例的子网的 CIDR 范围作为源。如果您引用另一个实例的安全组作为源，则安全组不允许流量在实例之间流动。

下表描述了允许关联的实例相互通信的安全组的入站规则。该规则允许所有类型的流量。


| 协议类型 | 协议编号 | 端口 | 源 IP | 
| --- | --- | --- | --- | 
| -1 (All) | -1 (All) | -1 (All) | 安全组的 ID 或包含另一个实例的子网的 CIDR 范围（请参阅注释）。 | 

## 用于 ping/ICMP 的规则
<a name="sg-rules-ping"></a>

**ping** 命令是一种 ICMP 流量。要对实例执行 ping 操作，您必须添加以下入站 ICMP 规则之一。


| Type | 协议 | 来源 | 
| --- | --- | --- | 
| 自定义 ICMP - IPv4 | Echo 请求 | 计算机的公有 IPv4 地址、特定 IPv4 地址、或是来自任何位置的 IPv4 或 IPv6 地址。 | 
| 所有 ICMP - IPv4 | IPv4 ICMP (1) | 计算机的公有 IPv4 地址、特定 IPv4 地址、或是来自任何位置的 IPv4 或 IPv6 地址。 | 

要使用 **ping6** 命令对您的实例的 IPv6 地址执行 ping 操作，您必须添加以下入站 ICMPv6 规则。


| Type | 协议 | 来源 | 
| --- | --- | --- | 
| 所有 ICMP - IPv6 | IPv6 ICMP (58) | 计算机的 IPv6 地址、特定 IPv4 地址、或是来自任何位置的 IPv4 或 IPv6 地址。 | 

## DNS 服务器规则
<a name="sg-rules-dns"></a>

如果您已将 EC2 实例设置为 DNS 服务器，则必须确保 TCP 和 UDP 流量可通过端口 53 访问您的 DNS 服务器。

对于源 IP，请指定以下其中一项：
+ 网络中的 IP 地址或 IP 地址范围（采用 CIDR 数据块表示法）
+ 您网络中需要访问 DNS 服务器的实例组的安全组 ID。


| 协议类型 | 协议编号 | 端口 | 
| --- | --- | --- | 
| TCP | 6 | 53 | 
| UDP | 17 | 53 | 

## Amazon EFS 规则
<a name="sg-rules-efs"></a>

如果您将 Amazon EFS 文件系统与 Amazon EC2 实例结合使用，与 Amazon EFS 挂载目标关联的安全组必须允许使用 NFS 协议传输的流量。


| 协议类型 | 协议编号 | 端口 | 源 IP | 备注 | 
| --- | --- | --- | --- | --- | 
| TCP | 6 | 2049 (NFS) | 安全组 ID | 允许从与该安全组关联的资源 (包括挂载目标) 进行入站 NFS 访问。 | 

要在 Amazon EC2 实例上挂载 Amazon EFS 文件系统，您必须连接到您的实例。因此，与您的实例关联的安全组必须拥有允许来自本地计算机或本地网络的入站 SSH 的规则。


| 协议类型 | 协议编号 | 端口 | 源 IP | 备注 | 
| --- | --- | --- | --- | --- | 
| TCP | 6 | 22 (SSH) | 本地计算机的 IP 地址范围或网络的 IP 地址范围（采用 CIDR 数据块表示法）。 | 允许从您的本地计算机进行入站 SSH 访问。 | 

## Elastic Load Balancing 规则
<a name="sg-rules-elb"></a>

如果在负载均衡器中注册 EC2 实例，与负载均衡器关联的安全组必须允许与实例进行通信。有关更多信息，请参阅弹性负载均衡文档中的以下内容。
+ [应用程序负载均衡器的安全组](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-update-security-groups.html)
+ [网络负载均衡器的安全组](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/load-balancer-security-groups.html)
+ [为经典负载均衡器配置安全组](https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/elb-vpc-security-groups.html)

# Amazon EC2 实例的 NitroTPM
<a name="nitrotpm"></a>

Nitro 可信平台模块 (NitroTPM) 是一种虚拟设备，由 [AWS Nitro 系统](https://aws.amazon.com//ec2/nitro/)提供，并且符合 [TPM 2.0 规范](https://trustedcomputinggroup.org/resource/trusted-platform-module-2-0-a-brief-introduction/)。它可以安全地存储用于对实例进行身份验证的构件（例如密码、证书或加密密钥）。NitroTPM 可以生成密钥，并将它们用于加密功能（例如哈希、签名、加密和解密）。

NitroTPM 提供*测量引导*，在此过程中，引导加载程序和操作系统将为每个引导二进制文件创建加密哈希，并将它们与 NitroTPM 内部平台配置寄存器 (PCR) 中之前的值结合起来。借助测量引导，您可以从 NitroTPM 获取签名 PCR 值，然后使用它们向远程实体证明实例的引导软件的完整性。这称为远程*证明*。

借助 NitroTPM，可以使用特定 PCR 值标记密钥和秘密，这样，如果 PCR 的值进而实例完整性发生变化，就永远无法访问它们。这种特殊形式的有条件访问称为*密封和解封*。操作系统技术，如 [BitLocker](https://learn.microsoft.com/en-us/windows/security/operating-system-security/data-protection/bitlocker/)，可以使用 NitroTPM 来密封驱动器解密密钥，以便仅在操作系统正确引导并处于已知良好状态时才能解密驱动器。

要使用 NitroTPM，您必须选择一个配置了 NitroTPM 支持的[亚马逊机器映像](AMIs.md)（AMI），然后使用该 AMI 启动[基于 Nitro 的实例](instance-types.md#instance-hypervisor-type)。您可以选择亚马逊预构建的 AMI，也可以自己创建 AMI。

**定价**  
使用 NitroTPM 不会产生额外成本。您仅需为实际使用的底层资源付费。

**Topics**
+ [要求](enable-nitrotpm-prerequisites.md)
+ [为 NitroTPM 启用 Linux AMI](enable-nitrotpm-support-on-ami.md)
+ [验证是否为 NitroTPM 启用了 AMI](verify-nitrotpm-support-on-ami.md)
+ [启用或停止使用 NitroTPM](nitrotpm-instance.md)
+ [验证是否为 NitroTPM 启用了实例](verify-nitrotpm-support-on-instance.md)
+ [检索公有认可密钥](retrieve-ekpub.md)

# 将 NitroTPM 与 Amazon EC2 实例结合使用的要求
<a name="enable-nitrotpm-prerequisites"></a>

要在启用 NitroTPM 的情况下启动实例，必须满足以下要求。

**Topics**
+ [AMI](#nitrotpm-ami)
+ [实例类型](#nitrotpm-instancetypes)
+ [注意事项](#nitrotpm-considerations)

## AMI
<a name="nitrotpm-ami"></a>

AMI 必须启用了 NitroTPM。

**Linux AMI**  
没有预配置的 AMI。您必须配置自己的 AMI。有关更多信息，请参阅 [为 NitroTPM 启用 Linux AMI](enable-nitrotpm-support-on-ami.md)。

**Windows AMI**  
要查找使用 Microsoft 密钥为 NitroTPM 和 UEFI 安全启动预先配置的 AWS Windows AMI，请参阅《AWS Windows AMI 参考》**中的[查找使用 NitroTPM 和 UEFI 安全启动配置的 Windows Server AMI](https://docs.aws.amazon.com/ec2/latest/windows-ami-reference/ami-windows-tpm.html#ami-windows-tpm-find)。

**注意**  
**操作系统**：AMI 必须包含具有 TPM 2.0 命令响应缓冲区（CRB）驱动程序的操作系统。大多数当前操作系统都包含 TPM 2.0 CRB 驱动程序。  
**UEFI 启动模式**：AMI 必须配置为 UEFI 启动模式。有关更多信息，请参阅 [适用于 Amazon EC2 实例的 UEFI 安全启动](uefi-secure-boot.md)。

## 实例类型
<a name="nitrotpm-instancetypes"></a>

必须使用以下虚拟化实例类型之一：
+ **通用型**：M5、M5a、M5ad、M5d、M5dn、M5n、M5zn、M6a、M6g、M6gd、M6i、M6id、M6idn、M6in、M7a、M7g、M7gd、M7i、M7i-flex、M8a、M8azn、M8g、M8gb、M8gd、M8gn、M8i、M8id、M8i-flex、T3、T3a、T4g
+ **计算优化型**：C5、C5a、C5ad、C5d、C5n、C6a、C6g、C6gd、C6gn、C6i、C6id、C6in、C7a、C7g、C7gd、C7gn、C7i、C7i-flex、C8a、C8g、C8gb、C8gd、C8gn、C8i、C8id、C8i-flex
+ **内存优化型：**R5、R5a、R5ad、R5b、R5d、R5dn、R5n、R6a、R6g、R6gd、R6i、R6id、R6idn、R6in、R7a、R7g、R7gd、R7i、R7iz、R8a、R8g、R8gb、R8gd、R8gn、R8i、R8id、R8i-flex、U7i-6tb、U7i-8tb、U7i-12tb、U7in-16tb、U7in-24tb、U7in-32tb、X2idn、X2iedn、X2iezn、X8g、X8aedz、X8i、z1d
+ **存储优化型**：D3、D3en、I3en、I4i、I7i、I7ie、I8g、I8ge、Im4gn
+ **加速计算型**：F2、G4dn、G5、G6、G6e、G6f、Gr6、Gr6f、G7e、Inf1、Inf2、P5、P5e、P5en、P6-B200、P6-B300、Trn2、Trn2u
+ **高性能计算：**Hpc6a、Hpc6id、Hpc8a

## 注意事项
<a name="nitrotpm-considerations"></a>

在使用 NitroTPM 时，请注意以下几点：
+ 使用启用了 NitroTPM 的 AMI 启动实例后，如果要更改实例类型，您选择的新实例类型也必须支持 NitroTPM。
+ 使用基于 NitroTPM 的密钥加密的 BitLocker 卷只能在原始实例上使用。
+ Amazon EC2 控制台中不会显示 NitroTPM 状态。
+ NitroTPM 状态不包括在 [Amazon EBS 快照](https://docs.aws.amazon.com/ebs/latest/userguide/ebs-snapshots.html)中。
+ NitroTPM 状态不包括在 [VM Import/Export](https://docs.aws.amazon.com/vm-import/latest/userguide/) 映像中。
+ AWS Outposts、本地区或 Wavelength 区中不支持 NitroTPM。

# 为 NitroTPM 启用 Linux AMI
<a name="enable-nitrotpm-support-on-ami"></a>

要为实例启用 NitroTPM，必须使用启用了 NitroTPM 的 AMI 启动该实例。您必须在注册 Linux AMI 时为其配置 NitroTPM 支持。因为此后无法配置 NitroTPM 支持。

有关为获得 NitroTPM 支持而预配置的 Windows AMI 的列表，请参阅 [将 NitroTPM 与 Amazon EC2 实例结合使用的要求](enable-nitrotpm-prerequisites.md)。

必须使用 [RegisterImage](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RegisterImage.html) API 创建配置了 NitroTPM 的 AMI，因为无法使用 Amazon EC2 控制台或 VM Import/Export 完成此操作。

**为 NitroTPM 启用 Linux AMI**

1. 使用所需的 Linux AMI 启动临时实例。记下其根卷的 ID，该 ID 可在控制台中实例的**存储**选项卡上找到。

1. 实例进入 `running` 状态后，创建实例根卷的快照。有关更多信息，请参阅 [Create a snapshot of an EBS volume](https://docs.aws.amazon.com/ebs/latest/userguide/ebs-create-snapshot.html)。

1. 将创建的快照注册为 AMI。在块设备映射中，指定您为根卷创建的快照。

   以下是 [register-image](https://docs.aws.amazon.com/cli/latest/reference/ec2/register-image.html) 命令示例。对于 `--tpm-support`，请指定 `v2.0`。对于 `--boot-mode`，请指定 `uefi`。

   ```
   aws ec2 register-image \
       --name my-image \
       --boot-mode uefi \
       --architecture x86_64 \
       --root-device-name /dev/xvda \
       --block-device-mappings DeviceName=/dev/xvda,Ebs={SnapshotId=snap-0abcdef1234567890} \
       --tpm-support v2.0
   ```

   以下是 [Register-EC2Image](https://docs.aws.amazon.com/powershell/latest/reference/items/Register-EC2Image.html) cmdlet 的示例。

   ```
   $block = @{SnapshotId=snap-0abcdef1234567890}
   Register-EC2Image `
       -Name my-image `
       -Architecture "x86_64" `
       -RootDeviceName /dev/xvda `
       -BlockDeviceMapping @{DeviceName="/dev/xvda";Ebs=$block} `
       -BootMode Uefi `
       -TpmSupport V20
   ```

1. 终止您在步骤 1 中启动的临时实例。

# 验证是否为 NitroTPM 启用了 AMI
<a name="verify-nitrotpm-support-on-ami"></a>

要为实例启用 NitroTPM，必须使用启用了 NitroTPM 的 AMI 启动该实例。您可以描述图像以验证是否为 NitroTPM 启用了该图像。如果您是 AMI 所有者，则可以描述 `tpmSupport` 图像属性。

Amazon EC2 控制台不显示 `TpmSupport`。

------
#### [ AWS CLI ]

**验证是否启用了 NitroTPM**  
使用 [describe-images](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-images.html) 命令。

```
aws ec2 describe-images \
    --image-ids ami-0abcdef1234567890 \
    --query Images[*].TpmSupport
```

如果为 AMI 启用了 NitroTPM，输出将如下所示。如果并未启用 TPM，则输出为空。

```
[
    "v2.0"
]
```

或者，如果您是 AMI 所有者，则可以将 [describe-image-attribute](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-image-attribute.html) 命令与 `tpmSupport` 属性配合使用。

```
aws ec2 describe-image-attribute \
    --image-id ami-0abcdef1234567890 \
    --attribute tpmSupport
```

 下面是示例输出。

```
{
    "ImageId": "ami-0abcdef1234567890",
    "TpmSupport": {
        "Value": "v2.0"
    }
}
```

**查找启用了 NitroTPM 的 AMI**  
以下示例列出了您拥有的已启用 NitrotPM 的 AMI ID。

```
aws ec2 describe-images \
    --owners self \
    --filters Name=tpm-support,Values=v2.0 \
    --query Images[].ImageId
```

------
#### [ PowerShell ]

**验证是否启用了 NitroTPM**  
使用 [Get-EC2Image](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2Image.html) cmdlet。

```
Get-EC2Image `
    -ImageId ami-0abcdef1234567890 | Select TpmSupport
```

如果为 AMI 启用了 NitroTPM，输出将如下所示。如果并未启用 TPM，则输出为空。

```
TpmSupport
----------
v2.0
```

或者，如果您是 AMI 所有者，则可以将 [Get-EC2ImageAttribute](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2ImageAttribute.html) cmdlet 与 `tpmSupport` 属性配合使用。

```
Get-EC2ImageAttribute `
    -ImageId ami-0abcdef1234567890 `
    -Attribute tpmSupport
```

**查找启用了 NitroTPM 的 AMI**  
以下示例列出了您拥有的已启用 NitrotPM 的 AMI ID。

```
Get-EC2Image `
    -Owner self `
    -Filter @{Name="tpm-support; Values="v2.0"} | Select ImageId
```

------

# 在 Amazon EC2 实例上启用或停止使用 NitroTPM
<a name="nitrotpm-instance"></a>

您只能在启动时为 NitroTPM 启用 Amazon EC2 实例。为 NitroTPM 启用实例后，您无法禁用该实例。如果您不再需要使用 NitroTPM，则必须配置操作系统以停止使用它。

**Topics**
+ [在启用 NitroTPM 的情况下启动实例](#launch-instance-with-nitrotpm)
+ [停止在实例上使用 NitroTPM](#disable-nitrotpm-support-on-instance)

## 在启用 NitroTPM 的情况下启动实例
<a name="launch-instance-with-nitrotpm"></a>

当您启动具有[先决条件](enable-nitrotpm-prerequisites.md)的实例时，将自动在该实例上启用 NitroTPM。您只能在启动时在实例上启用 NitroTPM。有关启动实例的信息，请参阅 [启动 Amazon EC2 实例](LaunchingAndUsingInstances.md)。

## 停止在实例上使用 NitroTPM
<a name="disable-nitrotpm-support-on-instance"></a>

在启动已启用 NitroTPM 的实例后，您将无法为该实例禁用 NitroTPM。但您可以使用以下工具，将操作系统配置为停止使用 NitroTPM，方法是禁用实例上的 TPM 2.0 设备驱动程序：
+ 对于 **Linux 实例**，请使用 tpm-tools。
+ 对于 **Windows 实例**，请使用 TPM 管理控制台（tpm.msc）。

有关禁用设备驱动程序的更多信息，请参阅您的操作系统的文档。

# 验证是否为 NitroTPM 启用了 Amazon EC2 实例
<a name="verify-nitrotpm-support-on-instance"></a>

您可以验证是否为 NitroTPM 启用了 Amazon EC2 实例。如果在实例上启用了 NitroTPM 支持，则该命令将返回 `"v2.0"`。否则，输出内容中不会显示 `TpmSupport` 字段。

Amazon EC2 控制台不显示 `TpmSupport` 字段。

------
#### [ AWS CLI ]

**验证是否为 NitroTPM 启用了实例**  
可以使用 [describe-instances](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instances.html) 命令。

```
aws ec2 describe-instances \
    --instance-ids i-1234567890abcdef0 \
    --query Reservations[].Instances[].TpmSupport
```

------
#### [ PowerShell ]

**验证是否为 NitroTPM 启用了实例**  
使用 [Get-EC2Instance](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2Instance.html) cmdlet。

```
(Get-EC2Instance `
    -InstanceId i-1234567890abcdef0).Instances.TpmSupport
```

------

## 验证您的 Windows 实例上的 nitroTPM 访问权限
<a name="verify-nitrotpm-support-windows-instance"></a>

**（仅限 Windows 实例）验证 Windows 是否可以访问 NitroTPM**

1. [连接到您的 EC2 Windows 实例。](connecting_to_windows_instance.md)

1. 在该实例上，运行 tpm.msc 程序。

   **TPM Management on Local Computer**（本地电脑上的 TPM 管理）窗口将打开。

1. 检查 **TPM Manufacturer Information**（TPM 制造商信息）字段。它包含制造商的名称和实例上的 NitroTPM 版本。  
![\[“TPM Management on Local Computer”（本地电脑上的 TPM 管理）窗口和“TPM Manufacturer Information”（TPM 制造商信息）字段显示实例上的 NitroTPM 版本。\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/images/tpm-1.png)

# 检索 EC2 实例的公有认可密钥
<a name="retrieve-ekpub"></a>

您可以随时安全地检索实例的公有认可密钥。

------
#### [ AWS CLI ]

**检索实例的公有认可密钥**  
使用 [get-instance-tpm-ek-pub](https://docs.aws.amazon.com/cli/latest/reference/ec2/get-instance-tpm-ek-pub.html) 命令。

**示例 1**  
以下示例以 `tpmt` 格式获取指定实例的 `rsa-2048` 公有认可密钥。

```
aws ec2 get-instance-tpm-ek-pub \
    --instance-id i-1234567890abcdef0 \
    --key-format tpmt \ 
    --key-type rsa-2048
```

下面是示例输出。

```
{
    "InstanceId": "i-01234567890abcdef",
    "KeyFormat": "tpmt",
    "KeyType": "rsa-2048",
    "KeyValue": "AAEACwADALIAIINxl2dEhLEXAMPLEUal1yT9UtduBlILZPKh2hszFGmqAAYAgABDA
    EXAMPLEAAABAOiRd7WmgtdGNoV1h/AxmW+CXExblG8pEUfNm0LOLiYnEXAMPLERqApiFa/UhvEYqN4
    Z7jKMD/usbhsQaAB1gKA5RmzuhSazHQkax7EXAMPLEzDthlS7HNGuYn5eG7qnJndRcakS+iNxT8Hvf
    0S1ZtNuItMs+Yp4SO6aU28MT/JZkOKsXIdMerY3GdWbNQz9AvYbMEXAMPLEPyHfzgVO0QTTJVGdDxh
    vxtXCOu9GYf0crbjEXAMPLEd4YTbWdDdgOKWF9fjzDytJSDhrLAOUctNzHPCd/92l5zEXAMPLEOIFA
    Ss50C0/802c17W2pMSVHvCCa9lYCiAfxH/vYKovAAE="
}
```

**示例 2**  
以下示例以 `der` 格式获取指定实例的 `rsa-2048` 公有认可密钥。

```
aws ec2 get-instance-tpm-ek-pub \
    --instance-id i-1234567890abcdef0 \
    --key-format der \ 
    --key-type rsa-2048
```

下面是示例输出。

```
{
    "InstanceId": "i-1234567890abcdef0",
    "KeyFormat": "der",
    "KeyType": "rsa-2048",
    "KeyValue": "MIIBIjANBgEXAMPLEw0BAQEFAAOCAQ8AMIIBCgKCAQEA6JF3taEXAMPLEXWH8DGZb4
    JcTFuUbykRR82bQs4uJifaKSOv5NGoEXAMPLEG8Rio3hnuMowP+6xuGxBoAHWAoDlGbO6FJrMdEXAMP
    LEnYUHvMO2GVLsc0a5ifl4buqcmd1FxqRL6I3FPwe9/REXAMPLE0yz5inhI7ppTbwxP8lmQ4qxch0x6
    tjcZ1Zs1DP0EXAMPLERUYLQ/Id/OBU7RBNMlUZ0PGG/G1cI670Zh/RytuOdx9iEXAMPLEtZ0N2A4pYX
    1+PMPK0lIOGssA5Ry03Mc8J3/3aXnOD2/ASRQ4gUBKznQLT/zTZEXAMPLEJUe8IJr2VgKIB/Ef+9gqi
    8AAQIDAQAB"
}
```

------
#### [ PowerShell ]

**检索实例的公有认可密钥**  
使用 [Get-EC2InstanceTpmEkPub](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2InstanceTpmEkPub.html) cmdlet。

**示例 1**  
以下示例以 `tpmt` 格式获取指定实例的 `rsa-2048` 公有认可密钥。

```
Get-EC2InstanceTpmEkPub `
    -InstanceId i-1234567890abcdef0 `
    -KeyFormat tpmt `
    -KeyType rsa-2048
```

**示例 2**  
以下示例以 `der` 格式获取指定实例的 `rsa-2048` 公有认可密钥。

```
Get-EC2InstanceTpmEkPub `
    -InstanceId i-1234567890abcdef0 `
    -KeyFormat der `
    -KeyType rsa-2048
```

------

# Amazon EC2 实例认证
<a name="nitrotpm-attestation"></a>

认证是一种过程，使您能够以加密方式向任何方证明，Amazon EC2 实例上仅运行可信软件、驱动程序和启动流程。Amazon EC2 实例认证由 Nitro 可信平台模块（NitroTPM）和*可证明的 AMI* 提供支持。

认证的第一步是**构建可证明的 AMI** 并确定该 AMI 的*参考测量值*。可证明的 AMI 是专为认证而从头构建的 AMI。参考测量值是对您的 AMI 中包含的所有软件和配置的测量值。有关如何获取参考测量值，请参阅[构建示例映像描述](build-sample-ami.md)。

![\[使用可证明的 AMI 生成参考测量值。\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/images/attestable-ami.PNG)


下一步是使用可证明的 AMI 启动[启用 Nitro-TPM 的 EC2 实例](enable-nitrotpm-prerequisites.md#nitrotpm-instancetypes)。启动实例后，您可以使用 [NitroTPM 工具](attestation-get-doc.md)生成*认证文档*。然后，您可以将认证文档中 EC2 实例的实际测量值与参考测量值进行比较，以检查该实例是否有您信任的软件和配置。

通过将可证明的 AMI 创建过程中生成的参考测量值与实例认证文档中包含的测量值进行比较，您可以验证是否只有您信任的软件和代码在实例上运行。

![\[生成认证文档。\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/images/attestation-document.PNG)


## 与 AWS KMS 集成
<a name="attestation-kms"></a>

为了简化比较测量值的过程，可以使用 AWS Key Management Service（AWS KMS）作为认证文档的验证程序。借助 AWS KMS，您可以创建基于认证的 KMS 密钥策略，仅当您向认证文档提供的测量值与参考测量值匹配时，才允许使用 KMS 密钥进行特定操作。为此，您需要向使用参考测量值作为条件键值的 KMS 密钥策略添加特定的条件键，然后指定如果满足条件键则允许哪些 KMS 操作。

使用 KMS 密钥执行 KMS 操作时，必须将认证文档附加到 KMS 请求。然后，AWS KMS 根据 KMS 密钥策略中的参考测量值验证认证文档中的测量值，并且仅在测量值匹配时才允许访问密钥。

此外，在为实例生成认证文档时，必须为自己拥有的密钥对指定公有密钥。指定的公有密钥包含在认证文档中。AWS KMS 验证认证文档并允许解密操作时，它会自动使用认证文档中包含的公有密钥对响应进行加密，然后再将其返回。这可确保响应只能使用与认证文档中所包含公有密钥的匹配私有密钥进行解密和使用。

这可确保只有运行可信软件和代码的实例才能使用 KMS 密钥执行加密操作。

## 认证隔离的计算环境
<a name="attestation-isolated-compute-environments"></a>

通常，您可以构建一个 EC2 实例并将其配置为**隔离的计算环境**，该环境不提供交互式访问权限，也不会为管理员和用户提供访问 EC2 实例中正在处理的数据的机制。借助 EC2 实例认证，您可以向第三方或服务证明您的实例正在作为隔离的计算环境运行。有关更多信息，请参阅 [将数据与您自己的操作员隔离](isolate-data-operators.md)。

有关示例，请参阅创建隔离计算环境的[示例 Amazon Linux 2023 映像描述](build-sample-ami.md)。您可以将此示例映像描述作为起点，并对其进行自定义，以满足您的要求。

## AWS 责任共担模式
<a name="attestation-shared-responsibility"></a>

NitroTPM 和可证明的 AMI 是构建基块，可以帮助您在 EC2 实例上设置和配置认证。您负责配置 AMI 以满足相应使用案例。有关更多信息，请参阅 [AWS 责任共担模式](https://aws.amazon.com/compliance/shared-responsibility-model/)。

**Topics**
+ [与 AWS KMS 集成](#attestation-kms)
+ [认证隔离的计算环境](#attestation-isolated-compute-environments)
+ [AWS 责任共担模式](#attestation-shared-responsibility)
+ [可证明的 AMI](attestable-ami.md)
+ [为认证准备 AWS KMS](prepare-attestation-service.md)
+ [获取 NitroTPM 认证文档](attestation-get-doc.md)
+ [集成 AWS KMS](attestation-attest.md)
+ [将数据与您自己的操作员隔离](isolate-data-operators.md)

# 可证明的 AMI
<a name="attestable-ami"></a>

可证明的 AMI 是具有相应加密哈希的亚马逊机器映像（AMI），该哈希代表其所有内容。哈希值在 AMI 创建过程中生成，并根据该 AMI 的全部内容（包括应用程序、代码和启动过程）计算得出。

## 保持可认证的状态
<a name="maintain-attestability"></a>

实例的测量值基于其初始启动状态。启动后对实例所做的任何软件或代码更改，如果在重启后仍然存在，都将在重启后更改实例的测量值。如果测量值发生更改，它们就会偏离可证明的 AMI 的参考测量值，并且实例在实例重启后将无法再成功向 AWS KMS 认证。因此，要使可证明的 AMI 发挥作用，实例需要在其重启后恢复到其原始启动状态。

始终返回到原始启动状态可确保实例在重启后能够成功认证。以下实用程序可用于确保实例在重启后保持可认证状态：
+ `erofs`：增强型只读文件系统。此实用程序可确保您的根文件系统是只读的。使用此实用程序，对文件系统（包括 `/etc`、`/run` 和 `/var`）的写入将存储在内存中，并在实例重新启动时丢失，从而使根文件系统保持其原始启动状态。有关更多信息，请参阅 [erofs 文档](https://docs.kernel.org/filesystems/erofs.html)。
+ `dm-verity`：为只读根文件系统提供完整性保护。该实用程序计算文件系统块的哈希值并将其存储在内核命令行中。这使内核能够在启动期间验证文件系统的完整性。有关更多信息，请参阅 [dm-verity 文档](https://docs.kernel.org/admin-guide/device-mapper/verity.html)。

## 创建可证明的 AMI 的要求
<a name="ami-attestable-requirements"></a>

可证明的 AMI 有以下要求：
+ **基础操作系统**：Amazon Linux 2023 和 [NixOS](https://github.com/aws/nitrotpm-attestation-samples)
+ **架构**：`x86_64` 或 `arm64` 架构
+ **TPM 支持**：必须启用 NitroTPM。有关更多信息，请参阅 [将 NitroTPM 与 Amazon EC2 实例结合使用的要求](enable-nitrotpm-prerequisites.md)。
+ **启动模式**：必须启用 UEFI 启动模式。

**Topics**
+ [保持可认证的状态](#maintain-attestability)
+ [创建可证明的 AMI 的要求](#ami-attestable-requirements)
+ [创建可证明的 AMI](#sample-ami)
+ [构建示例映像描述](build-sample-ami.md)
+ [示例 Amazon Linux 2023 映像描述](al2023-isolated-compute-recipe.md)
+ [自定义示例映像描述](customize-sample-ami.md)
+ [计算 PCR 测量值](create-pcr-compute.md)

## 创建可证明的 AMI
<a name="sample-ami"></a>

要创建可证明的 AMI，您需要将 Amazon Linux 2023 与[下一代 KIWI（KIWI NG）](https://osinside.github.io/kiwi/)配合使用。Amazon Linux 2023 提供了使用 KIWI NG 构建可证明的 AMI 所需的所有软件和实用工具。

KIWI NG 是一款开源工具，用于构建预配置的基于 Linux 的映像。KIWI NG 使用 XML *映像描述*来定义映像的内容。映像描述指定了要运行的基本操作系统、软件、内核配置和脚本，以便为特定使用案例构建即用型 AMI。

在 AMI 构建期间，您需要使用 `nitro-tpm-pcr-compute` 实用程序根据 KIWI NG 生成的统一内核映像（UKI）生成参考测量值。有关使用 `nitro-tpm-pcr-compute` 实用程序的更多信息，请参阅[计算自定义 AMI 的 PCR 测量值](create-pcr-compute.md)。

AWS 提供了示例 Amazon Linux 2023 映像描述，其中包括在隔离的计算环境中配置 EC2 实例所需的所有配置。有关更多信息，请参阅 [构建示例 Amazon Linux 2023 映像描述](build-sample-ami.md)。

# 构建示例 Amazon Linux 2023 映像描述
<a name="build-sample-ami"></a>

AWS 提供了示例 Amazon Linux 2023 映像描述，您可以将其作为创建自定义可证明的 AMI 的起点，以满足自己的工作负载需求。示例映像描述包括作为基本操作系统的 Amazon Linux 2023，用于文件系统不可变性的 `dm-verity` 和 `erofs` 配置，其删除了所有交互式访问权限（例如 SSH、EC2 实例连接和串行控制台），以创建隔离的计算环境。有关示例映像描述的更多信息，请参阅 [Github repo](https://github.com/amazonlinux/kiwi-image-descriptions-examples)。

示例映像描述会自动在构建映像的 `/usr/bin/` 目录中安装 NitroTPM 工具（`nitro-tpm-pcr-compute` 和 `nitro-tpm-attest`）。这可确保从 AMI 启动的实例上已预安装这些工具。

示例映像描述包含一个脚本 `edit_boot_install.sh`，其中包含生成参考测量值所需的命令。该脚本将 KIWI NG 创建的原始磁盘映像文件 (`.raw`) 挂载到环回设备，找到文件扩展名为 `.efi` 的 UKI，然后运行 `nitro-tpm-pcr-compute` 实用程序来生成 AMI 的参考测量值。该脚本由 KIWI NG 在构建期间自动执行。

本教程向您展示如何构建示例映像描述以创建可证明的 AMI。

有关创建您自己的映像描述的更多信息，请参阅以下 KIWI NG 文档：
+ [快速入门](https://osinside.github.io/kiwi/quickstart.html)
+ [映像描述](https://osinside.github.io/kiwi/image_description.html)
+ [示例 Amazon Linux 2023 映像描述](https://github.com/amazonlinux/kiwi-image-descriptions-examples)

先决条件

您的 IAM 身份必须具有以下权限才能完成本教程：
+ `arn:aws:ec2:*::snapshot/*` 上的 `ebs:CompleteSnapshot`、`ebs:StartSnapshot`、`ebs:PutSnapshotBlock` 权限
+ 对所有资源的 `ec2:RegisterImage`

**使用 KIWI NG 构建示例 Amazon Linux 2023 映像描述**

1. 使用最新的 AL2023 AMI 启动 Amazon EC2 实例。为确保您的实例有足够的存储空间来构建 AMI，请确保预置至少 12 GB 的存储空间。

1. 安装所需的依赖项。以下命令将安装以下实用程序：
   + `kiwi-cli`
   + `veritysetup`
   + `erofs-utils`
   + `aws-nitro-tpm-tools`

   ```
   sudo dnf install -y kiwi-cli python3-kiwi kiwi-systemdeps-core python3-poetry-core qemu-img veritysetup erofs-utils git cargo aws-nitro-tpm-tools
   ```

1. 安装 `coldsnap` 实用程序。此实用程序使您能够根据原始映像数据创建 Amazon EBS 快照。您将使用此实用程序根据 KIWI NG 创建的原始磁盘映像文件创建 EBS 快照。

   ```
   git clone https://github.com/awslabs/coldsnap.git
   cd coldsnap
   cargo install --locked coldsnap
   cd ..
   ```

1. 获取示例映像描述文件。

   ```
   sudo dnf install kiwi-image-descriptions-examples
   ```

   示例映像描述文件将下载到以下目录：`/usr/share/kiwi-image-descriptions-examples/al2023/attestable-image-example`

1. 使用 KIWI NG `system build` 命令生成示例映像描述。以下命令将在 `./image` 目录中创建原始磁盘映像文件。

   ```
   sudo kiwi-ng \
   --color-output \
   --loglevel 0 \
   system build \
   --description /usr/share/kiwi-image-descriptions-examples/al2023/attestable-image-example \
   --target-dir ./image
   ```

   有关更多信息，请参阅 [kiwi-ng system build](https://osinside.github.io/kiwi/commands/system_build.html) 文档。

1. 获取 AMI 的参考测量值。这些测量值由 `nitro-tpm-pcr-compute` 实用程序在上一步的映像构建过程中生成。您可在以下文件中找到参考测量值：`./image/pcr_measurements.json`。

   这些测量值均使用以下 JSON 格式提供：

   ```
   {
     "Measurements": {
       "HashAlgorithm": "SHA384 { ... }",
       "PCR4": "PCR4_measurement",
       "PCR7": "PCR7_measurement",
       "PCR12": "PCR12_measurement"
     }
   }
   ```

1. 使用 `coldsnap` 实用程序将 KIWI NG 创建的原始磁盘映像上传到 EBS 快照。该命令将返回快照 ID。记下该 ID，您需要在下一步中使用它。

   ```
   SNAPSHOT=$(.cargo/bin/coldsnap upload ./image/al2023*.raw)
   echo "Created snapshot: $SNAPSHOT"
   ```

   有关 `coldsnap` 实用程序的更多信息，请参阅 [coldsnap GitHub repo](https://github.com/awslabs/coldsnap)。

1. 使用上一步中的快照注册启用 TPM 2.0 且具有 UEFI 启动模式 的 AMI。对于 `--architecture`，请为 Intel 指定 `x86_64`，或为 Graviton 指定 `arm64`。

   ```
   aws ec2 register-image \
   --name "attestable_isolated_al2023_ami" \
   --virtualization-type hvm \
   --boot-mode uefi \
   --architecture x86_64|arm64 \
   --root-device-name /dev/xvda \
   --block-device-mappings DeviceName=/dev/xvda,Ebs={SnapshotId=${SNAPSHOT}} \
   --tpm-support v2.0 \
   --ena-support
   ```

# 示例 Amazon Linux 2023 映像描述
<a name="al2023-isolated-compute-recipe"></a>

示例 Amazon Linux 2023 映像描述具有以下特性：

1. **统一内核映像（UKI）启动**：使用单个带签名的二进制文件启动，该二进制文件将内核、`initrd` 和启动参数组合成一个不可变的映像。

1. **只读根文件系统**：使用带有 dm-verity 保护功能的增强型只读文件系统 (`erofs`)，确保根文件系统无法进行修改并保持加密完整性验证。

1. **临时覆盖文件系统**：创建一个临时覆盖文件系统，允许临时写入 `/etc`、`/run` 和 `/var` 等目录。由于此覆盖文件系统仅存在于内存中，因此当实例重启时，所有更改都会自动丢失，从而确保系统恢复到其原始可信状态。

1. **禁用远程访问方法**：移除以下远程访问机制以防止远程访问：    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/al2023-isolated-compute-recipe.html)

   \$1 有关更多信息，请参阅 [Image Description Elements](https://osinside.github.io/kiwi/image_description/elements.html#packages-ignore)。

# 为您的工作负载自定义示例 Amazon Linux 2023 映像描述
<a name="customize-sample-ami"></a>

您可以自定义示例 Amazon Linux 2023 映像描述，并包括特定工作负载所需的软件包、脚本和文件。自定义通过添加或修改 KIWI NG 映像描述中的各种元素来实现。

**Topics**
+ [存储库管理](#prepare-custom-image-repos)
+ [程序包管理](#customize-sample-ami-packages)
+ [添加文件和目录](#customize-sample-ami-overlay)
+ [添加自定义脚本](#customize-sample-ami-script)

## 存储库管理
<a name="prepare-custom-image-repos"></a>

默认情况下，示例映像描述包括一个 `<repository>` 元素，指向 Amazon Linux 2023 核心存储库的镜像端点。如果需要，您可以添加对其他存储库的引用，以从中安装所需软件。

示例映像描述使用 `<packagemanager>` 元素中定义的 `dnf` 包管理器。

有关添加存储库的更多信息，请参阅 [Setting up Repositories](https://osinside.github.io/kiwi/concept_and_workflow/repository_setup.html)。

## 程序包管理
<a name="customize-sample-ami-packages"></a>

默认情况下，示例映像描述包括为具有 `erofs` 只读文件系统的隔离计算环境创建 Amazon Linux 2023 可证明的 AMI 所需的所有包。

您可以将其他软件包添加到映像描述中的 `<packages>` 元素中，从而在映像描述中添加这些软件包。`<packages>` 元素定义了应安装到 AMI 中的所有软件。

您也可以使用 `<packages>` 元素来卸载或删除特定的软件包。

有关在映像描述中添加或移除包的更多信息，请参阅 [Adding and Removing Packages](https://osinside.github.io/kiwi/concept_and_workflow/packages.html#)。

## 添加文件和目录
<a name="customize-sample-ami-overlay"></a>

示例映像描述包括覆盖树目录 (`/root/`)。覆盖树目录是一个目录，其中包含将在映像构建过程中复制到映像中的文件和目录。在映像构建过程中，您放在覆盖树目录中的任何文件和目录都将直接复制到映像的根文件系统中。

安装完所有包后，覆盖树目录将复制到映像中。此时添加新文件并覆盖现有文件。

## 添加自定义脚本
<a name="customize-sample-ami-script"></a>

示例映像描述包含一个自定义脚本 `edit_boot_install.sh`。该脚本包含运行 `nitro-tpm-pcr-compute` 实用程序所需的命令，该实用程序会根据映像内容生成参考测量值。安装启动加载程序后，将立即调用此脚本。

如果需要，您可以在映像描述中包含自己的自定义脚本，以在映像构建过程中或首次启动映像时执行任务或配置。使用脚本使您能够以仅使用映像描述无法实现的方式自定义映像。

要在映像描述中包含自定义脚本，您需要根据脚本类型正确命名这些脚本，并将其添加到与 `appliance.kiwi` 文件相同的目录中。如果脚本命名正确且放在正确的位置，KIWI NG 会自动检测并执行脚本，而无需在映像描述文件中进行显式引用。

有关 KIWI NG 支持的脚本的更多信息，请参阅 [User-Defined Scripts](https://osinside.github.io/kiwi/concept_and_workflow/shell_scripts.html)。

# 计算自定义 AMI 的 PCR 测量值
<a name="create-pcr-compute"></a>

`nitro-tpm-pcr-compute` 实用程序使您能够在构建期间根据可证明的 AMI 的统一内核映像（UKI）生成其参考测量值。

示例 Amazon Linux 2023 映像描述会自动将该实用程序安装到 `/usr/bin/` 目录中的内置映像。示例映像描述还包含一个脚本，其中包含在映像构建期间运行该实用程序生成参考测量值所需的命令。如果您使用示例映像描述，则无需安装或手动运行该实用程序。有关更多信息，请参阅 [构建示例 Amazon Linux 2023 映像描述](build-sample-ami.md)。

## 安装 `nitro-tpm-pcr-compute` 实用程序
<a name="nitro-tpm-compute-install"></a>

如果您使用 Amazon Linux 2023，则可以按如下方式从 Amazon Linux 存储库安装 `nitro-tpm-pcr-compute` 实用程序。

```
sudo yum install aws-nitro-tpm-tools
```

这些工具安装在 `/usr/bin` 目录中。

## 使用 `nitro-tpm-pcr-compute` 实用程序
<a name="nitro-tpm-compute-use"></a>

该实用程序提供用于生成参考测量值的单一命令 `nitro-tpm-pcr-compute`。

运行该命令时，您必须指定以下内容：
+ 统一内核映像 (`UKI.efi`)：标准启动和 UEFI 必需。

**要为可证明的 AMI 生成参考测量值，请执行以下操作：**  
使用以下命令和参数：

```
/usr/bin/nitro-tpm-pcr-compute \
--image UKI.efi
```

该实用程序使用以下 JSON 格式返回参考测量值：

```
{
  "Measurements": {
    "HashAlgorithm": "SHA384 { ... }",
    "PCR4": "PCR4_measurement",
    "PCR7": "PCR7_measurement",
    "PCR12": "PCR12_measurement"
  }
}
```

有关如何使用 `nitro-tpm-pcr-compute` 实用程序的实际示例，请参阅[示例 Amazon Linux 2023 映像描述](build-sample-ami.md)中包含的 `edit_boot_install.sh` 脚本。

# 为认证准备 AWS KMS
<a name="prepare-attestation-service"></a>

**注意**  
如果您要认证第三方服务，则必须构建自己的自定义机制来接收、解析和验证认证文档。有关更多信息，请参阅 [验证 NitroTPM 认证文档](nitrotpm-attestation-document-validate.md)。

创建可证明的 AMI 后，您应该拥有可用于验证来自 Amazon EC2 实例请求的参考测量值。AWS KMS 提供对使用 NitroTPM 认证的内置支持。

对用于加密机密数据的 AWS KMS 密钥，添加一个密钥策略：仅在 API 请求包含的认证文档的测量值与您在可证明的 AMI 创建过程中生成的参考测量值匹配时才允许访问密钥。使用 PCR4 和 PCR12 测量值进行标准启动，或使用 PCR7 测量值进行安全启动。这可确保只有使用可证明的 AMI 启动的实例发出的请求才能使用 AWS KMS 密钥执行加密操作。

AWS KMS 提供 `kms:RecipientAttestation:NitroTPMPCR4`、`kms:RecipientAttestation:NitroTPMPCR7` 和 `kms:RecipientAttestation:NitroTPMPCR12` 条件键，使您能够为 NitroTPM KMS 密钥策略创建基于认证的条件。有关更多信息，请参阅 [NitroTPM 的条件键](https://docs.aws.amazon.com/kms/latest/developerguide/conditions-nitro-tpm.html)。

例如，以下 AWS KMS 密钥策略仅当请求源自附加 `MyEC2InstanceRole` 实例配置文件的实例，且请求包含具有特定 PCR 4 和 PCR 12 值的认证文档时，才允许访问密钥。

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "Allow requests from instances with attested AMI only",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::111122223333:role/MyEC2InstanceRole"
      },
      "Action": [
        "kms:Decrypt",
        "kms:GenerateDataKey",
        "kms:GenerateRandom"
      ],
      "Resource": "*",
      "Condition": {
        "StringEqualsIgnoreCase": {
          "kms:RecipientAttestation:NitroTPMPCR4":"EXAMPLE6b9b3d89a53b13f5dfd14a1049ec0b80a9ae4b159adde479e9f7f512f33e835a0b9023ca51ada02160EXAMPLE",
          "kms:RecipientAttestation:NitroTPMPCR12":"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
        }
      }
    }
  ]
}
```

# 获取 NitroTPM 认证文档
<a name="attestation-get-doc"></a>

认证文档是 NitroTPM 认证流程的关键组成部分。它包含一系列加密测量值，可用于验证实例的身份并证明其仅运行可信软件。您可以将认证文档与 AWS KMS（提供对 NitroTPM 认证的内置支持）一起使用，也可以构建自己的加密认证机制。

`nitro-tpm-attest` 实用程序使您能够在运行时检索 Amazon EC2 实例的已签名 NitroTPM 认证文档。

示例 Amazon Linux 2023 映像描述会自动将该实用程序安装到 `/usr/bin/` 目录中的内置映像。这可确保在使用 AMI 启动的实例上已预安装该实用程序。您无需手动安装该实用程序。有关更多信息，请参阅 [构建示例 Amazon Linux 2023 映像描述](build-sample-ami.md)。

**Topics**
+ [安装 `nitro-tpm-attest` 实用程序](#nitro-tpm-attest-install)
+ [使用 `nitro-tpm-attest` 实用程序](#nitro-tpm-attest-use)
+ [NitroTPM 认证文档](nitrotpm-attestation-document-content.md)
+ [验证认证文档](nitrotpm-attestation-document-validate.md)

## 安装 `nitro-tpm-attest` 实用程序
<a name="nitro-tpm-attest-install"></a>

如果您使用 Amazon Linux 2023，则可以按如下方式从 Amazon Linux 存储库安装 `nitro-tpm-attest` 实用程序。

```
sudo yum install aws-nitro-tpm-tools
```

## 使用 `nitro-tpm-attest` 实用程序
<a name="nitro-tpm-attest-use"></a>

该实用程序提供用于检索认证文档的单一命令 `nitro-tpm-attest`。该命令返回以简明二进制对象表示法（CBOR）编码并使用 CBOR 对象签名和加密（COSE）签名的认证文档。

运行该命令时，可指定以下可选的参数：
+ `public-key`：AWS KMS 或外部服务用于在返回响应数据之前对其进行加密的公有密钥。这可确保只有拥有私有密钥的预期接收者才能解密数据。例如，如果您使用 AWS KMS 进行认证，则该服务会使用认证文档中的公有密钥对纯文本数据进行加密，并在响应的 `CiphertextForRecipient` 字段中返回生成的加密文字。仅支持 RSA 密钥。
+ `user-data`：用户数据可用于将任何额外的签名数据传送到外部服务。此用户数据可用于完成请求实例与外部服务之间商定的协议。不用于使用 AWS KMS 的认证。
+ `nonce`：随机数可用于设置实例与外部服务之间的质询-响应身份验证，以帮助阻止冒充攻击。使用随机数使外部服务能够验证其是否与实时实例进行交互，而不是与重复使用旧认证文档的模拟者进行交互。不用于使用 AWS KMS 的认证。

**检索认证文档**  
使用以下命令和可选参数：

```
/usr/bin/nitro-tpm-attest \
--public-key rsa_public_key \
--user-data user_data \
--nonce nonce
```

有关展示如何生成 RSA 密钥对以及如何使用公有密钥请求认证的完整示例，请参阅 [nitro-tpm-attest GitHub repo](https://github.com/aws/NitroTPM-Tools/)。

# NitroTPM 认证文档内容
<a name="nitrotpm-attestation-document-content"></a>

认证文档由 NitroTPM 生成，并由 Nitro 虚拟机监控器签名。它包括一系列与 Amazon EC2 实例相关的平台配置寄存器（PCR）值。认证文档中包含以下 PCR：

**重要**  
PCR0 和 PCR1 通常用于测量由 AWS 控制的初始启动代码。为允许安全更新早期启动代码，这些 PCR 将始终包含常量值。
+ `PCR0`：核心系统固件可执行代码
+ `PCR1`：核心系统固件数据
+ `PCR2`：扩展或可插拔的可执行代码
+ `PCR3`：扩展或可插拔的固件数据
+ `PCR4`：启动管理器代码
+ `PCR5`：启动管理器代码配置和数据以及 GPT 分区表
+ `PCR6`：主机平台制造商详细信息
+ `PCR7`：安全启动策略
+ `PCR8 - 15`：定义为供静态操作系统使用
+ `PCR16`：调试
+ `PCR23`：应用程序支持

**PCR4**、**PCR7** 和 **PCR12** 专门用于验证实例是否使用可证明的 AMI 启动。PCR4 和 PCR12 可用于标准启动验证，PCR7 可用于安全启动验证。
+ **PCR4（启动管理器代码）**：当实例启动时，NitroTPM 会为其 UEFI 环境执行的所有二进制文件创建加密哈希值。使用可证明的 AMI，这些启动二进制文件会嵌入哈希值，阻止将来加载哈希值不匹配的二进制文件。这样，单个启动二进制文件哈希值就可以准确描述实例将执行的代码。
+ **PCR7（安全启动策略）**：UEFI 启动二进制文件可以使用 UEFI 安全启动签名密钥进行签名。启用 UEFI 安全启动后，UEFI 将阻止执行与配置的策略不匹配的 UEFI 启动二进制文件。PCR7 包含实例 UEFI 安全启动策略的哈希值。

  如果需要维护在实例更新期间持续存在的单一 KMS 策略，您可以创建一个针对 PCR7 进行验证的策略来验证 UEFI 安全启动证书。在创建可证明的 AMI 期间，您可以使用证书对启动二进制文件进行签名，并将其安装为 AMI 的 UEFI 数据中唯一允许的证书。请记住，如果您想阻止从旧的（不可信）AMI 启动的实例传递 KMS 策略，此模型仍要求您生成新证书、将其安装在您的策略中并更新 AMI。
+ **PCR12**：包含传递给 UEFI 启动二进制文件的命令行哈希值。需要与 PCR4 结合使用才能进行标准启动，以验证命令行是否未被修改。

# 验证 NitroTPM 认证文档
<a name="nitrotpm-attestation-document-validate"></a>

**注意**  
本主题面向使用第三方密钥管理服务并需要构建自己的证明文档验证机制的用户。

本主题详细介绍了整个 NitroTPM 认证流程。它还讨论了请求认证文档时 AWS Nitro 系统生成的内容，并解释了密钥管理服务应如何处理认证文档。

**Topics**
+ [认证文档](#doc-def)
+ [认证文档验证](#validation-process)

认证的目的是根据实例正在运行的代码和配置，证明实例是一个值得信赖的实体。实例的信任根位于 AWS Nitro 系统中，该系统提供认证文档。

认证文档由 AWS Nitro 认证公有密钥基础架构（PKI）签名，其中包含可以整合到任何服务中的已发布证书颁发机构。

## 认证文档
<a name="doc-def"></a>

认证文档以简明二进制对象表示法（CBOR）编码并使用 CBOR 对象签名和加密（COSE）签名。

有关 CBOR 的更多信息，请参阅 [RFC 8949: Concise Binary Object Representation (CBOR)](https://www.rfc-editor.org/rfc/rfc8949.html)。

### 认证文档规范
<a name="doc-spec"></a>

以下显示认证文档的结构。

```
AttestationDocument = {
    module_id: text,                     ; issuing Nitro hypervisor module ID
    timestamp: uint .size 8,             ; UTC time when document was created, in
                                         ; milliseconds since UNIX epoch
    digest: digest,                      ; the digest function used for calculating the
                                         ; register values
    nitrotpm_pcrs: { + index => pcr },   ; map of PCRs at the moment the Attestation Document was generated
    certificate: cert,                   ; the public key certificate for the public key 
                                         ; that was used to sign the Attestation Document
    cabundle: [* cert],                  ; issuing CA bundle for infrastructure certificate
    ? public_key: user_data,             ; an optional DER-encoded key the attestation
                                         ; consumer can use to encrypt data with
    ? user_data: user_data,              ; additional signed user data, defined by protocol
    ? nonce: user_data,                  ; an optional cryptographic nonce provided by the
                                         ; attestation consumer as a proof of authenticity
}

cert = bytes .size (1..1024)       ; DER encoded certificate
user_data = bytes .size (0..1024)
pcr = bytes .size (32/48/64)       ; PCR content
index = 0..31
digest = "SHA384"
```

认证文档中的可选参数（`public_key`、`user_data` 和 `nonce`）可用于在认证实例和外部服务之间建立自定义验证协议。

## 认证文档验证
<a name="validation-process"></a>

当您向 Nitro 虚拟机监控器请求认证文档时，您会收到一个包含已签名认证文档的二进制 blob。签名的认证文档是一个 CBOR 编码、COSE 签名（使用 COSE\$1Sign1 签名结构）的对象。整个验证过程包括以下步骤：

1. 解码 CBOR 对象并将其映射到 COSE\$1Sign1 结构。

1. 从 COSE\$1Sign1 结构中提取认证文档。

1. 验证该证书链。

1. 确保认证文档已正确签名。

认证文档由 AWS Nitro Attestation PKI 签名，其中包含商业 AWS 分区的根证书。根证书可从 [https://aws-nitro-enclaves.amazonaws.com/AWS\$1NitroEnclaves\$1Root-G1.zip](https://aws-nitro-enclaves.amazonaws.com/AWS_NitroEnclaves_Root-G1.zip) 下载，并可使用以下指纹进行验证。

```
64:1A:03:21:A3:E2:44:EF:E4:56:46:31:95:D6:06:31:7E:D7:CD:CC:3C:17:56:E0:98:93:F3:C6:8F:79:BB:5B
```

根证书基于 AWS Certificate Manager 私有证书颁发机构（AWS 私有 CA）的私有密钥，有效期为 30 年。PCA 的主题采用以下格式。

```
CN=aws.nitro-enclaves, C=US, O=Amazon, OU=AWS
```

**Topics**
+ [COSE 和 CBOR](#COSE-CBOR)
+ [语义有效性](#semantic-validation)
+ [证书有效性](#cert-validity)
+ [证书链有效性](#chain)

### COSE 和 CBOR
<a name="COSE-CBOR"></a>

通常，当一条消息中只需要放置一个签名时，会使用 COSE\$1Sign1 签名结构。处理内容和签名的参数放在受保护的标头中，而不是像 COSE\$1Sign 那样分开放置。该结构可以编码为带标签或不带标签，具体取决于其使用上下文。带标签的 COSE\$1Sign1 结构由 CBOR 标签 18 标识。

包含正文、签名以及正文和签名相关信息的 CBOR 对象称为 COSE\$1Sign1 结构。COSE\$1Sign1 结构是一个 CBOR 数组。该数组包含以下字段。

```
[
  protected:   Header,
  unprotected: Header,
  payload:     This field contains the serialized content to be signed,
  signature:   This field contains the computed signature value.
]
```

在认证文档上下文中，该数组包含以下内容。

```
18(/* COSE_Sign1 CBOR tag is 18 */
    {1: -35}, /* This is equivalent with {algorithm: ECDS 384} */
    {}, /* We have nothing in unprotected */
    $ATTESTATION_DOCUMENT_CONTENT /* Attestation Document */,
    signature /* This is the signature */
)
```

有关 CBOR 的更多信息，请参阅 [RFC 8949: Concise Binary Object Representation (CBOR)](https://www.rfc-editor.org/rfc/rfc8949.html)。

### 语义有效性
<a name="semantic-validation"></a>

认证文档的 CA 捆绑包始终按以下顺序排列。

```
[ ROOT_CERT - INTERM_1 - INTERM_2 .... - INTERM_N]
      0          1          2             N - 1
```

请记住此顺序，因为某些现有工具（例如《Java PKI API Programmer’s Guide》[https://docs.oracle.com/javase/8/docs/technotes/guides/security/certpath/CertPathProgGuide.html](https://docs.oracle.com/javase/8/docs/technotes/guides/security/certpath/CertPathProgGuide.html)中 Java 的 CertPath）可能会要求其按不同顺序排列。

要验证证书，请从认证文档的 CA 捆绑包开始并生成所需的链，其中 `TARGET_CERT` 为认证文档中的证书。

```
[TARGET_CERT, INTERM_N, ..... , INTERM_2, INTERM_1, ROOT_CERT]
```

### 证书有效性
<a name="cert-validity"></a>

对于证书链中的所有证书，您必须确保当前日期在证书中指定的有效期内。

### 证书链有效性
<a name="chain"></a>

通常，可能需要多个证书组成的证书链，包括由一个 CA 签名的公有密钥所有者证书，以及由其他 CA 签名的零个或多个其他 CA 证书。之所以需要这样的证书链（称为认证路径），是因为公有密钥用户仅初始化了有限数量有保证的 CA 公有密钥。互联网 PKI 的认证路径验证程序基于 X.509 中提供的算法。认证路径处理会验证主题可分辨名称和/或主题备用名称与主题公有密钥之间的绑定。绑定受证书中指定的约束以及依赖方所指定路径和输入的限制。基本限制和策略约束扩展允许认证路径处理逻辑自动执行决策过程。

**注意**  
进行验证时必须禁用 CRL。

使用 Java，从根路径和生成的证书链开始，证书链验证如下。

```
validateCertsPath(certChain, rootCertficate) {
    /* The trust anchor is the root CA to trust */
    trustAnchors.add(rootCertificate);

    /* We need PKIX parameters to specify the trust anchors
     * and disable the CRL validation
     */
    validationParameters = new PKIXParameters(trustAnchors);
    certPathValidator = CertPathValidator.getInstance(PKIX);
    validationParameters.setRevocationEnabled(false);

    /* We are ensuring that certificates are chained correctly */
    certPathValidator.validate(certPath, validationParameters);
}
```

# 集成 AWS KMS
<a name="attestation-attest"></a>

您的实例应包含一个应用程序，其能够使用从 NitroTPM 检索的认证文档发出 AWS KMS API 请求。当您使用认证文档发出请求时，AWS KMS 会根据 KMS 密钥策略中的参考测量值来验证所提供认证文档中的测量值。仅当认证文档中的测量值与 KMS 密钥策略中的参考测量值匹配时，才会允许请求。

当您使用认证文档调用 [Decrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html)、[DeriveSharedSecret](https://docs.aws.amazon.com/kms/latest/APIReference/API_DeriveSharedSecret.html)、[GenerateDataKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html)、[GenerateDataKeyPair](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKeyPair.html) 或 [GenerateRandom](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateRandom.html) API 操作时，这些 API 会使用认证文档中的公有密钥对响应中的明文进行加密，并返回加密文字而不是明文。此加密文字只能使用实例中生成的匹配私有密钥进行解密。

有关更多信息，请参阅《AWS Key Management Service Developer Guide》**中的 [Cryptographic attestation for NitroTPM](https://docs.aws.amazon.com/kms/latest/developerguide/services-nitro-enclaves.html)。

**注意**  
如果您要认证第三方服务，则必须构建自己的自定义机制来接收、解析和验证认证文档。有关更多信息，请参阅 [验证 NitroTPM 认证文档](nitrotpm-attestation-document-validate.md)。

# 将数据与您自己的操作员隔离
<a name="isolate-data-operators"></a>

AWS Nitro System 有[零操作员访问权限](https://docs.aws.amazon.com/whitepapers/latest/security-design-of-aws-nitro-system/no-aws-operator-access.html)。任何 AWS 系统或人员都无法登录 Amazon EC2 Nitro 主机、访问 EC2 实例的内存，或访问存储在本地加密实例存储或远程加密 Amazon EBS 卷上的任何客户数据。

处理高度敏感数据时，您可以考虑限制对这些数据的访问，甚至阻止自己的操作员访问 EC2 实例。

您可以创建自定义可证明的 AMI，并将其配置为提供隔离的计算环境。AMI 配置取决于您的工作负载和应用程序要求。在构建 AMI 以创建隔离计算环境时，请考虑以下最佳实践。
+ **移除所有交互式访问权限**，以阻止您的操作员或用户访问该实例。
+ **确保 AMI 中仅包含可信软件和代码**。
+ 在实例内**配置网络防火墙**以阻止访问。
+ **确保所有存储和文件系统为只读和不可变状态**。
+ 将**实例访问限制**为经过身份验证、已授权和已记录的 API 调用。

# 更新没有交互访问权限的可证明的 AMI
<a name="working-with-isolated-amis"></a>

使用隔离计算环境 AMI 启动实例后，任何用户或操作员都无法连接到该实例。这意味着启动后无法在该实例上安装或更新任何软件。

如果需要新软件或软件更新，则必须创建一个新的可证明的 AMI，其中包含所需软件或软件更新。然后，使用该 AMI 启动新实例，或在原始实例上执行根卷替换。对 AMI 所做的任何软件更改都将导致生成新的哈希值。

以下操作将导致 NitroTPM 认证文档中的参考测量值发生变化：
+ 停止和启动使用可证明的 AMI 启动的实例
+ 使用其他 AMI 执行根卷替换

如果您执行上述任何操作，则必须使用新的参考测量值更新您的认证服务。例如，如果您使用 AWS KMS 进行认证，则必须将 KMS 密钥策略更新为新的参考测量值。

实例在整个实例生命周期中都会保留其 NitroTPM 密钥材料，并在停止/启动和根卷替换操作中保持不变。

# 适用于 Windows 实例的凭证保护
<a name="credential-guard"></a>

AWS Nitro System 支持适用于 Amazon Elastic Compute Cloud（Amazon EC2）Windows 实例的凭证保护。凭证保护是一项基于 Windows 虚拟化的安全（VBS）功能，允许创建隔离环境以在 Windows 内核保护基础上提供安全资产保护，例如 Windows 用户凭证和代码完整性实施。运行 EC2 Windows 实例时，凭证保护将通过 AWS Nitro System 为 Windows 登录凭证提供保护，防止他人从操作系统内存中提取登录凭证。

**Topics**
+ [前提条件](#credential-guard-prerequisites)
+ [启动受支持的实例](#credential-guard-launch-instance)
+ [禁用内存完整性](#disable-memory-integrity)
+ [启用凭证保护](#turn-on-credential-guard)
+ [验证凭证保护是否正在运行](#verify-credential-guard)

## 前提条件
<a name="credential-guard-prerequisites"></a>

Windows 实例必须满足以下先决条件才能使用凭证保护。

**亚马逊机器映像（AMI）**  
必须预配置 AMI 才能启用 NitroTPM 与 UEFI 安全启动。有关支持的 AMI 的更多信息，请参阅 [将 NitroTPM 与 Amazon EC2 实例结合使用的要求](enable-nitrotpm-prerequisites.md)。

**内存完整性**  
*内存完整性*，也称为*虚拟机监控程序保护的代码完整性（HVCI）*或*虚拟机监控程序强制执行的代码完整性*不受支持。在开启凭证保护之前，您必须确保禁用此功能。有关更多信息，请参阅 [禁用内存完整性](#disable-memory-integrity)。

**实例类型**  
除非另有说明，以下实例类型支持所有大小的凭证保护：`C5`、`C5d`、`C5n`、`C6i`、`C6id`、`C6in`、`C7i`、`C7i-flex`、`M5`、`M5d`、`M5dn`、`M5n`、`M5zn`、`M6i`、`M6id`、`M6idn`、`M6in`、`M7i`、`M7i-flex`、`R5`、`R5b`、`R5d`、`R5dn`、`R5n`、`R6i`、`R6id`、`R6idn`、`R6in`、`R7i`、`R7iz`、`T3`。  
+ 尽管 NitroTPM 包含某些共同的必需实例类型，但实例类型必须是上述实例类型之一才能支持凭证保护。
+ 不支持凭证保护的类型包括：
  + 裸机实例。
  + 以下实例类型：`C7i.48xlarge`、`M7i.48xlarge` 和 `R7i.48xlarge`。
有关实例类型的信息，请参阅《[Amazon EC2 用户指南](https://docs.aws.amazon.com/ec2/latest/instancetypes/instance-types.html)》中的实例类型。

## 启动受支持的实例
<a name="credential-guard-launch-instance"></a>

您可以使用 Amazon EC2 控制台或 AWS Command Line Interface（AWS CLI）来启动可支持凭证保护的实例。您需要兼容的 AMI ID 来启动实例，该实例对于每个 AWS 区域 都是唯一的。

**提示**  
您可以通过以下链接，在 Amazon EC2 控制台中使用 Amazon 提供的兼容 AMI 来发现和启动实例：  
[https://console.aws.amazon.com/ec2/v2/home?#Images:visibility=public-images;v=3;search=:TPM-Windows_Server;ownerAlias=amazon](https://console.aws.amazon.com/ec2/v2/home?#Images:visibility=public-images;v=3;search=:TPM-Windows_Server;ownerAlias=amazon)

------
#### [ Console ]

**启动实例**  
按照[启动实例](ec2-launch-instance-wizard.md)的步骤操作，指定受支持的实例类型和预配置的 Windows AMI。

------
#### [ AWS CLI ]

**启动实例**  
使用 [https://docs.aws.amazon.com/cli/latest/reference/ec2/run-instances.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/run-instances.html) 命令，启动使用受支持的实例类型和预配置的 Windows AMI 的实例。

```
aws ec2 run-instances \
    --image-id resolve:ssm:/aws/service/ami-windows-latest/TPM-Windows_Server-2022-English-Full-Base \
    --instance-type c6i.large \
    --region us-east-1 \
    --subnet-id subnet-0abcdef1234567890
    --key-name key-name
```

------
#### [ PowerShell ]

**启动实例**  
使用 [https://docs.aws.amazon.com/powershell/latest/reference/items/New-EC2Instance.html](https://docs.aws.amazon.com/powershell/latest/reference/items/New-EC2Instance.html) 命令，启动使用受支持的实例类型和预配置的 Windows AMI 的实例。

```
New-EC2Instance `
    -ImageId resolve:ssm:/aws/service/ami-windows-latest/TPM-Windows_Server-2022-English-Full-Base `
    -InstanceType c6i.large `
    -Region us-east-1 `
    -SubnetId subnet-0abcdef1234567890 `
    -KeyName key-name
```

------

## 禁用内存完整性
<a name="disable-memory-integrity"></a>

在支持的场景中，您可以使用本地组策略编辑器禁用内存完整性。以下指导可以应用于**基于虚拟化的代码完整性保护**下的每个配置设置：
+ **启用（无锁定）**– 将设置修改为**禁用**以禁用内存完整性。
+ **使用 UEFI 锁定启用** – 已使用 UEFI 锁定启用内存完整性。使用 UEFI 锁定启用内存完整性后，将无法禁用它。我们建议创建一个禁用了内存完整性的新实例，并且在不使用该实例时将其终止。

**使用本地组策略编辑器禁用内存完整性**

1. 使用远程桌面协议（RDP），以具有管理员权限的用户账户身份连接到实例。有关更多信息，请参阅 [使用 RDP 客户端连接到 Windows 实例](connect-rdp.md)。

1. 打开“开始”菜单并搜索 **cmd** 以启动命令提示符。

1. 运行以下命令以打开本地组策略编辑器：`gpedit.msc`

1. 在本地组策略编辑器中，依次选择**计算机配置**、**管理模板**、**系统**、**设备保护**。

1. 选择**启用基于虚拟化的安全**，然后选择**编辑策略设置**。

1. 打开**基于虚拟化的代码完整性保护**的设置下拉列表，选择**禁用**，然后选择**应用**。

1. 重启实例以应用更改。

## 启用凭证保护
<a name="turn-on-credential-guard"></a>

启动具有受支持实例类型和兼容 AMI 的 Windows 实例并且确认内存完整性被禁用后，即可启用凭证保护。

**重要**  
需要管理员权限才能按照以下步骤启用凭证保护。

**启用凭证保护**

1. 使用远程桌面协议（RDP），以具有管理员权限的用户账户身份连接到实例。有关更多信息，请参阅 [使用 RDP 客户端连接到 Windows 实例](connect-rdp.md)。

1. 打开“开始”菜单并搜索 **cmd** 以启动命令提示符。

1. 运行以下命令以打开本地组策略编辑器：`gpedit.msc`

1. 在本地组策略编辑器中，依次选择**计算机配置**、**管理模板**、**系统**、**设备保护**。

1. 选择**启用基于虚拟化的安全**，然后选择**编辑策略设置**。

1. 在**启用基于虚拟化的安全**菜单中选择**启用**。

1. 对于**选择平台安全级别**，选择**安全启动和 DMA 保护**。

1. 对于**凭证保护配置**，选择**使用 UEFI 锁定启用**。
**注意**  
其余策略设置无需启用凭证保护，可以保留为**未配置**。

   下图显示了如前所述配置的 VBS 设置：  
![\[\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/images/vbs-credential-guard-gpo-enabled.png)

1. 重启实例以应用设置。

## 验证凭证保护是否正在运行
<a name="verify-credential-guard"></a>

您可以使用 Microsoft 系统信息 (`Msinfo32.exe`) 工具来确认凭证保护是否正在运行。

**重要**  
必须先重启实例才能应用启用凭证保护所需的策略设置。

**验证凭证保护是否正在运行**

1. 使用远程桌面协议（RDP）连接到实例。有关更多信息，请参阅 [使用 RDP 客户端连接到 Windows 实例](connect-rdp.md)。

1. 在实例的 RDP 会话中，打开“开始”菜单并搜索 **cmd** 以启动命令提示符。

1. 通过运行以下命令打开系统信息：`msinfo32.exe`

1. Microsoft 系统信息工具列出了 VBS 配置的详细信息。在基于虚拟化的安全服务旁边，确认**凭证保护**是否显示为**正在运行**。

   下图显示 VBS 正在运行，如前所述：  
![\[\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/images/vbs-credential-guard-msinfo32-enabled.png)

# 使用接口 VPC 端点访问 Amazon EC2
<a name="interface-vpc-endpoints"></a>

您可以通过在 VPC 中的资源和 Amazon EC2 API 之间创建私有连接来改善 VPC 的安保状况。您可以像在 VPC 中一样访问 Amazon EC2 API，而无需使用互联网网关、NAT 设备、VPN 连接或 Direct Connect 连接。VPC 中的 EC2 实例不需要公有 IP 地址即可访问 Amazon EC2 API。

有关更多信息，请参阅 *AWS PrivateLink 指南*中的[通过 AWS PrivateLink 访问 AWS 服务](https://docs.aws.amazon.com/vpc/latest/privatelink/privatelink-access-aws-services.html)。

**Topics**
+ [创建接口 VPC 端点](#create-endpoint)
+ [创建端点策略](#endpoint-policy)

## 创建接口 VPC 端点
<a name="create-endpoint"></a>

使用以下服务名称为 Amazon EC2 创建接口端点：
+ **com.amazonaws.*region*.ec2** - 为 Amazon EC2 API 操作创建端点。

有关更多信息，请参阅 *AWS PrivateLink 指南*中的[使用接口 VPC 端点访问 AWS 服务](https://docs.aws.amazon.com/vpc/latest/privatelink/create-interface-endpoint.html)。

## 创建端点策略
<a name="endpoint-policy"></a>

端点策略是一种 IAM 资源，您可以将其附加到接口端点。默认端点策略允许通过接口端点访问 Amazon EC2 API 的完全权限。要控制允许从 VPC 访问 Amazon EC2 API 的权限，请将自定义端点策略附加到接口端点。

端点策略指定以下信息：
+ 可以执行操作的主体。
+ 可执行的操作。
+ 可对其执行操作的资源。

**重要**  
当将非默认策略应用于 Amazon EC2 的接口 VPC 端点时，某些失败的 API 请求（例如 `RequestLimitExceeded` 中失败的请求）可能不会记录到 AWS CloudTrail 或 Amazon CloudWatch。

有关更多信息，请参阅 *AWS PrivateLink 指南*中的[使用端点策略控制对服务的访问权限](https://docs.aws.amazon.com/vpc/latest/privatelink/vpc-endpoints-access.html)。

以下示例显示一个 VPC 端点策略，该策略拒绝创建未加密的卷或启动具有未加密卷的实例的权限。示例策略还授予执行所有其他 Amazon EC2 操作的权限。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
    {
        "Action": "ec2:*",
        "Effect": "Allow",
        "Resource": "*",
        "Principal": "*"
    },
    {
        "Action": [
            "ec2:CreateVolume"
        ],
        "Effect": "Deny",
        "Resource": "*",
        "Principal": "*",
        "Condition": {
            "Bool": {
                "ec2:Encrypted": "false"
            }
        }
    },
    {
        "Action": [
            "ec2:RunInstances"
        ],
        "Effect": "Deny",
        "Resource": "*",
        "Principal": "*",
        "Condition": {
            "Bool": {
                "ec2:Encrypted": "false"
            }
        }
    }]
}
```

------