排解 Cloud Armor 問題

按照這些操作說明排解 Google Cloud Armor 安全性政策的問題。

一般問題

偵錯安全性政策

如要進一步瞭解特定事件觸發預先設定規則的原因,請參閱「使用要求記錄功能」,然後啟用詳細記錄功能。Cloud Logging 會在記錄中記錄更詳細的資訊,可用於分析及偵錯政策和規則。

即使 Cloud Armor 安全性政策中已設定拒絕規則,系統仍允許流量

如要修正這個問題,請按照下列步驟操作:

  1. 確認 Cloud Armor 安全性政策已附加至目標後端服務。舉例來說,下列指令會說明與後端服務 BACKEND 相關聯的所有資料。傳回的結果必須包含與這項後端服務相關聯的 Cloud Armor 安全性政策名稱。

    gcloud compute backend-services describe BACKEND
    

    BACKEND 改為後端服務的名稱。

  2. 請查看 HTTP(S) 記錄,判斷流量符合哪些政策和規則,以及相關聯的動作。如要查看記錄,請使用 Cloud Logging

    以下是允許要求的記錄範例,並醒目顯示重要欄位。檢查下列欄位,確認這些欄位符合您設定的流量拒絕規則:

    • configuredAction 必須與規則中設定的動作相符。
    • name 必須與附加至這個後端服務的 Cloud Armor 安全性政策名稱相符。
    • outcome 必須與 configuredAction 相符。
    • priority 必須與規則的優先順序號碼相符。
     httpRequest:
      remoteIp: 104.133.0.95
      requestMethod: GET
      requestSize: '801'
      requestUrl: http://74.125.67.38/
      responseSize: '246'
      serverIp: 10.132.0.4
      status: 200
      userAgent: curl/7.35.0
        insertId: ajvis5ev4i60
        internalId:
          projectNumber: '895280006100'
        jsonPayload:
          '@type': type.googleapis.com/google.cloud.loadbalancing.type.LoadBalancerLogEntry
          enforcedSecurityPolicy:
            configuredAction: ACCEPT
            name: mydev-policy-log-test1
            outcome: ACCEPT
            priority: 2147483647
          statusDetails: response_sent_by_backend
        logName: projects/mydev-staging/logs/requests
        resource:
          labels:
            backend_service_name: BACKEND_SERVICE_NAME
            forwarding_rule_name: FORWARDING_RULE_NAME
            project_id: PROJECT_ID
            target_proxy_name: TARGET_HTTP_PROXY_NAME
            url_map_name: URL_MAP_NAME
            zone: global
          type: http_load_balancer
        severity: INFO
        timestamp: '2017-04-18T18:57:05.845960288Z'
    

    這項輸出內容包含下列值:

    • BACKEND_SERVICE_NAME:後端服務名稱
    • FORWARDING_RULE_NAME:轉送規則的名稱
    • PROJECT_ID:專案 ID
    • TARGET_HTTP_PROXY_NAME:目標 HTTP Proxy 的名稱
    • URL_MAP_NAME:網址對應的名稱
  3. 請檢查規則的階層,確保系統比對的是正確規則。優先順序較高的規則可能允許流量通過。在 Google Cloud CLI 中,使用 security-policies 上的 describe 指令,查看 Cloud Armor 安全性政策的內容。

    舉例來說,以下範例顯示優先順序較高的允許規則 (優先順序 100) 如何比對來自 1.2.3.4 IP 位址的流量,避免觸發優先順序較低的拒絕規則 (優先順序 200) 並封鎖流量。

    gcloud compute security-policies describe POLICY_NAME
    

    POLICY_NAME 替換為安全性政策名稱。

    輸出結果會與下列內容相似:

    creationTimestamp: '2017-04-18T14:47:58.045-07:00
    description: ''
    fingerprint: Yu5spBjdoC0=
    id: '2560355463394441057'
    kind: compute#securityPolicy
    name: POLICY_NAME
    rules:
    -action: allow
     description: allow high priority rule
     kind: compute#securityPolicyRule
     match:
       srcIpRanges:
       -'1.2.3.4/32'
     preview: false
     priority: 100
    -action: deny
     description: deny lower priority rule
     kind: compute#securityPolicyRule
     match:
       srcIpRanges:
       -'1.2.3.0/24
     preview: false
     priority: 200
    -action: deny
     description: default rule
     kind: compute#securityPolicyRule
     match:
       srcIpRanges:
       -'*'
     preview: false
     priority: 2147483647
     selfLink: http://www.googleapis.com/compute/v1/projects/bigclustertestdev0-devconsole/global/securityPolicies/sp
    

預先設定的規則傳回偽陽性結果

