使用 IMDSv2 - Amazon Elastic Compute Cloud

使用 IMDSv2

您可以使用以下其中一個方法,從執行中的執行個體存取執行個體中繼資料:

  • 執行個體中繼資料服務第 1 版 (IMDSv1) – 請求/回應方法

  • 執行個體中繼資料服務第 2 版 (IMDSv2) – 工作階段導向方法

依預設,您可以使用 IMDSv1 或 IMDSv2,或兩者。執行個體中繼資料服務會依據任何指定請求 (PUTGET 標頭) 來區分 IMDSv1 及 IMDSv2 請求,這些對 IMDSv2 而言是唯一的內容,會出現在該請求中。如需詳細資訊,請參閱 透過 EC2 執行個體中繼資料服務的增強功能,提高開放式防火牆、反向代理伺服器及 SSRF (伺服器端請求偽造) 弱點的防禦能力

您可以在每個執行個體上設定執行個體中繼資料服務,此類本機程式碼或使用者必須使用 IMDSv2。當您指定必須使用該 IMDSv2 時,IMDSv1 則無法繼續運作。如需詳細資訊,請參閱 設定執行個體中繼資料選項

若要擷取執行個體中繼資料,請參閱擷取執行個體中繼資料

注意

本節中的範例使用執行個體中繼資料服務的 IPv4 地址:169.254.169.254。如果您要透過 IPv6 地址擷取 EC2 執行個體的執行個體中繼資料,請確定您啟用並改用 IPv6 地址:fd00:ec2::254。執行個體中繼資料服務的 IPv6 地址與 IMDSv2 命令相容。IPv6 地址只能在 建置在 Nitro 系統上的執行個體 上存取。

執行個體中繼資料服務第 2 版 的運作方式

IMDSv2 會使用工作階段導向請求。使用工作階段導向請求,您就能建立定義工作階段持續期間的工作階段字符,此期間最短 1 秒,最長可達 6 小時。在指定持續期間,您可以將相同的工作階段字符用於後續請求。在指定持續期間到期之後,您必須建立新的工作階段字符,才能使用未來請求。

下列範例會使用 PowerShell Shell 指令碼和 IMDSv2,以擷取上層執行個體中繼資料項目。範例:

  • 使用 PUT 請求,建立持續 6 小時 (21,600 秒) 的工作階段字符

  • 將工作階段字符標頭儲存到名為 token 的變數

  • 使用字符請求上層中繼資料項目

PS C:\> [string]$token = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} -Method PUT -Uri http://169.254.169.254/latest/api/token
PS C:\> Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri http://169.254.169.254/latest/meta-data/

建立字符之後,您可以重複使用直到到期為止。在下列範例命令中,其中會取得用於啟動執行個體的 AMI ID,會重複使用前一個範例中 $token 中儲存的字符。

