

# 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
```

------