跳至內容

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

4 分的閱讀內容
0

我想在資源上使用 AWS WAF 來防範常見的攻擊。

簡短描述

若要在您的資源上使用 AWS WAF 來防範常見攻擊,請採取以下一項或多項動作:

  • 從 AWS WAF Classic 遷移到 AWS WAF。
  • 將您的資源與 AWS WAF 中的 Web 存取控制清單 (Web ACL) 建立關聯。
  • 檢閱傳入的請求以最佳化您的規則。
  • 使用 AWS 受管規則來協助防範常見攻擊。
  • 使用合法請求費率作為 AWS WAF 的基準。
  • 使用 AWS WAF 的安全自動化來防止常見攻擊。
  • 使用 SQL injection 隱碼攻擊和跨網站指令碼 (XSS) 攻擊規則陳述式。
  • 限制來自 Amazon CloudFront 的存取。
  • 防範分散式阻斷服務 (DDoS) 攻擊。

解決方法

**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤,請參閱AWS CLI 錯誤疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本

從 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 整合的資源

對於無法直接與 AWS WAF 整合的資源,請使用下列其中一個選項來整合您的資源:

檢閱傳入的請求以最佳化您的規則

為了保護您的資源,請使用應用程式日誌 (例如 Application Load Balancer 或 CloudFront 存取日誌) 來確定常見的請求模式。

**注意:**最佳實務是使用 AWS WAF 日誌來儲存、查詢和分析 HTTP 請求日誌。

確定常見的請求模式後,將日誌儲存在 Amazon Simple Storage Service (Amazon S3) 或 Amazon CloudWatch 上。若要查詢日誌並識別模式,請使用 Amazon AthenaCloudWatch Logs Insights

最後,在計數模式下建立用於驗證傳入請求的 AWS WAF 規則,然後將此規則設為 Block (封鎖):

  1. example.com 的主機標頭上建立 NOT 規則陳述式
    **注意:**將 example.com 替換為您的主機標頭。
  2. Action (動作) 設定為 Block (封鎖)。AWS WAF 會封鎖沒有您指定主機標頭的請求。

**注意:**此規則也會封鎖 AWS 提供的完整網域名稱 (FQDN) 的請求。

以下範例是您可能會遇到的常見請求模式。

請求不存在的 URI

若要識別這種模式,您必須了解環境中支援的每個 URI。以下是在 AWS WAF 日誌中,用於計算每個 URI 請求數量的 Athena 查詢範例:

SELECT COUNT("httprequest"."uri") AS URIcount, "httprequest"."uri"
  FROM waf_logs
 GROUP BY "httprequest"."uri"
 ORDER BY URIcount DESC

以下是在 AWS WAF 日誌中,用於計算每個 URI 請求數量的 CloudWatch 查詢範例:

fields httpRequest.uri
| stats count(*) as requestCount by httpRequest.uri
| sort requestCount desc

包含不同主機標頭值的請求

此模式包括您的 Web 伺服器不支援的 HTTP 主機標頭請求。此模式也包括那些包含 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 受管規則來協助防範常見攻擊

若要使用 AWS 受管規則,請確定您想要防範的常見請求模式和攻擊。然後,新增相關的 AWS 受管規則規則群組。若要防範特定任務,您可以使用以下規則群組 (需額外付費):

計數模式下將相關規則群組新增至您的 Web ACL。然後,檢查 AWS WAF 日誌和 CloudWatch 指標,以確定受管規則是否與合法流量相符。如果規則與合法流量不相符,請關閉規則群組的 Enable Count mode (啟用計數模式) 以封鎖流量。若要關閉 AWS 受管規則群組中的特定規則,請為此規則選擇 Override rules action (覆寫規則動作)。

**注意:**對您環境的合法請求可能會啟動 AWS 受管規則。如需詳細資訊,請參閱如何自訂 AWS WAF 的 AWS 受管規則的行為

使用合法請求率作為 AWS WAF 的基準

若要防止容量攻擊,請分析您的流量以確定合法用戶端 IP 位址發出的請求數量。若要分析您的流量,請在 AWS WAF 日誌上使用 CloudWatch Logs InsightsAthena 查詢Amazon Quick Sight。使用分析中的資訊作為 AWS WAF 的基準。然後,設定速率型規則陳述式來設定請求閾值。

以下是在 AWS WAF 日誌中,用於計算特定時間範圍內來自單一 IP 位址請求數量的 Athena 查詢範例:

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 日誌中,用於統計算來自單一 IP 位址請求數量的 CloudWatch Insights 查詢範例:

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 日誌中,用於計算特定時間範圍內所有 IP 位址請求數量的 Athena 查詢範例:

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 日誌中,用於計算特定時間範圍內來自 IP 位址請求數量的 CloudWatch Insights 查詢範例:

fields httpRequest.clientIp, httpRequest.country
| stats count(*) as requestCount by httpRequest.clientIp, httpRequest.country
| sort requestCount desc

使用 AWS WAF 的安全自動化來防止常見攻擊

若要提供對常見攻擊的額外防護,您可以使用 AWS WAF 安全自動化

**注意:**此解決方案會使用可能產生費用的其他 AWS 服務。

使用 SQL injection 隱碼攻擊和 XSS 攻擊規則陳述式

若要保護您的應用程式免於 SQL injection 隱碼攻擊和 XSS 攻擊,請使用針對 SQL injection 隱碼攻擊XSS 的內建攻擊規則陳述式。攻擊可能發生在 HTTP 請求的不同部分,例如 HTTP 標頭、查詢字串或 URI。請設定您的 AWS WAF 規則,以根據攻擊規則陳述式檢查 HTTP 請求的不同部分。

**注意:**對您環境的合法請求可能會啟動攻擊規則陳述式。如需詳細資訊,請參閱如何偵測由 AWS 受管規則導致的誤判?

限制來自 CloudFront 的存取

您可以根據 CloudFront IP 位址限制存取。然後,在 CloudFront 中為來源請求新增自訂標頭。在原始來源上,僅在自訂標頭和值存在時才允許存取。如果原始來源是 Application Load Balancer 或 API 閘道,則在原始來源上使用 AWS WAF。此動作允許包含自訂標頭和值的請求。

防範 DDoS 攻擊

若要防範 DDoS 攻擊,請參閱 AWS DDoS 彈性最佳實務AWS Shield 功能

相關資訊

共同責任模式

管理 AWS WAF 中的誤判