

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 轉換為使用 執行個體中繼資料服務第 2 版
<a name="instance-metadata-transition-to-version-2"></a>

如果您想要將執行個體設定為只接受執行個體中繼資料服務第 2 版 (IMDSv2) 呼叫，建議您使用下列工具和轉換路徑。

**Topics**
+ [轉換至 IMDSv2 的工具](#tools-for-transitioning-to-imdsv2)
+ [需要 IMDSv2 的建議路徑](#recommended-path-for-requiring-imdsv2)

## 轉換至 IMDSv2 的工具
<a name="tools-for-transitioning-to-imdsv2"></a>

下列工具可協助您識別、監控和管理軟體從 IMDSv1 到 IMDSv2 的轉換。如需如何使用這些工具的指示，請參閱 [需要 IMDSv2 的建議路徑](#recommended-path-for-requiring-imdsv2)。

**AWS 軟體**  
最新版本的 AWS CLI 和 AWS SDKs 支援 IMDSv2。若要使用 IMDSv2，請更新您的 EC2 執行個體以使用最新版本。如需支援 IMDSv2 的最低 AWS SDK 版本，請參閱 [使用支援的 AWS SDK](configuring-instance-metadata-service.md#use-a-supported-sdk-version-for-imdsv2)。  
所有 Amazon Linux 2 和 Amazon Linux 2023 軟體套件都支援 IMDSv2。Amazon Linux 2023 預設會停用 IMDSv1。

**IMDS Packet Analyzer**  
IMDS Packet Analyzer 是一種開放原始碼工具，可在執行個體的開機階段和執行時間操作期間識別和記錄 IMDSv1 呼叫。透過分析這些日誌，您可以精確識別在執行個體上進行 IMDSv1 呼叫的軟體，並判斷哪些項目需要更新，才能僅在執行個體上支援 IMDSv2。您可以從命令列執行 IMDS Packet Analyzer，或將其安裝為服務。如需詳細資訊，請參閱 *GitHub* 上的 [AWS ImdsPacketAnalyzer](https://github.com/aws/aws-imds-packet-analyzer)。

**CloudWatch**  
CloudWatch 提供下列兩個指標來監控您的執行個體：  
`MetadataNoToken` – IMDSv2 使用字符後端工作階段，而 IMDSv1 不使用。`MetadataNoToken` 指標會追蹤呼叫使用 IMDSv1 的執行個體中繼資料服務 (IMDS) 的次數。透過追蹤此指標至零，您可以決定是否要升級所有軟體以使用 IMDSv2 及升級時間。  
`MetadataNoTokenRejected` – 停用 IMDSv1 之後，您可以使用 `MetadataNoTokenRejected` 指標來追蹤 IMDSv1 呼叫嘗試和拒絕的次數。透過追蹤此指標，您可以確定自己的軟體是否需要更新才能使用 IMDSv2。  
對於每個 EC2 執行個體，這些指標是互斥的。啟用 IMDSv1 時 `MetadataNoToken` (`httpTokens = optional`)，只會發出 。當 IMDSv1 停用時 `MetadataNoTokenRejected` (`httpTokens = required`)， 只會發出。如需何時使用這些指標，請參閱 [需要 IMDSv2 的建議路徑](#recommended-path-for-requiring-imdsv2)。  
如需詳細資訊，請參閱[執行個體指標](viewing_metrics_with_cloudwatch.md#ec2-cloudwatch-metrics)。

**啟動 APIs**  
**新執行個體：**使用 [RunInstances](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RunInstances.html) API 啟動需要使用 IMDSv2 的新執行個體。如需詳細資訊，請參閱[設定新執行個體的執行個體中繼資料選項](configuring-IMDS-new-instances.md)。  
**現有執行個體：**使用 [ModifyInstanceMetadataOptions](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyInstanceMetadataOptions.html) API 要求在現有執行個體上使用 IMDSv2。如需詳細資訊，請參閱[修改現有執行個體的執行個體中繼資料選項](configuring-IMDS-existing-instances.md)。  
**Auto Scaling 群組啟動的新執行個體：**若要要求在 Auto Scaling 群組啟動的所有新執行個體上使用 IMDSv2，Auto Scaling 群組可以使用啟動範本或啟動組態。當您[建立啟動範本](https://docs.aws.amazon.com/cli/latest/reference/ec2/create-launch-template.html)或[建立啟動組態](https://docs.aws.amazon.com/cli/latest/reference/autoscaling/create-launch-configuration.html)時，必須設定 `MetadataOptions` 參數以要求使用 IMDSv2。Auto Scaling 群組會使用新啟動範本或啟動組態來啟動新執行個體，但現有的執行個體不受影響。  
**Auto Scaling 群組中的現有執行個體：**使用 [ModifyInstanceMetadataOptions](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyInstanceMetadataOptions.html) API 要求在現有執行個體上使用 IMDSv2，或終止執行個體，Auto Scaling 群組將使用新啟動範本或啟動組態中定義的執行個體中繼資料選項設定來啟動新的替換執行個體。

**AMI**  
設定為 `ImdsSupport` 參數的 AMIs 預設`v2.0`會啟動需要 IMDSv2 的執行個體。Amazon Linux 2023 已使用 設定`ImdsSupport = v2.0`。  
**新 AMIs：**建立新的 AMI `v2.0`時，使用 [register-image](https://docs.aws.amazon.com/cli/latest/reference/ec2/register-image.html) CLI 命令將 `ImdsSupport` 參數設定為 。  
**現有 AMIs：**使用 [modify-image-attribute](https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-image-attribute.html) CLI 命令，在修改現有 AMI `v2.0`時將 `ImdsSupport` 參數設定為 。  
如需詳細資訊，請參閱[設定 AMI](configuring-IMDS-new-instances.md#configure-IMDS-new-instances-ami-configuration)。

**帳戶層級控制項**  
您可以在帳戶層級設定所有執行個體中繼資料選項的預設值。當您啟動執行個體時，會自動套用預設值。如需詳細資訊，請參閱[將 IMDSv2 設定為帳戶的預設值](configuring-IMDS-new-instances.md#set-imdsv2-account-defaults)。  
您也可以強制執行在帳戶層級使用 IMDSv2 的需求。啟用 IMDSv2 強制執行時：  
+ **新執行個體：**設定為在啟用 IMDSv1 的情況下啟動的執行個體將無法啟動
+ **停用 IMDSv1 的現有執行個體：**將防止嘗試在現有執行個體上啟用 IMDSv1。
+ **已啟用 IMDSv1 的現有執行個體：**已啟用 IMDSv1 的現有執行個體不會受到影響。
如需詳細資訊，請參閱[在帳戶層級強制執行 IMDSv2](configuring-IMDS-new-instances.md#enforce-imdsv2-at-the-account-level)。

**IAM 政策和 SCP**  
您可以使用 IAM 政策 AWS Organizations 或服務控制政策 (SCP) 來控制使用者，如下所示：  
+ 除非執行個體設定為使用 IMDSv2，否則無法使用 [RunInstances](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RunInstances.html) API 啟動執行個體。
+ 無法使用 [ModifyInstanceMetadataOptions](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyInstanceMetadataOptions.html) API 修改現有執行個體，以重新啟用 IMDSv1。
IAM 政策或 SCP 必須包含下列 IAM 條件索引鍵：  
+ `ec2:MetadataHttpEndpoint`
+ `ec2:MetadataHttpPutResponseHopLimit`
+ `ec2:MetadataHttpTokens`
如果 API 或 CLI 呼叫中的參數不符合包含條件金鑰的政策中指定的狀態，則 API 或 CLI 呼叫會失敗並顯示 `UnauthorizedOperation` 回應。  
此外，您可以選擇另外一個保護層，以強制執行從 IMDSv1 變更為 IMDSv2 的作業。在與透過 EC2 角色登入資料呼叫APIs 相關的存取管理層中，您可以在 IAM 政策 AWS Organizations 或服務控制政策 (SCPs) 中使用條件金鑰。具體而言，在 IAM 政策中使用數值為 `2.0` 的條件索引鍵 `ec2:RoleDelivery`，從 IMDSv1 取得之 EC2 角色憑證產生的 API 呼叫都會收到 `UnauthorizedOperation` 回應。也能利用 SCP 要求的條件進行更廣泛範圍的作業。這可確保透過 IMDSv1 提供的登入資料無法確實用於呼叫 API，因為與指定條件不相符的任何 API 呼叫，將會收到 `UnauthorizedOperation` 錯誤。  
如需 IAM 政策的範例，請參閱[使用執行個體中繼資料](ExamplePolicies_EC2.md#iam-example-instance-metadata)。如需 SCP 的詳細資訊，請參閱《*AWS Organizations 使用者指南*》中的[服務控制政策](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_scps.html)。

**宣告政策**  
使用宣告政策 ( 的功能 AWS Organizations) 在整個組織中集中設定 IMDS 帳戶預設值，包括 IMDSv2 強制執行。如需範例政策，請參閱*AWS Organizations 《 使用者指南*》中[支援的宣告政策](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_declarative_syntax.html#declarative-policy-examples)一節中的**執行個體中繼資料**索引標籤。

## 需要 IMDSv2 的建議路徑
<a name="recommended-path-for-requiring-imdsv2"></a>

**Topics**
+ [步驟 1：使用 IMDSv2=選用和稽核 IMDSv1 用量來識別執行個體](#path-step-1)
+ [步驟 2：將軟體更新至 IMDSv2](#path-step-2)
+ [步驟 3：執行個體需要 IMDSv2](#path-step-3)
+ [步驟 4：將 IMDSv2=必要設為預設值](#path-step-4)
+ [步驟 5：強制執行個體要求 IMDSv2](#path-step-5)

### 步驟 1：使用 IMDSv2=選用和稽核 IMDSv1 用量來識別執行個體
<a name="path-step-1"></a>

若要評估 IMDSv2 遷移範圍，請識別設定為允許 IMDSv1 或 IMDSv2 的執行個體，並稽核 IMDSv1 呼叫。

1. **識別設定為允許 IMDSv1 或 IMDSv2 的執行個體：**

------
#### [ Amazon EC2 console ]

   1. 前往 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) 開啟 Amazon EC2 主控台。

   1. 在導覽窗格中，選擇**執行個體**。

   1. 若要只查看設定為允許 IMDSv1 或 IMDSv2 的執行個體，請新增篩選條件 **IMDSv2 = 選用**。

   1. 或者，若要查看所有執行個體的 IMDSv2 是否為**選用**或**必要**，請開啟**偏好設定**視窗 （齒輪圖示），開啟 **IMDSv2**，然後選擇**確認**。這會將 **IMDSv2** 資料欄新增至**執行個體**資料表。

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

   使用 [describe-instances](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/modify-instance-metadata-options.html) 命令並依 篩選`metadata-options.http-tokens = optional`，如下所示：

   ```
   aws ec2 describe-instances --filters "Name=metadata-options.http-tokens,Values=optional" --query "Reservations[*].Instances[*].[InstanceId]" --output text
   ```

------

1. **在每個執行個體上稽核 IMDSv1 呼叫：**

   使用 CloudWatch 指標 `MetadataNoToken`。此指標會顯示對執行個體上 IMDS 的 IMDSv1 呼叫次數。如需詳細資訊，請參閱[執行個體指標](https://docs.aws.amazon.com/en_us/AWSEC2/latest/UserGuide/viewing_metrics_with_cloudwatch.html#ec2-cloudwatch-metrics)。

1. **在進行 IMDSv1 呼叫的執行個體上識別軟體：**

   使用開放原始碼 [IMDS Packet Analyzer](https://github.com/aws/aws-imds-packet-analyzer) 在執行個體的開機階段和執行時間操作期間識別和記錄 IMDSv1 呼叫。使用此資訊來識別要更新的軟體，讓您的執行個體準備好僅使用 IMDSv2。您可以從命令列執行 IMDS Packet Analyzer，或將其安裝為服務。

### 步驟 2：將軟體更新至 IMDSv2
<a name="path-step-2"></a>

將執行個體上使用角色登入資料的所有 SDKs、CLIs 和軟體更新為 IMDSv2-compatible版本。如需更新 CLI 的詳細資訊，請參閱《*AWS Command Line Interface 使用者指南*》中的[安裝或更新至 AWS CLI的最新版本](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)。

### 步驟 3：執行個體需要 IMDSv2
<a name="path-step-3"></a>

透過 `MetadataNoToken` 指標確認零 IMDSv1 呼叫後，請將您現有的執行個體設定為需要 IMDSv2。此外，將所有新執行個體設定為需要 IMDSv2。換句話說，在所有現有和新的執行個體上停用 IMDSv1。

1. **將現有執行個體設定為需要 IMDSv2：**

------
#### [ Amazon EC2 console ]

   1. 前往 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) 開啟 Amazon EC2 主控台。

   1. 在導覽窗格中，選擇 **Instances** (執行個體)。

   1. 選取執行個體。

   1. 選擇**動作**、**執行個體設定**、**修改執行個體中繼資料選項**。

   1. 針對 **IMDSv2**，請選擇**必要**。

   1. 選擇**儲存**。

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

   使用 [modify-instance-metadata-options](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/modify-instance-metadata-options.html) CLI 命令來指定僅使用 IMDSv2。

------
**注意**  
您可以在執行中的執行個體上修改此設定。變更會立即生效，而不需要重新啟動執行個體。

   如需詳細資訊，請參閱[需要使用 IMDSv2](configuring-IMDS-existing-instances.md#modify-require-IMDSv2)。

1. **在停用 IMDSv1 後監控問題：**

   1. 使用 `MetadataNoTokenRejected` CloudWatch 指標追蹤 IMDSv1 呼叫嘗試和拒絕的次數。

   1. 如果`MetadataNoTokenRejected`指標在遇到軟體問題的執行個體上記錄 IMDSv1 呼叫，這表示軟體需要更新才能使用 IMDSv2。

1. **設定新執行個體以要求 IMDSv2：**

------
#### [ Amazon EC2 console ]

   1. 前往 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) 開啟 Amazon EC2 主控台。

   1. 依照步驟[啟動執行個體](ec2-launch-instance-wizard.md)。

   1. 展開**進階詳細資訊**，對於**中繼資料版本**，**僅選擇 V2 （需要金鑰）**。

   1. 在 **Summary** (摘要) 面板中，檢閱您的執行個體組態，然後選擇 **Launch instance** (啟動執行個體)。

      如需詳細資訊，請參閱[啟動時設定執行個體](configuring-IMDS-new-instances.md#configure-IMDS-new-instances-instance-settings)。

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

   AWS CLI：使用 [run-instances](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/run-instances.html) 命令並指定需要 IMDSv2。

------

### 步驟 4：將 IMDSv2=必要設為預設值
<a name="path-step-4"></a>

您可以在帳戶或組織層級將 IMDSv2=必要設定為預設組態。這可確保所有新啟動的執行個體都會自動設定為需要 IMDSv2。

1. **設定帳戶層級預設值：**

------
#### [ Amazon EC2 console ]

   1. 前往 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) 開啟 Amazon EC2 主控台。

   1. 在導覽窗格中，選擇 **Dashboard (儀表板)**。

   1. 在**帳戶屬性**卡片**的設定**下，選擇**資料保護和安全性**。

   1. 在 **IMDS 預設值**下，選擇**管理**。

   1. 針對**執行個體中繼資料服務 **，選擇**已啟用**。

   1. 對於**中繼資料版本**，選擇**僅 V2 （需要金鑰）**。

   1. 選擇**更新**。

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

   使用 [modify-instance-metadata-defaults](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/modify-instance-metadata-defaults.html) CLI 命令並指定 `--http-tokens required`和 `--http-put-response-hop-limit 2`。

------

   如需詳細資訊，請參閱[將 IMDSv2 設定為帳戶的預設值](configuring-IMDS-new-instances.md#set-imdsv2-account-defaults)。

1. **或者，使用宣告政策設定組織層級預設值：**

   使用宣告政策將 IMDSv2 的組織預設值設定為必要。如需範例政策，請參閱*AWS Organizations 《 使用者指南*》中[支援的宣告政策](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_declarative_syntax.html#declarative-policy-examples)一節中的**執行個體中繼資料**索引標籤。

### 步驟 5：強制執行個體要求 IMDSv2
<a name="path-step-5"></a>

確認任何執行個體上沒有 IMDSv1 的相依性後，建議您在所有新執行個體上強制執行 IMDSv2。

使用下列其中一個選項來強制執行 IMDSv2：

1. **使用帳戶屬性強制執行 IMDSv2 **

   您可以在每個帳戶層級強制使用 IMDSv2 AWS 區域。強制執行時，執行個體只能在設定為需要 IMDSv2 時啟動。無論執行個體或 AMI 的設定方式為何，此強制執行都適用。如需詳細資訊，請參閱[在帳戶層級強制執行 IMDSv2](configuring-IMDS-new-instances.md#enforce-imdsv2-at-the-account-level)。若要在組織層級套用此設定，請設定宣告政策。如需範例政策，請參閱*AWS Organizations 《 使用者指南*》中[支援的宣告政策](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_declarative_syntax.html#declarative-policy-examples)一節中的**執行個體中繼資料**索引標籤。

   若要防止強制撤銷，您應該使用 IAM 政策來防止存取 [ModifyInstanceMetadataDefaults](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyInstanceMetadataDefaults.html) API。如需詳細資訊，請參閱[使用 IAM 政策](configuring-IMDS-new-instances.md#configure-IMDS-new-instances-iam-policy)。
**注意**  
此設定不會變更現有執行個體的 IMDS 版本，但會封鎖在目前已停用 IMDSv1 的現有執行個體上啟用 IMDSv1。
**警告**  
如果已啟用 IMDSv2 強制執行`httpTokens`，且在啟動時執行個體組態、帳戶設定或 AMI 組態`required`中未設定為 ，則執行個體啟動將會失敗。如需故障診斷資訊，請參閱[啟動IMDSv1-enabled的執行個體失敗](troubleshooting-launch.md#launching-an-imdsv1-enabled-instance-fails)。

1. **或者，使用以下 IAM 或 SCP 條件金鑰強制執行 IMDSv2：**
   + `ec2:MetadataHttpTokens`
   + `ec2:MetadataHttpPutResponseHopLimit`
   + `ec2:MetadataHttpEndpoint`

   這些條件金鑰控制 [RunInstances](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RunInstances.html) 和 [ModifyInstanceMetadataOptions](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyInstanceMetadataOptions.html) APIs和對應 CLIs。如果已建立政策，而且 API 呼叫中的參數與使用條件金鑰之政策中指定的狀態不相符，則 API 或 CLI 會失敗並顯示 `UnauthorizedOperation` 回應。

   如需 IAM 政策的範例，請參閱[使用執行個體中繼資料](ExamplePolicies_EC2.md#iam-example-instance-metadata)。