排查 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 beta compute security-policies rules create 750 \
    --security-policy my \
    --expression "evaluatePreconfiguredExpr('sourceiplist-abc')" \
    --action "allow"

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

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

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

gcloud beta 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 发现结果问题

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 支持团队联系

后续步骤