排查 Google Cloud Armor 问题

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

常见问题

调试安全政策

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

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

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

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

    gcloud compute backend-services describe BACKEND
    
  2. 查看 HTTP(S) 日志以确定与您的流量匹配的政策和规则以及关联操作。如需查看日志,请使用 Cloud Logging

    以下是允许的请求的一个示例日志,其中突出显示了相关字段。请检查以下字段,确保它们与您配置为拒绝流量的规则匹配:

    • configuredAction 应该与规则中配置的操作匹配。
    • name 应该与附加到此后端服务的 Google 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 命令,以查看 Google 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 检测规则,然后在日志中检查是否有任何假正例。

如果发现假正例,则可以将流量内容与 ModSecurity CRS 规则进行比较。 如果规则无效或不相关,请使用 evaluatePreconfiguredExpr 表达式将其禁用,并在 exclude ID list 参数中指定规则的 ID。

查看日志并移除所有假正例后,禁用预览模式。

要在预览模式下添加预配置规则,请执行以下操作:

  1. 使用在预览模式下设置的预配置表达式创建安全政策:

    gcloud compute security-policies rules create 1000
       --security-policy POLICY_NAME
       --expression "evaluatePreconfiguredExpr('xss-stable')"
       --action deny-403
       --preview
    
  2. 查看 HTTP(S) 日志中的 HTTP 请求字段,例如 urlcookie。例如,requestUrl 与 ModSecurity 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. 通过更新 Google Cloud Armor 安全政策中的规则,排除 ModSecurity CRS 规则 ID 941180:

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

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

如果您将 Google Cloud Armor 与 Cloud CDN 配合使用,则仅对动态内容请求、缓存未命中或其他发往 CDN 源服务器的请求强制执行安全政策。即使下游 Google Cloud Armor 安全政策会阻止该请求到达 CDN 源服务器,系统也会提供缓存命中。

降低使用预配置的 WAF 规则时 POST 正文超过 8 KB 的风险

在 Google Cloud Armor 安全政策中评估预配置的 WAF 规则时,系统最多会检查 8 KB 的 POST 正文,以根据 WAF 规则进行签名匹配。此方法可为您提供低延迟的第 7 层检查和保护,同时不会影响服务对其他 Google 客户的可用性。

您可以在安全政策中创建规则,来确保没有未经检查的内容到达您的后端,从而避免出现大量 POST 请求。创建规则来拒绝 POST 正文大小超过 8 KB(8192 字节)的流量。以下代码示例演示了如何创建此规则:

gcloud compute security-policies rules create 10 \
    --security-policy my-policy \
    --expression "int(request.headers['content-length']) > 8192" \
    --action deny-403 \
    --description "Block requests great than 8KB"

已命名 IP 地址列表问题

本部分提供了用于解决已命名 IP 地址列表问题的信息。

已命名 IP 地址列表中的 IP 地址

列表中的 IP 地址始终与 Google Cloud Armor 的已命名 IP 地址列表指南中列出的提供商网站中的 IP 地址匹配。对于这些列表如有任何疑问,请与 Cloud 支持团队联系

已命名 IP 地址列表中的 IP 地址在 Google Cloud Armor 中已过时

Google Cloud Armor 每天将其列表与 IP 地址列表提供商同步。可能存在过时的数据,其落后于提供商资料数小时或一天。但是,如果您认为过时数据的延迟时间超出预期,例如超过一周,请与 Cloud 支持团队联系

在创建引用已命名 IP 地址列表的安全政策时遇到问题

您可以尝试使用以下命令创建引用已命名 IP 地址列表的安全政策:

gcloud compute security-policies rules create 750 \
    --security-policy my \
    --expression "evaluatePreconfiguredExpr('sourceiplist-example')" \
    --action "allow"

如果命令失败,则您会看到如下所示的错误:

ERROR: (gcloud.compute.security-policies.rules.create) Could not fetch resource:
 - Invalid value for field 'resource.match.expr': '{  "expression": "evaluatePreconfiguredExpr(\u0027sourceiplist-example\u0027)"}'.
Error parsing Google Cloud Armor rule matcher expression: sourceiplist-example
is not a valid preconfigured expression set.

确保支持特定的提供商,并确保正确指定了 IP 地址列表的名称。您可以通过使用以下 gcloud 命令列出当前的预配置表达式集来检查这一点:

gcloud compute security-policies list-preconfigured-expression-sets

尽管为已命名 IP 地址许可名单预先配置了规则,但仍阻止流量

