View a markdown version of this page

動態標籤插補 - AWS WAF AWS Firewall Manager、 AWS Shield Advanced和 AWS Shield 網路安全主管

推出 的新主控台體驗 AWS WAF

您現在可以使用更新後的體驗,在主控台的任何位置存取 AWS WAF 功能。如需詳細資訊,請參閱使用 主控台

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

動態標籤插補

動態標籤插補可讓您使用${namespace:}語法直接在自訂請求標頭、自訂回應標頭和自訂回應內文中嵌入標籤值。 會根據附加至請求的標籤,在評估時間 AWS WAF 解析每個預留位置,因此您不需要為每個標籤值撰寫單獨的規則。

插補可在沒有新欄位或組態步驟的現有 AWS WAF API 內運作。您可以在現有的字串值中使用預留位置語法。現有的靜態標頭值會繼續保持不變。插入只會在值包含 ${namespace:} 子句時啟用。

支援插補的位置

您可以在下列位置使用${namespace:}插補:

  • 自訂請求標頭 – 將解析的標籤值插入轉送至原始伺服器的標頭。使用標頭值欄位中的${namespace:}語法。

  • 自訂回應內文 – 在區塊頁面、挑戰頁面和其他自訂回應中嵌入標籤值和合成標籤。使用回應內文內容欄位中的${namespace:}語法。

  • 自訂回應標頭 – 將標籤值插入回應標頭,例如在重新導向的Location標頭中。使用回應標頭值欄位中的${namespace:}語法。

插補語法和解析度

若要使用插補,請在標頭值或自訂回應內文內容中包含 ${namespace:}子句。結尾的冒號很重要。它會通知 AWS WAF 解析該命名空間中的所有標籤,而不是比對單一標籤。

AWS WAF 會在評估時間使用以下規則解析每個子句:

  1. 單一標籤比對 – 子句解析為標籤的終端機值。例如,如果請求具有標籤 awswaf:managed:aws:bot-control:bot:category:scraping,則 子句會${awswaf:managed:aws:bot-control:bot:category:}解析為 scraping

  2. 多個標籤 – 當多個標籤符合命名空間時,值會以逗號分隔的清單傳回,並分割命名空間字首。例如 scraping,advertising

  3. 不相符 – 子句解析為空字串。

注意

單一字串值最多支援 10 個${namespace:}預留位置。如果值包含超過 10 個預留位置, 會 AWS WAF 解析前 10 個預留位置,並將輸出中的任何其他預留位置保留為文字${namespace:}。此限制適用於每個字串值,而不是每個請求。您可以在多個標頭中每個標頭中使用最多 10 個預留位置,而不會發生問題。

重要

自訂標籤使用 中的簡短名稱ruleLabels。例如 app:tier:enterprise。不過, AWS WAF 會自動在簡短名稱前加上保護套件 (Web ACL) 內容,產生完整標籤。例如 awswaf:ACCOUNT_ID:webacl:WEBACL_NAME:app:tier:enterprise。標籤比對陳述式適用於短命名空間,但插入參考必須一律使用完整的命名空間。

合成標籤

插補也支援合成標籤。這些是從請求內容而非標籤存放區解析的內建值 AWS WAF 。您可以在相同的值字串中結合合成標籤與命名空間型標籤。

合成標籤 說明
${awswaf:request_id:} 唯一的 AWS WAF 請求識別符。
${awswaf:ip:} 用戶端 IP 地址。
${awswaf:ja3:} JA3 TLS 指紋。
${awswaf:ja4:} JA4 TLS 指紋。

動態標籤插補範例

具有動態標頭的應用程式訊號

下列規則會將數個 Bot Control 訊號命名空間轉送至原始伺服器,做為個別的標頭。一個規則涵蓋整個命名空間,因此當受管規則群組新增標籤時,您不需要更新規則。

{ "Name": "forward-waf-signals", "Statement": { "LabelMatchStatement": { "Scope": "NAMESPACE", "Key": "awswaf:managed:aws:bot-control:bot:category:" } }, "RuleAction": { "Count": { "CustomRequestHandling": { "InsertHeaders": [ { "Name": "bot-category", "Value": "${awswaf:managed:aws:bot-control:bot:category:}" }, { "Name": "bot-name", "Value": "${awswaf:managed:aws:bot-control:bot:name:}" }, { "Name": "bot-signals", "Value": "${awswaf:managed:aws:bot-control:signal:}" }, { "Name": "client-ip", "Value": "${awswaf:ip:}" } ] } } } }

bot-signals 標頭 (輸出:x-amzn-waf-bot-signals) 示範多值解析。signal: 命名空間可能包含多個標籤,例如 non_browser_user_agent,automated_browser,解析為逗號分隔清單。client-ip 標頭 (輸出:x-amzn-waf-client-ip) 使用合成標籤。

具有偵錯資訊的自訂封鎖頁面

合成標籤可讓您建置包含請求特定內容的區塊頁面。直接將用戶端的 IP 地址和 AWS WAF 請求 ID 嵌入回應內文中,以便在使用者回報誤報時提供可共用的內容。

{ "CustomResponseBodies": { "BlockPage": { "Content": "Your request was blocked.\n\nIP: ${awswaf:ip:}\nRequest ID: ${awswaf:request_id:}\n\nIf you believe this is an error, contact support with the Request ID above.", "ContentType": "TEXT_PLAIN" } } }
自訂標籤插補

插補適用於任何標籤命名空間,包括您在自己的規則中定義的自訂標籤。下列範例會依 API 金鑰分類請求,並將層值轉送至原始伺服器。

規則 1:根據 API 金鑰分類層

此規則會比對具有企業 API 金鑰的請求,並套用自訂標籤。

{ { "Name": "classify-tier", "Priority": 100, "Statement": { "ByteMatchStatement": { "SearchString": "pk_enterprise_", "FieldToMatch": { "SingleHeader": { "Name": "x-api-key" } }, "PositionalConstraint": "STARTS_WITH", "TextTransformations": [{ "Priority": 0, "Type": "NONE" }] } }, "RuleLabels": [{ "Name": "app:tier:enterprise" }], "Action": { "Count": {} } } }
規則 2:轉送已解析的層值

此規則符合app:tier命名空間中的任何標籤,並將解析的值轉送為標頭。

{ { "Name": "forward-tier", "Priority": 200, "Statement": { "LabelMatchStatement": { "Scope": "NAMESPACE", "Key": "app:tier:" } }, "Action": { "Count": { "CustomRequestHandling": { "InsertHeaders": [{ "Name": "customer-tier", "Value": "${awswaf:ACCOUNT_ID:webacl:WEBACL_NAME:app:tier:}" }] } } } }

第一個規則會套用標籤 app:tier:enterprise。第二個規則符合app:tier命名空間中的任何標籤,並將解析的值轉送為 customer-tier 標頭。輸出標頭名稱為 x-amzn-waf-customer-tier。您可以為其他層新增更多分類規則,例如 app:tier:standardapp:tier:trial。轉送規則會挑選它們,而不會進行任何變更。

如需示範所有這些模式的可部署範例,請參閱 GitHub 上的AWS WAF 動態標籤插補範例