如何使用 AWS WAF 設定 CloudFront IP 白名單

🌏 Read the English version


在企業應用與 API 保護中,AWS CloudFront 提供了高效能的內容傳遞,但如何確保只有授權的 IP 能存取呢?本指南將介紹如何透過 AWS WAF 設定 CloudFront IP 白名單,提升安全性並防止未授權訪問。

為什麼需要 CloudFront IP 白名單?

常見使用場景:

  • 企業內部 API:只允許公司固定 IP 存取內部系統 API
  • 合作夥伴整合:限制僅特定合作夥伴 IP 能呼叫整合介面
  • 測試環境保護:避免測試環境被外部掃描或攻擊
  • 降低 DDoS 風險:限制來源 IP 範圍,減少分散式攻擊面

技術考量:

  • CloudFront 本身沒有 IP 白名單功能,必須透過 AWS WAF 實現
  • WAF 規則在 CloudFront 邊緣節點執行,不影響快取效能
  • 適用於需要額外安全層的應用,但會增加管理成本

步驟 1:查詢 CloudFront 來源 IP

方法 1:使用 nslookup 解析網址

首先,查詢 CloudFront 解析出的 IP 地址:

nslookup example.com

方法 2:使用 dig 解析網址

dig +short example.com

範例輸出:

example.com canonical name = dxxxxxxxxxx.cloudfront.net.
Name: dxxxxxxxxxx.cloudfront.net
Address: 13.35.185.65
Address: 13.35.185.104
Address: 13.35.185.53
Address: 13.35.185.46

這表示 CloudFront 使用 dxxxxxxxxxx.cloudfront.net 作為 CNAME,並對應到 Amazon CloudFront 的 IP 位址。

注意事項:

  • CloudFront IP 會動態變化,不建議直接針對這些 IP 設定白名單
  • 應該針對用戶端來源 IP(訪問 CloudFront 的 IP)設定白名單
  • 如果需要限制 CloudFront 與 Origin 之間的通訊,應使用 CloudFront 自訂標頭或 Origin Access Identity (OAI)

步驟 2:設定 AWS WAF 限制 IP 存取 CloudFront

AWS WAF 可以透過 Web ACL 控制哪些 IP 可以存取 CloudFront。

建立 AWS WAF Web ACL

  1. 進入 AWS WAF 控制台AWS WAF
  2. 建立 Web ACL
    • 點擊 「Create web ACL」
    • 選擇資源類型 → 選擇 CloudFront(CloudFront 為全球資源,因此 WAF 必須部署在 Global (CloudFront) 區域)
    • 輸入 Web ACL 名稱(例如:CloudFront-IP-Whitelist
    • 點擊 Next

建立 IP 白名單規則

  1. 新增規則
    • 點擊 「Add rules」「Add my own rules and rule groups」
    • 輸入規則名稱(例如:AllowOnlyMyIP
    • 規則類型 選擇 IP set
    • 設定動作為 Allow
    • 選擇「Create an IP set」
  2. 建立 IP Set
    • 點擊 「Create IP set」
    • 輸入 IP Set 名稱(例如 MyIPWhitelist
    • 選擇範圍為「Global (CloudFront)」
    • 輸入允許的 IP 或 IP 範圍
      • 單一 IP:203.0.113.5/32
      • IP 段(例如內部公司 IP):203.0.113.0/24
    • 點擊「Create」並儲存
  3. 設定預設動作
    • 返回 Web ACL 設定頁面
    • Default action 設定為 Block(封鎖所有不在白名單中的 IP)

規則邏輯說明:

  • Web ACL 會先檢查 IP 是否在白名單中(Allow 規則)
  • 如果 IP 在白名單中,允許通過
  • 如果 IP 不在白名單中,套用預設動作(Block)

將 WAF Web ACL 綁定 CloudFront

  1. 返回 Web ACL 主頁面 → 點擊 「Add AWS resources」
  2. 選擇 CloudFront Distribution
  3. 套用 Web ACL 到 CloudFront
  4. 儲存設定

生效時間:通常需要 3-5 分鐘讓 WAF 規則在所有邊緣節點生效。

步驟 3:驗證 AWS WAF 是否生效

方法 1:使用 curl 測試

允許的 IP 測試

curl -I -X GET https://example.com/

預期回應

HTTP/2 200 OK

表示請求成功,IP 在白名單中。

非白名單 IP 測試

curl -I -X GET --interface eth1 https://example.com/

預期回應

HTTP/2 403 Forbidden

表示 WAF 成功封鎖未授權存取。

方法 2:檢查 AWS WAF 日誌

  1. 進入 AWS WAF 控制台
  2. 選擇 Web ACLLogging and metrics
  3. 啟用 CloudWatch Logging
  4. 透過 CloudWatch 檢查「被封鎖的請求」,確保非白名單 IP 確實被 WAF 阻擋

日誌內容包含:

  • 請求來源 IP
  • 請求時間
  • 匹配的規則
  • 採取的動作(Allow / Block)

AWS WAF 費用估算

AWS WAF 費用結構:

  • Web ACL(Web 存取控制清單):每個 Web ACL 每月 $5.00 美元
  • 規則(Rules):每條規則每月 $1.00 美元
  • 請求數(Requests):每百萬次請求 $0.60 美元

成本估算範例:

假設您使用一個 Web ACL,包含一條 IP 白名單規則,每月處理 1,000 萬個請求,則費用為:

  • Web ACL:$5.00 美元/月
  • 規則:$1.00 美元/月
  • 請求數:$0.60 × 10 = $6.00 美元/月

總計:約 $12.00 美元/月

注意:費用可能因 AWS 計價策略變動,請參閱官方定價進行最新估算。

常見問題與解決方案

問題 1:白名單 IP 仍然被封鎖

可能原因:

  • IP Set 中的 IP 格式錯誤(未使用 CIDR 格式,如 /32
  • WAF 規則優先順序設定錯誤(Block 規則優先於 Allow)
  • WAF 變更尚未在所有邊緣節點生效(需等待 3-5 分鐘)

解決方案:

  • 確認 IP Set 格式:單一 IP 使用 x.x.x.x/32,IP 段使用 x.x.x.0/24
  • 檢查規則順序:Allow 規則應在 Block 規則之前
  • 等待 5 分鐘後重新測試

問題 2:WAF 日誌未顯示封鎖記錄

可能原因:

  • 未啟用 WAF 日誌記錄
  • CloudWatch Logs 權限設定問題

解決方案:

  • 在 Web ACL 設定中啟用「Logging」
  • 確認 CloudWatch Logs 資源政策允許 WAF 寫入日誌

問題 3:動態 IP 環境如何設定白名單?

解決方案:

  • 使用 AWS Lambda 定期更新 IP Set(透過 API 自動更新)
  • 考慮使用 VPN 搭配固定 IP
  • 改用其他驗證方式(如 API Key、JWT Token)

結論

透過本指南,您已經完成:

  • 查詢 CloudFront 來源 IP,理解 CloudFront 與用戶端 IP 的差異
  • 設定 AWS WAF 限制 IP 存取 CloudFront,實施 Web ACL + IP Set 確保安全
  • 驗證 WAF 規則生效,確保非白名單 IP 回傳 403 Forbidden
  • 了解 AWS WAF 費用結構,幫助預測使用成本
  • 掌握常見問題與解決方案,避免設定錯誤

安全性提醒:

  • 定期檢視並更新白名單 IP,移除不再使用的 IP
  • 結合其他安全措施(如 SSL/TLS、API 驗證)建立多層防護
  • 監控 WAF 日誌,及時發現異常存取嘗試

Related Articles

Leave a Comment