您可能会发现已阻止来自指定 IP 地址列表的 IP 地址中的流量:

  1. 确保流量来自已命名的 IP 地址许可名单中的 IP 地址。

  2. 检查是否有其他优先级更高的安全规则可阻止流量。如果您仍看到问题,请与 Cloud 支持团队联系

  3. 确保将安全政策附加到正确的后端服务:

    gcloud compute backend-services describe BACKEND_SERVICE
    
  4. 检查安全政策中的规则。例如:

     gcloud compute security-policies describe POLICY_NAME
    

    该命令会返回类似于以下的信息:

    ---
    …
    name: POLICY_NAME
    rules:
    -action: allow
     description: allow fastly ip addresses
     kind: compute#securityPolicyRule
     match:
        expr:
          expression: evaluatePreconfiguredExpr('sourceiplist-fastly')
     preview: false
     priority: 100
    -action: deny(403)
     description: Default rule, higher priority overrides it
     kind: compute#securityPolicyRule
     match:
        config:
          srcIpRanges:
          -'*'
        versionedExpr: SRC_IPS_V1
     preview: false
     priority: 2147483647
    -action: deny(404)
     description: deny altostrat referer
     kind: compute#securityPolicyRule
     match:
        expr:
          expression: request.headers['Referer'].contains('altostrat')
     preview: false
     priority: 50
    …
    

    上述安全政策包含三条规则:默认拒绝规则、Fastly 的 IP 地址的允许规则,以及包含 altostrat 的引荐来源的拒绝规则。它们各自的优先级也会一并列出。

  5. 查看日志以确定与您的流量匹配的规则以及关联的操作。如需了解日志记录,请参阅使用日志浏览器

    以下是日志的示例:

     httpRequest: {
        referer: "http://www.altostrat.com/"
        remoteIp: "23.230.32.10"
        requestMethod: "HEAD"
        requestSize: "79"
        requestUrl: "http://www.example.com/"
        responseSize: "258"
        status: 404
        userAgent: "Mozilla/5.0"
      }
      …
      jsonPayload: {
        @type: "type.googleapis.com/google.cloud.loadbalancing.type.LoadBalancerLogEntry"
        enforcedSecurityPolicy: {
          configuredAction: "DENY"
          name: "POLICY_NAME"
          outcome: "DENY"
          priority: 50
        }
        statusDetails: "denied_by_security_policy"
      }
      …
    

    在上述日志中,请求来自 23.230.32.10Fastly 的公共 IP 地址列表中对此进行了介绍。 但是,该请求与优先级为 50 的拒绝规则匹配。将该规则与安全政策中的内容进行比较,该规则对应于包含 altostrat 的引荐来源的拒绝规则。由于该请求的引荐来源为 http://www.altostrat.com/,因此安全规则强制执行工作正常。

Security Command Center 发现结果问题

本部分包含有关 Security Command Center 发现结果问题的信息。

Google Cloud Armor 卡未显示在 Security Command Center

在 Security Command Center 界面中启用 Google Cloud Armor 发现结果。

Google Cloud Armor 中的发现结果不会显示在 Security Command Center 中

如果来自 Google Cloud Armor 的发现结果未显示在 Security Command Center 中,则到后端服务的流量可能不符合引发发现结果的条件。

有关后端流量的问题,请在网络安全政策下的 Cloud Monitoring 信息中心中查看请求统计信息。

调查结果太嘈杂

如需此问题的相关帮助,请与 Cloud 支持团队联系

与 Google Cloud Armor 自动调节式保护相关的问题

使用以下说明可帮助您解决与自动调节式保护相关的问题。

为安全政策启用了自动调节式保护,但 Cloud Logging 中没有日志

自动调节式保护日志与 Google Cloud Armor 请求日志分开生成,显示在 Cloud Logging 中的不同资源下。自动调节式保护日志和事件在 Cloud Logging 中的网络安全政策资源下。在安全政策中启用自动调节式保护后,至少经过一小时的训练期,自动调节式保护才会开始针对可疑攻击生成提醒。在训练期间,自动调节式保护会从传入的请求流量中获取信息,并为安全政策保护的每个后端服务制定不同的基准。自动调节式保护随后能够识别出可疑活动。

如果您为安全政策启用了自动调节式保护,并且在一小时的训练期之后未看到任何提醒,这表示没有活动被识别为与该安全政策关联的任何后端服务的潜在恶意目标。

如果潜在的攻击或异常流量持续较长时间(超过数小时),则自动调节式保护会开始将该行为视为基准行为,并且不会继续针对类似流量模式发出提醒。在潜在攻击减少并且流量模式恢复到原始基准之后,由于攻击结束,或者您使用适当的 Google Cloud Armor 规则阻止攻击,自动调节式保护会针对被视为与基准不同的未来流量行为发出提醒。

自动调节式保护会分析通过 Google Cloud Armor 安全政策允许的流量。如果您将默认规则设置为拒绝通过受限的流量许可名单进行访问,则自动调节式保护只会针对许可名单检测通过评估的流量的恶意活动。

Cloud Logging 中来自自动调节式保护的提醒或日志过多

自动调节式保护提醒提供置信度分数,指示增强的自动调节式保护模型如何将检测的活动识别为异常潜在的攻击。您可以通过 Cloud Logging 过滤日志的特定条目,以仅显示置信度分数高于特定阈值的提醒(或转发到下游)。

