在企業應用與 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
- 進入 AWS WAF 控制台 → AWS WAF
- 建立 Web ACL
- 點擊 「Create web ACL」
- 選擇資源類型 → 選擇 CloudFront(CloudFront 為全球資源,因此 WAF 必須部署在 Global (CloudFront) 區域)
- 輸入 Web ACL 名稱(例如:
CloudFront-IP-Whitelist) - 點擊 Next
建立 IP 白名單規則
- 新增規則
- 點擊 「Add rules」 → 「Add my own rules and rule groups」
- 輸入規則名稱(例如:
AllowOnlyMyIP) - 規則類型 選擇 IP set
- 設定動作為 Allow
- 選擇「Create an IP set」
- 建立 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
- 單一 IP:
- 點擊「Create」並儲存
- 設定預設動作
- 返回 Web ACL 設定頁面
- Default action 設定為 Block(封鎖所有不在白名單中的 IP)
規則邏輯說明:
- Web ACL 會先檢查 IP 是否在白名單中(Allow 規則)
- 如果 IP 在白名單中,允許通過
- 如果 IP 不在白名單中,套用預設動作(Block)
將 WAF Web ACL 綁定 CloudFront
- 返回 Web ACL 主頁面 → 點擊 「Add AWS resources」
- 選擇 CloudFront Distribution
- 套用 Web ACL 到 CloudFront
- 儲存設定
生效時間:通常需要 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 日誌
- 進入 AWS WAF 控制台
- 選擇 Web ACL → Logging and metrics
- 啟用 CloudWatch Logging
- 透過 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 日誌,及時發現異常存取嘗試