使用请求日志记录

外部应用负载均衡器和外部代理网络负载均衡器日志记录功能会在每个请求的 Google Cloud Armor 日志中记录安全政策名称、匹配规则优先级、关联操作和相关信息。默认情况下,新后端服务的日志记录处于停用状态,因此您必须启用日志记录才能记录 Google Cloud Armor 的完整日志记录信息。

Google Cloud Armor 日志是 Cloud Load Balancing 日志的一部分。这意味着 Google Cloud Armor 的日志生成取决于为负载均衡器配置的日志采样率。如果您降低负载均衡器的采样率,则 Google Cloud Armor 请求日志也会按降低后的速率采样。此外,如果您使用跨项目服务引用,则日志会在包含负载均衡器前端和网址映射的宿主项目或服务项目下生成。因此,我们建议前端项目中的管理员向后端项目中的管理员授予读取日志和指标的权限。

利用日志记录,您可以查看 Google Cloud Armor 安全政策评估的每个请求以及所采取的结果或操作。例如,如需查看拒绝的请求,您可以使用 jsonPayload.enforcedSecurityPolicy.outcome="DENY"jsonPayload.statusDetails="denied_by_security_policy" 等过滤条件。

如需为外部应用负载均衡器启用日志记录功能,请参阅外部应用负载均衡器日志记录和监控。对于外部代理网络负载均衡器,您可以使用前面的“外部应用负载均衡器日志记录和监控”页面中列出的 Google Cloud CLI 命令。您无法使用 Google Cloud 控制台为外部代理网络负载均衡器启用日志记录功能。

此外,您还可以设置不同的日志记录级别,以帮助评估安全政策及其规则是否按预期工作。如需了解完整信息,请参阅详细日志记录

安全政策日志条目

日志浏览器中的以下日志条目适用于 Google Cloud Armor 安全政策和规则日志记录。这些条目包括 jsonPayload 中的以下结构。HTTP 请求详情会显示在 httpRequest 消息中。

  • statusDetails(字符串):响应代码的文本描述
    • redirected_by_security_policy:请求通过重定向规则进行重定向;GOOGLE_RECAPTCHAEXTERNAL_302
    • denied_by_security_policy:请求因 Google Cloud Armor 安全政策被负载均衡器拒绝。
    • body_denied_by_security_policy:请求正文因 Google Cloud Armor 安全政策被负载均衡器拒绝。
  • enforcedSecurityPolicy:实施的安全政策规则。
    • name(字符串):安全政策的名称。
    • priority(数字):安全规则中匹配规则的优先级。
    • adaptiveProtection:自动部署的自动调节式保护规则的相关信息(如果适用)。
      • autoDeployAlertId:自动调节式保护检测到的事件的提醒 ID。
    • configuredAction(字符串):匹配规则中已配置操作的名称,例如 ALLOWDENYGOOGLE_RECAPTCHAEXTERNAL_302 THROTTLE(用于限流规则)、RATE_BASED_BAN(用于基于速率的禁止规则)。
    • rateLimitAction:有关限流规则或基于速率的禁止规则匹配时的速率限制操作的信息。
      • key(字符串):速率限制键值对(最多 32 个字节)。如果密钥类型为 ALL,或者密钥类型为 HTTP-HEADERHTTP-COOKIE 且请求中没有指定的标头或 Cookie,则省略此字段。
      • outcome(字符串):可能的值如下:
        • "RATE_LIMIT_THRESHOLD_CONFORM"(如果低于配置的速率限制阈值)。
        • "RATE_LIMIT_THRESHOLD_EXCEED"(如果超过配置的速率限制阈值)。
        • "BAN_THRESHOLD_EXCEED"(如果超过配置的禁止阈值)。
    • outcome(字符串):执行已配置操作的结果,例如 ACCEPTDENYREDIRECTEXEMPT
    • preconfiguredExprIds(字符串):触发规则的所有预配置 WAF 规则表达式的 ID。
    • threatIntelligence:威胁情报中匹配 IP 地址列表(如果适用)的信息。
      • categories:(字符串)匹配的 IP 地址列表名称。
  • previewSecurityPolicy:如果请求与配置的预览规则匹配,则系统会填充此字段(仅在预览规则优先于强制执行的规则时才会显示)。
    • name(字符串):安全政策的名称。
    • priority(数字):安全规则中匹配规则的优先级。
    • configuredAction(字符串):匹配规则中已配置操作的名称,例如 ALLOWDENYGOOGLE_RECAPTCHAEXTERNAL_302 THROTTLE(用于限流规则)、RATE_BASED_BAN(用于基于速率的禁止规则)。
    • rateLimitAction:有关限流规则或基于速率的禁止规则匹配时的速率限制操作的信息。
      • key(字符串):速率限制键值对(最多 32 个字节)。如果密钥类型为 ALL,或者密钥类型为 HTTP-HEADERHTTP-COOKIE 且请求中没有指定的标头或 Cookie,则省略此字段。
      • outcome(字符串):可能的值如下:
        • "RATE_LIMIT_THRESHOLD_CONFORM"(如果低于配置的速率限制阈值)。
        • "RATE_LIMIT_THRESHOLD_EXCEED"(如果超过配置的速率限制阈值)。
        • "BAN_THRESHOLD_EXCEED"(如果超过配置的禁止阈值)。
    • outcome(字符串):执行已配置操作的结果。
    • outcome(字符串):执行已配置操作的结果,例如 ACCEPTDENYREDIRECTEXEMPT
    • preconfiguredExprIds(字符串):触发规则的所有预配置 WAF 规则表达式的 ID。
    • threatIntelligence:威胁情报中匹配 IP 地址列表(如果适用)的信息。
      • categories:(字符串)匹配的 IP 地址列表名称。
  • enforcedEdgeSecurityPolicy预览版):已强制执行的边缘安全政策规则。
    • name(字符串):安全政策的名称。
    • priority(数字):安全规则中匹配规则的优先级。
    • configuredAction(字符串):匹配规则中已配置操作的名称,例如 ALLOWDENY
    • outcome(字符串):执行已配置操作的结果,例如 ACCEPTDENY
  • previewEdgeSecurityPolicy预览版):如果请求与为预览配置的边缘安全政策规则匹配,则系统会填充此条目(仅在预览规则优先于强制执行的规则时才会显示)。
    • name(字符串):安全政策的名称。
    • priority(数字):安全规则中匹配规则的优先级。
    • configuredAction(字符串):匹配规则中已配置操作的名称,例如 ALLOWDENY
    • outcome(字符串):执行已配置操作的结果,例如 ACCEPTDENY

