排查 Google Cloud Armor 问题

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

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

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

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

    这是允许的请求的示例日志,其中相关字段用黑体标出。检查以下字段,并确保它们与您配置为拒绝流量的规则匹配:

    • configuredAction 应该与规则中配置的操作匹配
    • outcome 应该与上面的 configuredAction 匹配
    • priority 应该与规则的优先级编号匹配
    • name 应该与附加到此后端服务的 Google Cloud Armor 安全政策的名称匹配
    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: ''
           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. 查看规则的层次结构,以确保匹配正确的规则。具有允许操作的较高优先级规则可能与您的流量匹配。在 gcloud 命令行工具中,在安全政策上使用 describe 命令,以查看 Google Cloud Armor 安全政策的内容。

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

    gcloud compute security-policies describe my-policy
    
    creationTimestamp: '2017-04-18T14:47:58.045-07:00
    description: ''
    fingerprint: Yu5spBjdoC0=
    id: '2560355463394441057'
    kind: compute#securityPolicy
    name: my-policy
    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 my-policy
       --expression "evaluatePreconfiguredExpr('xss-stable')"
       --action deny-403
       --preview
    
  2. 查看 HTTP(S) 日志中的 HTTP 请求字段,例如 urlcookie。例如,requestUrlModSecurity 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: my-policy
        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: ''
        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 my-policy \
       --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 地址中的流量。确保流量来自已命名的 IP 地址允许列表中的 IP 地址。然后检查是否有其他优先级更高的安全规则可阻止流量。如果此问题仍然存在,请与 Cloud 支持团队联系

首先,确保将安全政策附加到正确的后端服务:

gcloud compute backend-services describe my-backend-service

接下来,检查安全政策中的规则。例如:

 gcloud compute security-policies describe my-policy
---
…
name: my-policy
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”的引荐来源的拒绝规则。它们各自的优先级也会一并列出。

接下来,查看日志以确定与您的流量匹配的规则以及关联的操作。如需了解日志记录,请参阅查看日志(传统版)

以下是日志的示例:

 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: "my-policy"
      outcome: "DENY"
      priority: 50
    }
    statusDetails: "denied_by_security_policy"
  }
  …

在上述日志中,请求来自 23.230.32.10,Fastly 的公共 IP 地址列表中对此进行了介绍,如 https://api.fastly.com/public-ip-list 中所示。但是,该请求与优先级为 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 支持团队联系,获取有关此问题的帮助。