外部应用负载均衡器和外部代理网络负载均衡器日志记录功能会在每个请求的 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_RECAPTCHA
或EXTERNAL_302
。denied_by_security_policy
:请求因 Google Cloud Armor 安全政策被负载均衡器拒绝。body_denied_by_security_policy
:请求正文因 Google Cloud Armor 安全政策被负载均衡器拒绝。
enforcedSecurityPolicy
:实施的安全政策规则。name
(字符串):安全政策的名称。priority
(数字):安全规则中匹配规则的优先级。adaptiveProtection
:自动部署的自动调节式保护规则的相关信息(如果适用)。autoDeployAlertId
:自动调节式保护检测到的事件的提醒 ID。
configuredAction
(字符串):匹配规则中已配置操作的名称,例如ALLOW
、DENY
、GOOGLE_RECAPTCHA
、EXTERNAL_302
THROTTLE
(用于限流规则)、RATE_BASED_BAN
(用于基于速率的禁止规则)。rateLimitAction
:有关限流规则或基于速率的禁止规则匹配时的速率限制操作的信息。key
(字符串):速率限制键值对(最多 32 个字节)。如果密钥类型为ALL
,或者密钥类型为HTTP-HEADER
或HTTP-COOKIE
且请求中没有指定的标头或 Cookie,则省略此字段。outcome
(字符串):可能的值如下:"RATE_LIMIT_THRESHOLD_CONFORM"
(如果低于配置的速率限制阈值)。"RATE_LIMIT_THRESHOLD_EXCEED"
(如果超过配置的速率限制阈值)。"BAN_THRESHOLD_EXCEED"
(如果超过配置的禁止阈值)。
outcome
(字符串):执行已配置操作的结果,例如ACCEPT
、DENY
、REDIRECT
、EXEMPT
。preconfiguredExprIds
(字符串):触发规则的所有预配置 WAF 规则表达式的 ID。threatIntelligence
:威胁情报中匹配 IP 地址列表(如果适用)的信息。categories
:(字符串)匹配的 IP 地址列表名称。
previewSecurityPolicy
:如果请求与配置的预览规则匹配,则系统会填充此字段(仅在预览规则优先于强制执行的规则时才会显示)。name
(字符串):安全政策的名称。priority
(数字):安全规则中匹配规则的优先级。configuredAction
(字符串):匹配规则中已配置操作的名称,例如ALLOW
、DENY
、GOOGLE_RECAPTCHA
、EXTERNAL_302
THROTTLE
(用于限流规则)、RATE_BASED_BAN
(用于基于速率的禁止规则)。rateLimitAction
:有关限流规则或基于速率的禁止规则匹配时的速率限制操作的信息。key
(字符串):速率限制键值对(最多 32 个字节)。如果密钥类型为ALL
,或者密钥类型为HTTP-HEADER
或HTTP-COOKIE
且请求中没有指定的标头或 Cookie,则省略此字段。outcome
(字符串):可能的值如下:"RATE_LIMIT_THRESHOLD_CONFORM"
(如果低于配置的速率限制阈值)。"RATE_LIMIT_THRESHOLD_EXCEED"
(如果超过配置的速率限制阈值)。"BAN_THRESHOLD_EXCEED"
(如果超过配置的禁止阈值)。
outcome
(字符串):执行已配置操作的结果。outcome
(字符串):执行已配置操作的结果,例如ACCEPT
、DENY
、REDIRECT
、EXEMPT
。preconfiguredExprIds
(字符串):触发规则的所有预配置 WAF 规则表达式的 ID。threatIntelligence
:威胁情报中匹配 IP 地址列表(如果适用)的信息。categories
:(字符串)匹配的 IP 地址列表名称。
enforcedEdgeSecurityPolicy
(预览版):已强制执行的边缘安全政策规则。name
(字符串):安全政策的名称。priority
(数字):安全规则中匹配规则的优先级。configuredAction
(字符串):匹配规则中已配置操作的名称,例如ALLOW
、DENY
。outcome
(字符串):执行已配置操作的结果,例如ACCEPT
、DENY
。
previewEdgeSecurityPolicy
(预览版):如果请求与为预览配置的边缘安全政策规则匹配,则系统会填充此条目(仅在预览规则优先于强制执行的规则时才会显示)。name
(字符串):安全政策的名称。priority
(数字):安全规则中匹配规则的优先级。configuredAction
(字符串):匹配规则中已配置操作的名称,例如ALLOW
、DENY
。outcome
(字符串):执行已配置操作的结果,例如ACCEPT
、DENY
。
详细日志记录
您可能很难判断为什么特定请求触发了预配置的 WAF 规则。Google Cloud Armor 的默认事件日志包含触发的规则以及子签名。但是,您可能需要从触发规则的传入请求中识别详细信息,以进行问题排查、验证规则或调整规则。
您可以使用 --log-level
标志更改政策记录的详细信息级别。此标志的值可以是 NORMAL
或 VERBOSE
:
--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 安全政策的日志。
控制台
在 Google Cloud 控制台中,转到 Google Cloud Armor 政策。
点击
操作。选择查看日志。
请求数据日志记录
与 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 指纹(如果客户端使用HTTPS
、HTTP/2
或HTTP/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"