排查 Google Cloud Armor 问题

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

常见问题

尽管在 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. 查看规则的层次结构,以确保匹配正确的规则。具有允许操作的较高优先级规则可能与您的流量匹配。在 gcloud 命令行工具中,在 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 源服务器,系统也会提供缓存命中。

已命名 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-abc')" \
    --action "allow"

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

ERROR: (gcloud.compute.security-policies.rules.create) Could not fetch resource:
 - Invalid value for field 'resource.match.expr': '{  "expression": "evaluatePreconfiguredExpr(\u0027sourceiplist-abc\u0027)"}'.
Error parsing Google Cloud Armor rule matcher expression: sourceiplist-abc
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 xyz referer
     kind: compute#securityPolicyRule
     match:
        expr:
          expression: request.headers['Referer'].contains('xyz')
     preview: false
     priority: 50
    …
    

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

  5. 查看日志以确定与您的流量匹配的规则以及关联的操作。如需了解日志记录,请参阅 Cloud Logging API 的在旧版日志查看器中查看日志

    以下是日志的示例:

     httpRequest: {
        referer: "http://www.xyz.com/"
        remoteIp: "23.230.32.10"
        requestMethod: "HEAD"
        requestSize: "79"
        requestUrl: "http://www.abc.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 的拒绝规则匹配。将该规则与安全政策中的内容进行比较,该规则对应于包含 xyz 的引荐来源的拒绝规则。由于该请求的引荐来源为 http://www.xyz.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 过滤日志的特定条目,以仅显示置信度分数高于特定阈值的提醒(或转发到下游)。

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

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

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

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

后续步骤