2023-10-01|閱讀時間 ‧ 約 5 分鐘

AWS EC2 Instance metadata

EC2 Metadata 是可以從作業系統獲取的 EC2 信息,如 Instance ID、Instance 類型、所屬AZ等。例如,您可以通過將Instance ID 放在作業系統上運行的腳本的數據中來使 Logs 更易於查看。

獲取 Metadata 的方法是Instance Meta Data Service(IMDS) 在 169.254.169.254 使用 link-local IP,可以通過 curl 等命令訪問獲取。

Instance Metadata Service Version 1 (IMDSv1) – a request/response method
Instance Metadata Service Version 2 (IMDSv2) – a session-oriented method

預設情況下,您可以使用 IMDSv1 或 IMDSv2,或同時使用兩者。

IMDSv1 只要用GET方法執行上述命令就可以獲取 metadata,所以如果攻擊者可以將GET方法發送給Instance。(IMDS本身就是安全的)。

但是 IMDSv2,使用 PUT 方法獲取 metadata,需要 PUT 方法頒發的 TOKEN,這使得攻擊更加困難,並允許您配置更強的安全性。


EC2 Instance metadata 版本選擇

創建EC2 控制台 → 啟動 Instance → 在“高級詳細信息”項中,可以 啟用可訪問性 並選擇 metadata 版本

預設 Instance metadata 為同時使用兩者

IMDSv1

IMDSv2

PUT使用請求創建一個持續六小時(21,600 秒)的 Session TOKEN


IMDSv2 的工作原理

IMDSv2 使用 session 的請求。對於 Session 的請求,您可以創建一個Session TOKEN 來定義Session持續時間,該持續時間最短為一秒,最長為六小時。


使用 EC2 IMDSv2 改進與好處

  • 訪問 v2 需要預先獲取的 Token

1.Token需要通過PUT獲取
2.Token請求時可以設置過期日期(秒)
3.必須在標頭中請求令牌

  • v1 可以禁用(默認可以一起使用)
  • Metadata 服務本身可以被禁用
  • 使用 IAM 權限限制,只能在啟動 EC2 實例時強制您將其設置為 v2
  • 不要向帶有 X-Forwarded-For 標頭的請求發出 Token
  • 可以縮短 Metadata 響應的 TTL 以防止通過多個主機獲取
  • 防止 SSRF 漏洞攻擊


關於 SSRF 漏洞攻擊

SSRF 是 Server-Side Request Forgery 的縮寫,是一種攻擊者偽造服務器發出的請求的攻擊。簡單來說,就是攻擊者利用易受攻擊的服務器向內部服務器發送攻擊請求的攻擊

如果您的創建 Web 服務器是有漏洞的,攻擊者將能夠訪問該 Instance metadata,並且可以使用 IAM 權限以及服務器內部的信息進行攻擊,這是一種危險的攻擊

使用IMDSv1 :

易受攻擊的網頁請求

範例程式

<?php
$target = isset($_GET['target']) ? $_GET['target'] : null;
if ($target == null){
echo "no result";
exit();
}

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $target);
$output = curl_exec($ch);

curl_close($ch);

print_r($output);
?>


解決方式


方法ㄧ 修改請求方式需要 TOKEN(關閉IMDSv1)

方法二關閉 metadata

補充

HttpPutResponseHopLimit (Integers from 1 to 64)

IMDSv2 需要 PUT 來檢索Token。這個參數設置限制了對該 PUT 的response在被網路丟棄之前的跳數,httpPutResponseHopLimit該設置的默認值為 1。

這意味著如果您距離 IMDS 不止一個網路跳點,那麼您將收到錯誤消息。最常見的原因是您在 docker 容器中運行。


分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.