排查 Cloud Armor 问题

使用以下说明排查 Google Cloud Armor 安全政策问题。

常见问题

调试安全政策

如需详细了解特定事件会触发预配置规则,请阅读使用请求日志记录,然后启用详细日志记录。Cloud Logging 会在日志中记录更高级别的详细信息,供您分析和调试政策和规则。

尽管在 Cloud Armor 安全政策中配置了拒绝规则,但仍允许流量

为修正此问题,请按以下步骤操作:

  1. 确保 Cloud Armor 安全政策已附加到目标后端服务。例如,以下命令描述与后端服务 BACKEND 相关联的所有数据。返回的结果应包括与此后端服务关联的 Cloud Armor 安全政策的名称。

    gcloud compute backend-services describe 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'
    
  3. 查看规则的层次结构,以确保匹配正确的规则。具有允许操作的较高优先级规则可能与您的流量匹配。在 Google Cloud CLI 中对 security-policies 使用 describe 命令,以查看 Cloud Armor 安全政策的内容。

    例如,以下示例显示较高优先级的允许规则(优先级为 100)如何匹配来自 1.2.3.4 IP 地址的流量,从而防止较低优先级拒绝规则(优先级为 200)触发和阻止流量。

    gcloud compute security-policies describe 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 请求标头和其他 L7 参数上的静态签名匹配。这些正则表达式模式容易产生假正例。您可以在预览模式下使用预配置的 XSS 和 SQLi 检测规则,然后在日志中检查是否有任何假正例。

如果发现假正例,则可以将流量内容与 OWASP CRS 规则进行比较。如果规则无效或不相关,请使用 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
    
  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-v030001-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'
    
  3. 通过更新 Cloud Armor 安全政策中的规则,排除 OWASP CRS 规则 ID 941180:

    gcloud compute security-policies rules update 1000 \
        --security-policy POLICY_NAME \
        --expression "evaluatePreconfiguredWaf('xss-stable', ['owasp-crs-v030001-id941180-xss'])" \
        --action deny-403 \
        --preview
    
  4. 再次查看日志,然后禁用预览模式以实施规则。

签名被拒绝的客户端不会被阻止或被拒绝

如果您将 Cloud Armor 与 Cloud CDN 结合使用,则系统仅会针对动态内容请求、缓存未命中请求或者其他以 CDN 源服务器为目标的请求强制执行安全政策。即使下游 Cloud Armor 安全政策会阻止缓存命中请求到达 CDN 源服务器,系统也会处理该请求。

与速率限制相关的问题

流量未按预期节流

您可能会发现客户端 IP 地址以超出您设置的阈值的速率向应用发送高流量,但并未按预期对流量进行节制。请按照以下步骤调查此问题。

首先,确认优先级较高的规则是否允许来自该 IP 地址的流量。检查日志以了解是否针对 IP 地址触发了 ALLOW 规则。这可以是 ALLOW 规则本身,也可以是另一个 THROTTLERATE_BASED_BAN 规则。

如果您发现优先级更高的规则,请执行以下操作之一:

  1. 通过为速率限制规则分配较低的数值更改优先级,以确保速率限制规则具有较高优先级。
  2. 从具有较高优先级的规则的匹配表达式中排除此 IP 地址。

问题也可能是阈值设置不正确。在这种情况下,系统会准确匹配请求,但会触发合规操作。检查日志以确认属于这种情况,然后降低规则中的阈值。

最后,IP 地址可能与节流或基于速率的禁止规则不匹配。如需解决此问题,请检查匹配条件中是否存在错误,然后将规则的匹配条件更改为正确的值。

后续步骤