如何設定 AWS WAF 以保護我的資源免受常見攻擊?
我想在資源上使用 AWS WAF 來防範常見的攻擊。
解決方法
注意: 如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤訊息,請參閱對 AWS CLI 錯誤進行疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本。
若要在資源上使用 AWS WAF 防範常見攻擊,請使用以下一或多個選項。
從 AWS WAF Classic 遷移至 AWS WAF
如果您使用 AWS WAF Classic,最佳實務是遷移至 AWS WAF。如需更多資訊,請參閱為什麼要遷移至 AWS WAF?
將資源與 Web ACL 建立關聯
首先,在 AWS WAF 中建立 Web ACL。然後,將資源與該 Web ACL 建立關聯,以允許 AWS WAF 監控傳入請求。如需更多資訊,請參閱可使用 AWS WAF 保護的資源。
可與 AWS WAF 整合的資源
對於可與 AWS WAF 整合的資源,請使用以下其中一個選項來整合資源:
- 在 AWS WAF 主控台,使用 Associated AWS resources (已建立關聯的 AWS 資源) 選項。如需更多資訊,請參閱建立 Web ACL。
- 在 AWS CLI,使用 associate-web-acl 命令。
- 在 CloudFront,使用 update-distribution 命令。
- 在 AWS Firewall Manager,使用 Firewall Manager AWS WAF 政策。
- 在 AWS Amplify 應用程式,直接在 Amplify 或 AWS WAF 主控台中與應用程式建立關聯。
無法與 AWS WAF 整合的資源
對於無法直接與 AWS WAF 整合的資源,請使用以下其中一個選項來整合資源:
- 在 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體,建立 Application Load Balancer 或 CloudFront 發佈項目。然後,將發佈項目與 Web ACL 建立關聯。
- 在 Amazon Elastic Kubernetes Service (Amazon EKS) 叢集,建立 Application Load Balancer。然後,將 Application Load Balancer 與 Web ACL 建立關聯。如需更多資訊,請參閱使用 AWS WAF 保護 Amazon EKS Web 應用程式。
- 在 Network Load Balancer,建立 Application Load Balancer。然後,將 Application Load Balancer 設為 Network Load Balancer 的目標,並將 Application Load Balancer 與 Web ACL 建立關聯。如需更多資訊,請參閱將 Application Load Balancer 用作 Network Load Balancer 的目標。
檢閱傳入請求以改善規則
若要判斷常見的請求模式,請使用 Application Load Balancer 或 CloudFront 存取日誌等應用程式日誌。
注意: 最佳實務是使用 AWS WAF 日誌來儲存、查詢和分析 HTTP 請求日誌。
判斷常見的請求模式後,將日誌儲存在 Amazon Simple Storage Service (Amazon S3) 或 Amazon CloudWatch 中。若要查詢日誌並識別模式,請使用 Amazon Athena 或 CloudWatch Logs Insights。
最後,在 Count (計數) 模式下建立驗證傳入請求的 AWS WAF 規則,然後將規則設為 Block (封鎖)。請執行以下動作:
- 建立 NOT 規則陳述式,並將其套用至 example.com 的主機標頭。注意: 將 example.com 替換為您的主機標頭。
- 將 Action (動作) 設為 Block (封鎖)。AWS WAF 會封鎖沒有您所指定主機標頭的請求。
注意: 此規則也會封鎖傳送至 AWS 所提供完整網域名稱 (FQDN) 的請求。
以下範例是您可能會遇到的常見請求模式。
要求不存在 URI 的請求
若要識別要求不存在 URI 的請求,您必須知道環境中支援的每個 URI。以下是對 AWS WAF 日誌執行的 Athena 查詢範例,此查詢會計算每個 URI 的請求數:
SELECT COUNT("httprequest"."uri") AS URIcount, "httprequest"."uri" FROM waf_logs GROUP BY "httprequest"."uri" ORDER BY URIcount DESC
以下是對 AWS WAF 日誌執行的 CloudWatch 查詢範例,此查詢會計算每個 URI 的請求數:
fields httpRequest.uri| stats count(*) as requestCount by httpRequest.uri| sort requestCount desc
包含不同主機標頭值的請求
此模式包含 HTTP 主機標頭不受 Web 伺服器支援的請求。此模式也包含使用 IP 位址而非網站網域名稱的請求。
以下是對 AWS WAF 日誌執行的 Athena 查詢範例,此查詢會計算包含不同主機標頭值的請求數:
SELECT header.value as HostHeader, count(header) as count FROM waf_logs, UNNEST(httprequest.headers) AS x(header) WHERE "header"."name" = 'Host' GROUP BY header ORDER BY count DESC
以下是對 AWS WAF 日誌執行的 CloudWatch 查詢範例,此查詢會計算包含不同主機標頭值的請求數:
fields @timestamp, @message| parse @message '{"name":"Host","value":"*"}' as host| stats count(*) as requestCount by host| sort requestCount desc
使用 AWS Managed Rules 協助防範常見攻擊
若要使用 AWS Managed Rules,請識別您想要防範的常見請求模式和攻擊。然後,新增相關的 AWS Managed Rules 規則群組。若要針對專門任務提供保護,請使用以下規則群組,並支付額外費用:
- AWS WAF Fraud Control 帳戶創建欺詐預防措施 (ACFP) 規則群組
- AWS WAF Fraud Control 帳戶盜用預防措施 (ATP) 規則群組
- AWS WAF 機器人控制功能規則群組
在計數模式下,將相關規則群組新增至 Web ACL。然後,檢閱 AWS WAF 日誌和 CloudWatch 指標,以判斷受管規則是否與合法流量相符。如果規則與合法流量不相符,請關閉規則群組的 Enable Count mode (啟用計數模式),以封鎖流量。若要關閉 AWS Managed Rules 規則群組中的特定規則,請為該規則選擇 Override rules action (覆寫規則動作)。
注意: 傳送至您環境的合法請求可能會觸發 AWS Managed Rules。如需更多資訊,請參閱如何自訂 AWS WAF 的 AWS Managed Rules 行為。
使用合法請求的速率為 AWS WAF 建立基準
若要防範大量流量攻擊,請分析流量,以識別合法用戶端 IP 位址提出的請求數。若要分析流量,請對 AWS WAF 日誌使用 CloudWatch Logs Insights、Athena 查詢或 Amazon Quick Sight。使用分析所得資訊,為 AWS WAF 建立基準。然後,設定速率型規則陳述式以設定請求閾值。
以下是對 AWS WAF 日誌執行的 Athena 查詢範例,此查詢會計算特定時間範圍內來自單一 IP 位址的請求數:
SELECT "httprequest"."clientip", "count"(*) "count", "httprequest"."country" FROM waf_logs WHERE httprequest.clientip LIKE '10.0.0.0' and date_format(from_unixtime("timestamp"/1000), '%Y-%m-%d %h:%i:%s') between '2020-11-16 09:00:00' and '2020-11-16 10:00:00' GROUP BY "httprequest"."clientip", "httprequest"."country"
注意: 將 10.0.0.0 替換為您的 IP 位址,並將 2020-11-16 09:00:00 和 2020-11-16 10:00:00 替換為您的時間範圍。
以下是對 AWS WAF 日誌執行的 CloudWatch Insights 查詢範例,此查詢會計算來自單一 IP 位址的請求數:
fields httpRequest.clientIp, httpRequest.country| stats count(*) as requestCount by httpRequest.clientIp, httpRequest.country| filter httpRequest.clientIp = "10.0.0.0"
注意: 將 10.0.0.0 替換為您的 IP 位址。
以下是對 AWS WAF 日誌執行的 Athena 查詢範例,此查詢會計算特定時間範圍內來自 IP 位址的所有請求:
SELECT "httprequest"."clientip", "count"(*) "count", "httprequest"."country" FROM waf_logs WHERE date_format(from_unixtime("timestamp"/1000), '%Y-%m-%d %h:%i:%s') BETWEEN '2020-11-16 09:00:00' AND '2020-11-16 10:00:00' GROUP BY "httprequest"."clientip", "httprequest"."country" ORDER BY "count" DESC
注意: 將 2020-11-16 09:00:00 和 2020-11-16 10:00:00 替換為您的時間範圍。
以下是對 AWS WAF 日誌執行的 CloudWatch Insights 查詢範例,此查詢會計算特定時間範圍內來自 IP 位址的請求數:
fields httpRequest.clientIp, httpRequest.country| stats count(*) as requestCount by httpRequest.clientIp, httpRequest.country| sort requestCount desc
使用 Security Automations for AWS WAF 防範常見攻擊
若要進一步防範常見攻擊,請使用 Security Automations for AWS WAF。
注意: 此解決方案會使用其他 AWS 服務,因而可能產生成本。
使用 SQL injection 隱碼攻擊和 XSS 攻擊規則陳述式
若要防範針對應用程式的 SQL injection 隱碼攻擊和 XSS 攻擊,請使用適用於 SQL 注入和 XSS 的內建攻擊規則陳述式。攻擊可能發生在 HTTP 請求的不同部分,例如 HTTP 標頭、查詢字串或 URI。設定 AWS WAF 規則,使用攻擊規則陳述式檢查 HTTP 請求的不同部分。
注意: 傳送至您環境的合法請求可能會觸發攻擊規則陳述式。如需更多資訊,請參閱如何偵測 AWS Managed Rules 造成的誤判?
限制來自 CloudFront 的存取
根據 CloudFront IP 位址限制存取。然後,在 CloudFront 中為原始伺服器請求新增自訂標頭。在原始伺服器上,僅當請求包含自訂標頭和值時才允許存取。如果原始伺服器是 Application Load Balancer 或 API Gateway,請在原始伺服器上使用 AWS WAF。此動作允許包含自訂標頭和值的請求。
防範 DDoS 攻擊
若要防範 DDoS 攻擊,請參閱如何使用 AWS WAF 緩解 DDoS 攻擊?和AWS WAF 分散式阻斷服務 (DDoS) 防護規則群組。另請參閱AWS 的 DDoS 復原能力最佳實務和 AWS Shield 功能。
相關資訊
This article was reviewed and updated on 2026-02-25.
相關內容
已提問 2 年前
已提問 3 年前
已提問 3 年前
AWS 官方已更新 10 個月前
