跳至內容

如何設定 AWS WAF 以保護我的資源免受常見攻擊?

4 分的閱讀內容
0

我想在資源上使用 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 整合的資源
對於無法直接與 AWS WAF 整合的資源,請使用以下其中一個選項來整合資源:

檢閱傳入請求以改善規則

若要判斷常見的請求模式,請使用 Application Load Balancer 或 CloudFront 存取日誌等應用程式日誌。
注意: 最佳實務是使用 AWS WAF 日誌來儲存、查詢和分析 HTTP 請求日誌。

判斷常見的請求模式後,將日誌儲存在 Amazon Simple Storage Service (Amazon S3) 或 Amazon CloudWatch 中。若要查詢日誌並識別模式,請使用 Amazon AthenaCloudWatch 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 規則群組。若要針對專門任務提供保護,請使用以下規則群組,並支付額外費用:

計數模式下,將相關規則群組新增至 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 InsightsAthena 查詢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:002020-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:002020-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 功能

相關資訊

共同責任模型

管理 AWS WAF 中的誤判