使用以下说明排查 Google Cloud Armor 安全政策问题。
常见问题
调试安全政策
如需详细了解特定事件会触发预配置规则,请阅读使用请求日志记录,然后启用详细日志记录。Cloud Logging 会在日志中记录更高级别的详细信息,供您分析和调试政策和规则。
尽管在 Cloud Armor 安全政策中配置了拒绝规则,但仍允许流量
为修正此问题,请按以下步骤操作:
确保 Cloud Armor 安全政策已附加到目标后端服务。例如,以下命令描述与后端服务
BACKEND
相关联的所有数据。返回的结果应包括与此后端服务关联的 Cloud Armor 安全政策的名称。gcloud compute backend-services describe BACKEND
查看 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'
查看规则的层次结构,以确保匹配正确的规则。具有允许操作的较高优先级规则可能与您的流量匹配。在 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。
查看日志并移除所有假正例后,禁用预览模式。
要在预览模式下添加预配置规则,请执行以下操作:
使用在预览模式下设置的预配置表达式创建安全政策:
gcloud compute security-policies rules create 1000 --security-policy POLICY_NAME --expression "evaluatePreconfiguredWaf('xss-stable')" --action deny-403 --preview
查看 HTTP(S) 日志中的 HTTP 请求字段,例如
url
和cookie
。例如,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'
通过更新 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
再次查看日志,然后禁用预览模式以实施规则。
签名被拒绝的客户端不会被阻止或被拒绝
如果您将 Cloud Armor 与 Cloud CDN 结合使用,则系统仅会针对动态内容请求、缓存未命中请求或者其他以 CDN 源服务器为目标的请求强制执行安全政策。即使下游 Cloud Armor 安全政策会阻止缓存命中请求到达 CDN 源服务器,系统也会处理该请求。
与速率限制相关的问题
流量未按预期节流
您可能会发现客户端 IP 地址以超出您设置的阈值的速率向应用发送高流量,但并未按预期对流量进行节制。请按照以下步骤调查此问题。
首先,确认优先级较高的规则是否允许来自该 IP 地址的流量。检查日志以了解是否针对 IP 地址触发了 ALLOW
规则。这可以是 ALLOW
规则本身,也可以是另一个 THROTTLE
或 RATE_BASED_BAN
规则。
如果您发现优先级更高的规则,请执行以下操作之一:
- 通过为速率限制规则分配较低的数值更改优先级,以确保速率限制规则具有较高优先级。
- 从具有较高优先级的规则的匹配表达式中排除此 IP 地址。
问题也可能是阈值设置不正确。在这种情况下,系统会准确匹配请求,但会触发合规操作。检查日志以确认属于这种情况,然后降低规则中的阈值。
最后,IP 地址可能与节流或基于速率的禁止规则不匹配。如需解决此问题,请检查匹配条件中是否存在错误,然后将规则的匹配条件更改为正确的值。