详细日志记录

您可能很难判断为什么特定请求触发了预配置的 WAF 规则。Google Cloud Armor 的默认事件日志包含触发的规则以及子签名。但是,您可能需要从触发规则的传入请求中识别详细信息,以进行问题排查、验证规则或调整规则。

您可以使用 --log-level 标志更改政策记录的详细信息级别。此标志的值可以是 NORMALVERBOSE

--log-level=[NORMAL | VERBOSE]

例如:

gcloud compute security-policies update ca-policy-1 \
    --log-level=VERBOSE

我们建议您在首次创建政策、更改政策或排查政策问题时启用详细日志记录。

启用详细日志记录时记录的值

启用详细日志记录后,其他信息将记录到发送到 Cloud Logging 的负载均衡请求日志中。启用详细日志记录后,请求日志中会显示以下附加字段:

  • matchedFieldType(字符串):导致匹配的字段类型。

    • ARG_NAMES
    • ARG_VALUES
    • BODY

      • 如果 BODY 字段在日志中,则表示整个邮件正文与规则匹配。
    • COOKIE_VALUES

    • COOKIE_NAMES

    • FILENAME

    • HEADER_VALUES

    • RAW_URI

    • REFERER

    • REQUEST_LINE

    • URI

    • USER_AGENT

    • HEADER_NAMES

    • ARGS_GET

    • X_FILENAME

    • ARG_NAME_COUNT

    • TRANSFER_ENCODING

    • REQUEST_METHOD

  • matchedFieldName(字符串):如果它与键值对的值部分匹配,则键值会存储在此字段中。否则,它为空。

  • matchedFieldValue(字符串):导致匹配的字段部分的前缀,最多 16 个字节。

  • matchedFieldLength(整数):字段的总长度。

  • matchedOffset(整数):导致匹配的字段的起始偏移量。

  • matchedLength(整数):对局长度。