自动调节式保护提供了一种将提醒报告为假正例的机制,详情请参阅监控、反馈和报告事件错误部分。请注意,假正例报告可能不会立即更改自动调节式保护发出提醒的对象。随着时间的推移,自动调节式保护模型会获知此类流量模式是正常的且可以接受,并且自动调节式保护会停止对这些模式发出提醒。

如果自动调节式保护对安全政策中的部分后端服务发出提醒过于频繁,则可能表示这些后端服务的正常流量存在显著波动,自动调节式保护会持续将这些波动识别为异常行为。您可以在不启用自动调节式保护的情况下创建单独的安全政策,并将这些后端服务与新的安全政策关联。

自动调节式保护所报告的特定突发事件被视为假正例或不相关

自动调节式保护提供了一种用于报告误报提醒的机制。按照监控、反馈和报告事件错误部分中所述的步骤进行操作。请注意,假正例报告可能不会立即更改自动调节式保护发出提醒的对象。随着时间的推移,自动调节式保护模型会获知此类流量模式是正常的且可以接受,并且自动调节式保护会停止对这些模式发出提醒。

如何判断我的边缘安全政策是否已强制执行?

您可以通过检查监控信息中心、监控指标或每个请求日志记录来检查对边缘安全政策所执行的操作。

监控信息中心

您可以在监控下的网络安全政策页面上查看 Cloud Monitoring。使用此页面上的“按安全政策细分”功能,可以衡量已配置的边缘安全政策允许和拒绝的请求数。您还可以按后端服务检查细分以调试特定后端服务。如需详细了解 Cloud Monitoring 信息中心,请参阅Monitoring Google Cloud Armor 安全政策

监控指标

测量允许和拒绝的请求的原始指标可用于边缘安全政策。如需了解详情,请参阅监控安全政策的指标

每个请求日志记录

边缘安全政策决策会记录在 enforcedEdgeSecurityPolicy 下的负载均衡请求日志中。这与 enforcedSecurityPolicy 无关,后者捕获后端安全政策决策。

聊天机器人管理

本部分介绍了如何排查与聊天机器人管理相关的问题。

未按预期豁免用户

您可能已经为 reCAPTCHA 评估配置了具有重定向操作的安全政策规则,并发现您认为合法的一些用户没有按预期豁免。请按照以下步骤排查问题。

首先,检查每个请求日志,看看是否存在具有与更高流量相匹配并具有不同操作的安全政策规则。尤其要注意查找 configured_actionoutcome 字段。请注意,要豁免用户,至少涉及两个请求。初始请求不附带豁免 Cookie,如果用户传递了 reCAPTCHA 评估,后续请求将附带豁免 Cookie。因此,至少需要两个日志条目。

  • 如果您看到 GOOGLE_RECAPTCHA 为配置的操作,REDIRECT 为结果,则说明请求已重定向到 reCAPTCHA 评估;
  • 如果您看到 GOOGLE_RECAPTCHA 为配置的操作,ACCEPT 为结果,则说明请求没有重定向到 reCAPTCHA 评估。
  • 如果您在上述字段中看到不同的值,则说明匹配了具有不同操作的规则。在这种情况下,预计用户不会被重定向或豁免。

其次,为了使用户避免重定向到 reCAPTCHA 评估,该用户需要满足一些要求。

  1. 用户必须使用浏览器。
  2. 浏览器必须启用 JavaScript 才能正确加载嵌入了 reCAPTCHA JavaScript 的重定向页面。
  3. 浏览器必须启用 Cookie 以允许设置并自动附加豁免 Cookie。
  4. 用户必须通过 reCAPTCHA 评估;例如,用户必须通过弹出式验证(如果有)。

请注意,即使匹配了带有 reCAPTCHA 评估重定向操作的规则,但不符合上述任何要求的用户也无法获得豁免。

第三,仅当呈现嵌入 reCAPTCHA JavaScript 的重定向页面时才会执行 reCAPTCHA 评估。因此,针对 reCAPTCHA 评估的重定向仅适用于希望响应在完整页面中呈现的请求。其他请求(例如在页面中加载资源)或源自嵌入式脚本且不希望呈现响应的请求预计不会获得 reCAPTCHA 评估。因此,我们建议您在网址路径满足匹配条件的情况下应用此操作。

例如,假设您有一个网页,其中包含图片、其他网页的链接和脚本等嵌入式元素。您不希望将 reCAPTCHA 评估的重定向操作应用于托管图片的网址路径,或者应用于不会呈现完整网页的脚本访问的网址路径。相反,您可以将 reCAPTCHA 评估的重定向操作应用于托管网页(如主网页或其他链接的网页)的网址路径。

最后,如果成功呈现了重定向页面,请检查浏览器提供的开发者工具,以查看是否设置了豁免 Cookie 以及是否将其附加到同一网站的后续请求中。如需进一步帮助,您可以与 Cloud 支持团队联系。

与速率限制相关的问题

流量未按预期节流

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

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

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

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

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

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

后续步骤