PS C:\> Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} ` -Method GET -uri http://169.254.169.254/latest/meta-data/ami-id

當您使用 IMDSv2 請求執行個體中繼資料時,請求必須包含下列項目:

  1. 使用 PUT 請求,在執行個體中繼資料服務中起始工作階段。PUT 請求會傳回一個字符,其必須包含在執行個體中繼資料服務的後續 GET 請求中。字符必須使用 IMDSv2 存取中繼資料。

  2. 將字符包含在執行個體中繼資料服務的所有 GET 請求。字符使用方式設定為 required 時,不包含有效字符或字符已到期的請求會收到 401 - Unauthorized HTTP 錯誤碼。如需變更字符使用方式需求的資訊,請參閱 AWS CLI 命令參考中的 modify-instance-metadata-options

    • 字符是執行個體特定金鑰。字符在其他 EC2 執行個體上無效,而且如果您嘗試在產生字符的執行個體外部使用該字符,則會遭到拒絕。

    • PUT 請求必須包含指定字符存留時間 (TTL),時間會以秒數表示且最長可達 6 小時 (21,600 秒)。字符會代表邏輯工作階段。TTL 會指定字符有效的時間長度,也就是工作階段的持續期間。

    • 在字符到期之後,若要繼續存取執行個體中繼資料,您必須使用另一個 PUT 建立新的工作階段。

    • 您可以選擇重複使用字符或使用每個請求來建立新字符。對於少量請求,您每次需要存取執行個體中繼資料服務時,就能更輕鬆地產生和立即使用字符。但為了提升效率,您可以為該字符指定時間更長的持續期間,然後再重複使用該字符,而不需要在每次要請求執行個體中繼資料時寫入 PUT。並行字符數量沒有實際限額,每個都代表它自己的工作階段。但 IMDS2 仍會受到正常執行個體中繼資料服務連線和調節限額的限制。如需詳細資訊,請參閱 查詢調節

HTTP GETHEAD 方法可在 IMDSv2 執行個體中繼資料請求中使用。如果 PUT 請求包含 X-Forwarded-For 標頭,則會遭到拒絕。

依預設,PUT 請求在 IP 通訊協定等級的 1 回應跳轉限額 (存留時間)。如果您需要增長時間,您可以使用 modify-instance-metadata-options 命令調整跳轉限額。例如,您可以需要較大的跳轉限額,才能與執行個體上執行之容器服務回溯相容。如需詳細資訊,請參閱 AWS CLI 命令參考中的 modify-instance-metadata-options

轉換為使用 執行個體中繼資料服務第 2 版

可選擇使用 Instance Metadata Service Version 2 (IMDSv2)。Instance Metadata Service Version 1 (IMDSv1) 將持續無限期受到支援。如果您選擇使用 IMDSv2 進行移轉,我們建議您使用下列工具和轉換路徑。

協助轉換至 IMDSv2 的工具

如果您的軟體使用 IMDSv1,請使用下列工作,以協助將您的軟體重新設定為使用 IMDSv2。

AWS 軟體

AWS CLI 和 AWS 開發套件的最新版本支援 IMDSv2。若要使用 IMDSv2,請確定 EC2 執行個體有最新版本的 CLI 及開發套件。如需有關更新 CLI 的資訊,請參閱 AWS Command Line Interface 使用者指南中的安裝、更新和解除安裝 AWS CLI

所有 Amazon Linux 2 軟體套件都支援 IMDSv2。

CloudWatch

IMDSv2 會使用權杖後端工作階段,而 IMDSv1 不會。MetadataNoToken CloudWatch 指標會追蹤對正在使用 IMDSv1 的執行個體中繼資料服務的呼叫次數。透過追蹤此指標至零,您可以決定是否要升級所有軟體以使用 IMDSv2 及升級時間。如需詳細資訊,請參閱 執行個體指標

EC2 API 和 CLI 的更新

對於現有執行個體,您可以使用 modify-instance-metadata-options CLI 命令 (或 ModifyInstanceMetadataOptions API) 以要求使用 IMDSv2。對於新執行個體,您可以使用 run-instances CLI 命令 (或 RunInstances API) 及 metadata-options 參數,以啟動需要使用 IMDSv2 的新執行個體。

如需要求 Auto Scaling 群組啟動的所有新執行個體都能在 IMDSv2 上使用,您的 Auto Scaling 群組可以使用啟動範本或啟動組態。當您建立啟動範本建立啟動組態時,必須設定 MetadataOptions 參數以要求使用 IMDSv2。設定啟動範本或啟動組態後,Auto Scaling 群組會使用新的啟動範本或啟動組態來啟動新的執行個體,但現有的執行個體不會受到影響。

使用 modify-instance-metadata-options CLI 命令 (或 ModifyInstanceMetadataOptions API) 以要求在現有的執行個體上使用 IMDSv2,或終止執行個體,Auto Scaling 群組會使用啟動範本中定義的執行個體中繼資料選項設定,啟動新的取代執行個體或啟動組態。

使用預設情況下設定 IMDSv2 的 AMI

當您啟動執行個體時,您可以自動將其設定為預設使用 IMDSv2 (HttpTokens 參數設為 required),方法是透過 AMI 來加以啟動,該 AMI 的 ImdsSupport 參數設定為 v2.0。當您使用 register-image CLI 命令註冊 AMI 時,您會將 ImdsSupport 參數設為 v2.0。如需詳細資訊,請參閱 設定 AMI

IAM 政策和 SCP

您可以如下所示,使用 IAM 政策或 AWS Organizations 服務控制政策 (SCP) 來控制 IAM 使用者:

  • 除非執行個體設定為使用 IMDSv2,否則無法使用 RunInstances API 啟動執行個體。

  • 無法使用 ModifyInstanceMetadataOptions API 修改執行中的執行個體來重新啟用 IMDSv1。

IAM 政策或 SCP 必須包含下列 IAM 條件索引鍵:

  • ec2:MetadataHttpEndpoint

  • ec2:MetadataHttpPutResponseHopLimit

  • ec2:MetadataHttpTokens

如果 API 或 CLI 呼叫中的參數與包含條件索引鍵之政策中指定的狀態不相符,則 API 或 CLI 呼叫會失敗並顯示 UnauthorizedOperation 回應。

此外,您可以選擇另外一個保護層,以強制執行從 IMDSv1 變更為 IMDSv2 的作業。相對於透過 EC2 角色憑證呼叫的 API,在存取管理層中,您可以在 IAM 政策或 AWS Organizations 服務控制政策 (SCP) 中使用新的條件金鑰。具體而言,在 IAM 政策中使用數值為 2.0 的條件索引鍵 ec2:RoleDelivery,從 IMDSv1 取得之 EC2 角色憑證產生的 API 呼叫都會收到 UnauthorizedOperation 回應。也能利用 SCP 要求的條件進行更廣泛範圍的作業。這可確保透過 IMDSv1 提供的登入資料無法確實用於呼叫 API,因為與指定條件不相符的任何 API 呼叫,將會收到 UnauthorizedOperation 錯誤。

如需 IAM 政策的範例,請參閱使用執行個體中繼資料。如需 SCP 的詳細資訊,請參閱 AWS Organizations User Guide (《AWS Organizations 使用者指南》) 中的 Service Control Policies (服務控制政策)。

建議路徑需要 IMDSv2 存取

使用上述工具時,我們建議您遵循此路徑來轉換至 IMDSv2:

步驟 1:開始時

將開發套件、CLI 以及在其 EC2 執行個體上使用角色憑證的軟體更新為 IMDSv2 相容版本。如需有關更新 CLI 的資訊,請參閱 AWS Command Line Interface 使用者指南中的升級至最新版本的 AWS CLI

之後,使用 IMDSv2 請求變更可直接存取執行個體中繼資料的軟體 (換言之,就是未使用軟體開發套件的軟體)。

步驟 2:追蹤轉換進度

使用 CloudWatch 指標 MetadataNoToken 追蹤您的轉換進度。此指標會顯示對您執行個體上正在使用 IMDSv1 的執行個體中繼資料服務的呼叫次數。如需詳細資訊,請參閱 執行個體指標

步驟 3:當 IMDSv1 使用量為零時

當 CloudWatch 指標 MetadataNoToken 記錄零 IMDSv1 使用量時,執行個體已準備好完全轉換為使用 IMDSv2。在這個階段,您可以執行下列操作:

  • 新執行個體

    啟動新執行個體時,您可以執行下列操作:

    • Amazon EC2 主控台:在啟動執行個體精靈中,將 Metadata accessible (可存取中繼資料) 設定為 Enabled (已啟用),並將 Metadata version (中繼資料版本) 設定為 V2 only (token required) (僅 V2 (需要權杖))。如需詳細資訊,請參閱 啟動時設定執行個體

    • AWS CLI:使用 run-instances CLI 命令,指定僅使用 IMDSv2。

  • 現有執行個體

    :您可以透過 modify-instance-metadata-options CLI 命令要求使用 IMDSv2。您可以對執行中的執行個體進行這些變更,您也不需要重新啟動執行個體。

注意

現有執行個體的更新執行個體中繼資料選項只能透過 API 或 AWS CLI 使用。它目前無法在 Amazon EC2 主控台中使用。如需詳細資訊,請參閱 設定執行個體中繼資料選項

步驟 4:所有執行個體都已轉換至 IMDSv2 時

ec2:MetadataHttpTokensec2:MetadataHttpPutResponseHopLimitec2:MetadataHttpEndpoint IAM 條件金鑰可用來控制 RunInstancesModifyInstanceMetadataOptions API 並對應 CLI 的使用情況。如果已建立政策,而且 API 呼叫中的參數與使用條件金鑰之政策中指定的狀態不相符,則 API 或 CLI 會失敗並顯示 UnauthorizedOperation 回應。如需 IAM 政策的範例,請參閱使用執行個體中繼資料