例如,您可以将此请求发送到启用了 SQL 注入 WAF 规则的项目:

curl http://IP_ADDR/?sql_table=abc%20pg_catalog%20xyz

日志浏览器中的条目如下所示:

enforcedSecurityPolicy: {
 name: "user-staging-sec-policy"
 priority: 100
 configuredAction: "DENY"
 outcome: "DENY
 preconfiguredExprIds: [
   0: "owasp-crs-v030001-id942140-sqli"
  ]
matchedFieldType: "ARG_VALUES"
matchedFieldName: "sql_table"
matchedFieldValue: "pg_catalog"
matchedFieldLength: 18
matchedOffset: 4
matchedLength: 10
}

启用详细日志记录时维护隐私

在使用详细日志记录时,Google Cloud Armor 会记录来自触发特定预配置 WAF 规则的传入请求的元素的片段。这些代码段可能包含请求标头、请求参数或 POST 正文的元素。代码段可能包含敏感数据,例如传入请求中的 IP 地址或其他敏感数据,具体取决于请求标头或正文中的内容以及触发 WAF 规则的内容。

启用详细日志记录功能时,请注意,在 Logging 中可能会累积日志中的潜在敏感数据。我们建议您仅在规则创建和验证期间或进行问题排查时启用详细日志记录。在正常操作期间,我们建议您停用详细日志记录。

查看日志

您只能在 Google Cloud 控制台中查看 Google Cloud Armor 安全政策的日志。

控制台

  1. 在 Google Cloud 控制台中,转到 Google Cloud Armor 政策

    转到“Google Cloud Armor 政策”

  2. 点击 操作

  3. 选择查看日志

请求数据日志记录

与 Google Cloud Armor 结合使用时,jsonPayload 具有以下附加字段:

  • securityPolicyRequestData:安全政策处理请求时与请求相关的数据,无论最终匹配的是哪个规则。
    • recaptchaActionToken:与 reCAPTCHA Enterprise 操作令牌相关的数据。
      • score (float):嵌入到 reCAPTCHA Enterprise 操作令牌中的用户合法性分数。仅当请求附加了 reCAPTCHA Enterprise 操作令牌并且根据安全政策规则成功解码时,此条目才会显示。如需了解详情,请参阅强制执行 reCAPTCHA Enterprise 评估
    • recaptchaSessionToken:与 reCAPTCHA Enterprise 会话令牌相关的数据。
      • score (float):嵌入到 reCAPTCHA Enterprise 会话令牌中的用户合法性分数。仅当请求附加了 reCAPTCHA Enterprise 会话令牌并且根据安全政策规则成功解码时,此条目才会显示。
    • tlsJa3Fingerprint:JA3 TTL/SSL 指纹(如果客户端使用 HTTPSHTTP/2HTTP/3 进行连接)。仅当指纹可用且存在用于评估请求的安全政策(无论政策中的表达式是否与请求匹配)时,此字段才会显示。

日志示例

以下是阻止请求的节流规则的日志详情示例:

jsonPayload: {
 enforcedSecurityPolicy: {
  priority: 100
  name: "sample-prod-policy"
  configuredAction: "THROTTLE"
  outcome: "DENY"
  rateLimitAction: {
    key:"sample-key"
    outcome:"RATE_LIMIT_THRESHOLD_EXCEED"
  }
 }
 @type: "type.googleapis.com/google.cloud.loadbalancing.type.LoadBalancerLogEntry"
 statusDetails: "denied_by_security_policy"
}
httpRequest: {8}
resource: {2}
timestamp: "2021-03-17T19:16:48.185763Z"

以下是阻止请求的基于速率的拒绝名单规则的日志详情示例:

jsonPayload: {
 @type: "type.googleapis.com/google.cloud.loadbalancing.type.LoadBalancerLogEntry"
 enforcedSecurityPolicy: {
  priority: 150
  name: "sample-prod-policy"
  outcome: "DENY"
  configuredAction: "RATE_BASED_BAN"
  rateLimitAction: {
    key:"sample-key"
    outcome:"BAN_THRESHOLD_EXCEED"
  }
 }
 statusDetails: "denied_by_security_policy"
}
httpRequest: {8}
resource: {2}
timestamp: "2021-03-17T19:27:17.393244Z"

后续步骤

了解如何排查 Google Cloud Armor 问题