XSS 和 SQLi 偵測功能會根據 HTTP 要求標頭和其他第 7 層參數的靜態簽章比對結果判斷。這些規則運算式模式容易出現誤判。您可以在預覽模式中使用預先設定的規則偵測 XSS 和 SQLi,然後檢查記錄檔是否有任何誤判。

如果發現偽陽性,可以比較流量內容與 OWASP CRS 規則。如要從舊版 CRS 遷移,請參閱 WAF 規則版本比較,瞭解規則異動和重新命名清單。如果規則無效或不相關,請使用 evaluatePreconfiguredWaf 運算式停用規則,並在 exclude ID list 引數中指定規則的 ID。

檢查記錄並移除所有誤判結果後,請停用預覽模式。

如要在預覽模式中新增預先設定的規則,請按照下列步驟操作:

  1. 在預覽模式中,使用預先設定的運算式集建立安全性政策:

     gcloud compute security-policies rules create 1000
         --security-policy POLICY_NAME
         --expression "evaluatePreconfiguredWaf('xss-stable')"
         --action deny-403
         --preview
    

    POLICY_NAME 替換為安全性政策名稱。

  2. 查看 HTTP(S) 記錄,瞭解 HTTP 要求欄位,例如 urlcookie。舉例來說,requestUrl 與 OWASP CRS 規則 ID 941180 相比,結果為正:

    httpRequest:
     remoteIp: 104.133.0.95
     requestMethod: GET
     requestSize: '801'
     requestUrl: http://74.125.67.38/foo?document.cookie=1010"
     responseSize: '246'
     serverIp: 10.132.0.4
     status: 200
     userAgent: curl/7.35.0
    insertId: ajvis5ev4i60
    internalId:
     projectNumber: '895280006100'
    jsonPayload:
     '@type': type.googleapis.com/google.cloud.loadbalancing.type.LoadBalancerLogEntry
     enforcedSecurityPolicy:
       configuredAction: ACCEPT
       name: POLICY_NAME
       outcome: ACCEPT
       priority: 2147483647
       preconfiguredExprIds: [ 'owasp-crs-v042200-id941180-xss' ]
     statusDetails: response_sent_by_backend
    logName: projects/mydev-staging/logs/requests
    resource:
     labels:
       backend_service_name: BACKEND_SERVICE
       forwarding_rule_name: mydev-forwarding-rule
       project_id: mydev-staging
       target_proxy_name: mydev-target-http-proxy
       url_map_name: mydev-url-map
       zone: global
     type: http_load_balancer
    severity: INFO
    timestamp: '2017-04-18T18:57:05.845960288Z'
    

    這份記錄包含下列值:

    • POLICY_NAME:安全性政策的名稱
    • BACKEND_SERVICE:後端服務名稱
  3. 更新 Cloud Armor 安全性政策中的規則,排除 OWASP CRS 規則 ID 941180:

     gcloud compute security-policies rules update 1000 \
         --security-policy POLICY_NAME \
         --expression "evaluatePreconfiguredWaf('xss-v422-stable', ['owasp-crs-v042200-id941180-xss'])" \
         --action deny-403 \
         --preview
    

    POLICY_NAME 替換為安全性政策名稱。

  4. 再次檢查記錄,然後停用預覽模式,即可實作規則。

簽章遭拒的用戶端不會遭到封鎖或拒絕

如果將 Cloud Armor 與 Cloud CDN 搭配使用,系統僅會針對下列要求強制執行安全性政策:動態內容、快取失敗,或其他目的地為 CDN 原始伺服器的要求。即使下游 Cloud Armor 安全性政策會防止快取命中要求抵達 CDN 原始伺服器,仍會執行快取命中要求。

頻率限制問題

流量未依預期受到節流

您可能會發現,用戶端 IP 位址以超過您設定的門檻速率,將大量流量傳送至應用程式,但流量並未如預期受到節流。請按照下列步驟調查問題。

首先,請確認優先順序較高的規則是否允許來自該 IP 位址的流量。檢查記錄,確認 IP 位址是否觸發 ALLOW 規則。這可能是獨立的 ALLOW 規則,也可能是其他 THROTTLERATE_BASED_BAN 規則。

如果找到優先順序較高的規則,請執行下列任一操作:

  1. 變更優先順序,將速率限制規則的優先順序調高,方法是為該規則指派「較低」的數值。
  2. 從優先順序較高的規則中,排除與運算式相符的 IP 位址。

也可能是因為門檻設定有誤。如果是這種情況,系統會準確比對要求,但會觸發「符合」動作。查看記錄檔確認是否為此情況,然後降低規則中的門檻。

最後,IP 位址可能不符合節流或以速率為準的禁止規則。如要修正這個問題,請檢查比對條件是否有誤,然後將規則的比對條件變更為正確值。

後續步驟