收集 Cloudflare 日志
本文档介绍了如何使用 Webhook(HTTP 目标)或 Google Cloud Storage 将 Cloudflare 日志注入到 Google Security Operations。Cloudflare 会生成 DNS、HTTP、审核、零信任和 CASB 的日志形式的运营数据。通过此集成,您可以将这些日志发送到 Google SecOps 以进行分析和监控。解析器首先初始化一组空字段,然后解析 JSON 格式的 Cloudflare 日志,并舍弃所有无效的 JSON 消息。然后,该代码会根据特定字段的存在情况和值使用条件逻辑来确定 Cloudflare 产品和事件类型,并相应地填充统一数据模型 (UDM) 字段。
准备工作
请确保满足以下前提条件:
- Google SecOps 实例。
- 已启用 LogPush 的 Cloudflare Enterprise 账号。
- 对于 Webhook 方法:对 Google Cloud 控制台的特权访问权限。
- 对于 Google Cloud Storage 方法:对 Google Cloud Storage 的特权访问权限。
方法 1:使用 Webhook(HTTP 目标位置)配置 Cloudflare 日志导出
此方法可让您将 Cloudflare 日志直接流式传输到 Google SecOps,而无需中间存储。
在 Google SecOps 中配置 Webhook Feed
- 依次前往 SIEM 设置> Feed。
- 点击新增。
- 在Feed 名称字段中,输入 Feed 的名称(例如
Cloudflare Webhook
)。 - 选择 Webhook 作为来源类型。
- 选择 Cloudflare 作为日志类型。
- 点击下一步。
- 为以下输入参数指定值:
- 拆分分隔符:
\n
。 - 资产命名空间:资产命名空间。
- 注入标签:要应用于此 Feed 中事件的标签。
- 拆分分隔符:
- 点击下一步。
- 在最终确定界面中查看新的 Feed 配置,然后点击提交。
- 点击生成密钥,生成用于对此 Feed 进行身份验证的密钥。
- 请复制并保存此密钥,因为您将无法再次查看此密钥。
- 点击详细信息标签页。
- 从端点信息字段复制 Feed 端点网址。
- 点击完成。
为 Webhook Feed 创建 API 密钥
- 依次前往 Google Cloud 控制台 > API 和服务 > 凭据。
- 点击创建凭据,然后选择 API 密钥。
- 点击修改 API 密钥。
- 在 API 限制下,选择限制密钥。
- 从列表中选择 Google SecOps API。
- 点击保存。
- 复制 API 密钥值。
配置 Cloudflare LogPush HTTP 目标
- 登录 Cloudflare 控制面板。
- 选择要与 LogPush 搭配使用的企业账号或网域。
- 前往分析和日志> Logpush。
- 点击创建 Logpush 作业。
- 在选择目的地中,选择 HTTP 目的地。
输入包含身份验证参数的 HTTP 端点网址:
<ENDPOINT_URL>?header_X-goog-api-key=<API_KEY>&header_X-Webhook-Access-Key=<SECRET_KEY>
替换以下内容:
<ENDPOINT_URL>
:Google SecOps 提供的 Feed 端点网址。<API_KEY>
:来自 Google Cloud 控制台的 API 密钥(如果包含特殊字符,则采用网址编码)。<SECRET_KEY>
:Webhook Feed 中的密钥(如果包含特殊字符,则采用网址编码)。
点击继续。
选择要推送的数据集(例如 HTTP 请求、DNS、审核、零信任、CASB)。
配置日志推送作业:
- 输入作业名称。
- 可选:在如果日志匹配下,配置过滤条件。
- 在发送以下字段中,选择要包含的字段。
- 选择时间戳格式(建议使用 RFC3 339)。
- 根据需要配置采样率。
点击提交以创建日志推送作业。
验证 webhook 集成
配置完成后,日志应会在几分钟内显示在 Google SecOps 中。要进行验证,请执行以下操作:
- 依次前往调查 > SIEM 搜索。
- 搜索带有您配置的提取标签的日志。
- 确认 Cloudflare 日志是否正在正确解析。
方法 2:使用 Google Cloud Storage 配置 Cloudflare 日志导出
配置 Cloudflare 以将日志推送到该服务,这需要向 Cloudflare 授予必要的权限。
创建 Google Cloud 存储分区
- 登录 Google Cloud 控制台。
- 前往 Cloud Storage 存储分区页面。
- 点击创建。
- 在创建存储桶页面上,输入您的存储桶信息:
- 名称:输入符合存储桶名称要求的唯一名称(例如
cloudflare-data
)。 - 位置类型:选择位置类型和区域。
- 如需启用分层命名空间,请点击展开箭头以展开优化文件导向型和数据密集型工作负载,然后选择在此存储桶上启用分层命名空间。
- 名称:输入符合存储桶名称要求的唯一名称(例如
- 点击创建。
向存储桶授予权限
- 在 Cloud Storage 控制台中,选择您之前创建的存储桶。
- 点击权限标签页。
- 点击授予访问权限。
- 添加具有 Storage Object Admin 权限的账号
logpush@cloudflare-data.iam.gserviceaccount.com
。 - 点击保存。
将 Cloudflare LogPush 配置为 Google Cloud Storage
- 登录 Cloudflare 控制面板。
- 选择要与 LogPush 搭配使用的企业账号或网域。
- 前往分析和日志> Logpush。
- 点击创建 Logpush 作业。
- 在选择目标位置中,选择 Google Cloud Storage。
- 输入您的 Google Cloud Storage 存储桶路径(例如
gs://cloudflare-data/logs/
)。 点击继续。
输入所有权令牌,然后点击继续。
选择要推送到存储空间的数据集。
配置日志推送作业:
- 输入作业名称。
- 在如果日志匹配下,您可以选择要在日志中包含或移除的事件。
- 在发送以下字段中,选择要推送的日志。
- 选择时间戳格式(建议使用 RFC 339)。
- 根据需要配置采样率。
点击提交。
在 Google SecOps 中配置 Feed 以从 Google Cloud Storage 注入 Cloudflare 日志
- 依次前往 SIEM 设置 > Feed。
- 点击新增。
- 在Feed 名称字段中,输入 Feed 的名称(例如
Cloudflare GCS Logs
)。 - 选择 Google Cloud Storage V2 作为来源类型。
- 选择 Cloudflare 作为日志类型。
- 点击获取服务账号。
- 点击下一步。
为以下输入参数指定值:
- 存储桶 URI:
gs://my-bucket/<value>/
格式的 Google Cloud 存储桶网址。此网址必须以尾随正斜杠 (/) 结尾。 - 来源删除选项:根据您的偏好设置选择删除选项。
- 文件存在时间上限:包含在过去指定天数内修改的文件。默认值为 180 天。
- 资产命名空间:资产命名空间。
- 注入标签:要应用于此 Feed 中事件的标签。
- 存储桶 URI:
点击下一步。
在最终确定界面中查看新的 Feed 配置,然后点击提交。
UDM 映射表
日志字段 | UDM 映射 | 逻辑 |
---|---|---|
ClientIP | read_only_udm.principal.asset.ip read_only_udm.principal.ip |
该值取自 ClientIP 字段。 |
ClientRequestHost | read_only_udm.target.asset.hostname read_only_udm.target.hostname |
该值取自 ClientRequestHost 字段。 |
ClientRequestMethod | read_only_udm.network.http.method | 该值取自 ClientRequestMethod 字段。 |
ClientRequestURI | read_only_udm.target.url | 该值取自 ClientRequestURI 字段。如果 ClientRequestHost 字段不为空,则该值会与 ClientRequestHost 字段串联。 |
ClientSrcPort | read_only_udm.principal.port | 该值取自 ClientSrcPort 字段。 |
ClientRequestUserAgent | read_only_udm.network.http.user_agent | 该值取自 ClientRequestUserAgent 字段。 |
ClientSSLCipher | read_only_udm.network.tls.cipher | 该值取自 ClientSSLCipher 字段。 |
ClientSSLProtocol | read_only_udm.network.tls.version | 该值取自 ClientSSLProtocol 字段。 |
国家/地区 | read_only_udm.target.location.country_or_region | 该值取自“国家/地区”字段。 |
CreatedAt | read_only_udm.metadata.event_timestamp | 该值取自 CreatedAt 字段。 |
日期时间 | read_only_udm.metadata.event_timestamp | 该值取自日期时间字段。 |
DestinationIP | read_only_udm.target.asset.ip read_only_udm.target.ip |
该值取自 DestinationIP 字段。 |
DestinationPort | read_only_udm.target.port | 该值取自 DestinationPort 字段。 |
DeviceID | read_only_udm.principal.asset_id | 该值取自 DeviceID 字段,并带有“Cloudflare:”前缀。 |
DeviceName | read_only_udm.principal.asset.hostname read_only_udm.principal.hostname |
该值取自 DeviceName 字段。 |
DstIP | read_only_udm.target.asset.ip read_only_udm.target.ip |
该值取自 DstIP 字段。 |
DstPort | read_only_udm.target.port | 该值取自 DstPort 字段。 |
EdgeResponseBytes | read_only_udm.network.received_bytes | 该值取自 EdgeResponseBytes 字段。 |
EdgeResponseStatus | read_only_udm.network.http.response_code | 该值取自 EdgeResponseStatus 字段。 |
EdgeServerIP | read_only_udm.target.asset.ip read_only_udm.target.ip |
该值取自 EdgeServerIP 字段。 |
电子邮件 | read_only_udm.principal.user.email_addresses read_only_udm.target.user.email_addresses |
该值取自“电子邮件”字段。 |
FirewallMatchesActions | read_only_udm.security_result.action | 如果 FirewallMatchesAction 字段为“allow”“Allow”“ALLOW”“skip”“SKIP”或“Skip”,则该值设置为“ALLOW”;如果 FirewallMatchesAction 字段为“challengeSolved”或“jschallengeSolved”,则该值设置为“ALLOW_WITH_MODIFICATION”;如果 FirewallMatchesAction 字段为“drop”或“block”,则该值设置为“BLOCK”;如果 FirewallMatchesAction 字段不为空,则该值设置为“UNKNOWN_ACTION”。 |
FirewallMatchesRuleIDs | read_only_udm.security_result.rule_id | 该值取自 FirewallMatchesRuleIDs 字段。 |
FirewallMatchesSources | read_only_udm.security_result.rule_name | 该值取自 FirewallMatchesSources 字段。 |
HTTPMethod | read_only_udm.network.http.method | 该值取自 HTTPMethod 字段。 |
HTTPHost | read_only_udm.target.hostname | 该值取自 HTTPHost 字段。 |
HTTPVersion | read_only_udm.network.application_protocol | 该值取自 HTTPVersion 字段。如果值包含“HTTP”,则替换为“HTTP”。 |
IPAddress | read_only_udm.target.asset.ip read_only_udm.target.ip |
该值取自 IPAddress 字段。 |
IsIsolated | read_only_udm.about.labels read_only_udm.security_result.about.resource.attribute.labels |
该值取自 IsIsolated 字段,并转换为字符串。 |
位置 | read_only_udm.principal.location.name | 该值取自“位置”字段。 |
OriginIP | read_only_udm.intermediary.ip read_only_udm.target.asset.ip read_only_udm.target.ip |
该值取自 OriginIP 字段。 |
OriginPort | read_only_udm.target.port | 该值取自 OriginPort 字段。 |
OwnerID | read_only_udm.target.user.product_object_id | 该值取自 OwnerID 字段。 |
政策 | read_only_udm.security_result.rule_name | 该值取自 Policy 字段。 |
PolicyID | read_only_udm.security_result.rule_id | 该值取自 PolicyID 字段。 |
PolicyName | read_only_udm.security_result.rule_name | 该值取自 PolicyName 字段。 |
协议 | read_only_udm.network.ip_protocol | 该值取自“协议”字段,并转换为大写。 |
QueryCategoryIDs | read_only_udm.security_result.about.labels read_only_udm.security_result.about.resource.attribute.labels |
该值取自 QueryCategoryIDs 字段。 |
QueryName | read_only_udm.network.dns.questions.name | 该值取自 QueryName 字段。 |
QueryNameReversed | read_only_udm.network.dns.questions.name | 该值取自 QueryNameReversed 字段。 |
QuerySize | read_only_udm.network.sent_bytes | 该值取自 QuerySize 字段。 |
QueryType | read_only_udm.network.dns.questions.type | 该值取自 QueryType 字段。如果该值是已知的 DNS 记录类型之一,则会将其映射到相应的数值。否则,该值将转换为字符串。 |
RData | read_only_udm.network.dns.answers | 该值取自 RData 字段。类型字段会转换为无符号整数。 |
RayID | read_only_udm.metadata.product_log_id | 该值取自 RayID 字段。 |
Referer | read_only_udm.network.http.referral_url | 该值取自 Referer 字段。 |
RequestID | read_only_udm.metadata.product_log_id | 该值取自 RequestID 字段。 |
ResolverDecision | read_only_udm.security_result.summary | 该值取自 ResolverDecision 字段。 |
ResourceID | read_only_udm.target.resource.id read_only_udm.target.resource.product_object_id |
该值取自 ResourceID 字段。 |
ResourceType | read_only_udm.target.resource.resource_subtype | 该值取自 ResourceType 字段。 |
SNI | read_only_udm.network.tls.client.server_name | 该值取自 SNI 字段。 |
SecurityAction | read_only_udm.security_result.action | 如果 SecurityAction 字段为空或 sec_action 字段为空,则该值设置为“ALLOW”;如果 SecurityAction 字段为“challengeSolved”或“jschallengeSolved”,则该值设置为“ALLOW_WITH_MODIFICATION”;如果 SecurityAction 字段为“drop”或“block”,则该值设置为“BLOCK”。 |
SecurityLevel | read_only_udm.security_result.severity | 该值取自 SecurityLevel 字段,并映射到相应的 UDM 严重程度值。 |
SessionID | read_only_udm.network.session_id | 该值取自 SessionID 字段。 |
SessionStartTime | read_only_udm.metadata.event_timestamp | 该值取自 SessionStartTime 字段。 |
SourceIP | read_only_udm.principal.asset.ip read_only_udm.principal.ip read_only_udm.src.asset.ip read_only_udm.src.ip |
该值取自 SourceIP 字段。 |
SourcePort | read_only_udm.principal.port read_only_udm.src.port |
该值取自 SourcePort 字段。 |
SrcIP | read_only_udm.principal.asset.ip read_only_udm.principal.ip |
该值取自 SrcIP 字段。 |
SrcPort | read_only_udm.principal.port | 该值取自 SrcPort 字段。 |
TemporaryAccessDuration | read_only_udm.network.session_duration.seconds | 该值取自 TemporaryAccessDuration 字段。 |
时间戳 | read_only_udm.metadata.event_timestamp | 该值取自 Timestamp 字段。 |
传输 | read_only_udm.network.ip_protocol | 该值取自“交通方式”字段,并转换为大写。 |
网址 | read_only_udm.target.url | 该值取自网址字段。 |
UserAgent | read_only_udm.network.http.user_agent | 该值取自 UserAgent 字段。 |
UserID | read_only_udm.principal.user.product_object_id | 该值取自 UserID 字段。 |
UserUID | read_only_udm.target.user.product_object_id | 该值取自 UserUID 字段。 |
VirtualNetworkID | read_only_udm.principal.resource.product_object_id | 该值取自 VirtualNetworkID 字段。 |
WAFAction | read_only_udm.security_result.about.labels read_only_udm.security_result.about.resource.attribute.labels |
该值取自 WAFAction 字段。 |
WAFAttackScore | read_only_udm.security_result.about.resource.attribute.labels | 该值取自 WAFAttackScore 字段。 |
WAFFlags | read_only_udm.security_result.about.resource.attribute.labels | 该值取自 WAFFlags 字段。 |
WAFProfile | read_only_udm.security_result.about.labels read_only_udm.security_result.about.resource.attribute.labels |
该值取自 WAFProfile 字段。 |
WAFRCEAttackScore | read_only_udm.security_result.about.resource.attribute.labels | 该值取自 WAFRCEAttackScore 字段。 |
WAFRuleID | read_only_udm.security_result.about.labels read_only_udm.security_result.about.resource.attribute.labels read_only_udm.security_result.threat_id |
该值取自 WAFRuleID 字段。 |
WAFRuleMessage | read_only_udm.security_result.rule_name read_only_udm.security_result.threat_name |
该值取自 WAFRuleMessage 字段。 |
WAFSQLiAttackScore | read_only_udm.security_result.about.resource.attribute.labels | 该值取自 WAFSQLiAttackScore 字段。 |
WAFXSSAttackScore | read_only_udm.security_result.about.resource.attribute.labels | 该值取自 WAFXSSAttackScore 字段。 |
ZoneID | read_only_udm.additional.fields | 该值取自 ZoneID 字段。 |
read_only_udm.metadata.log_type | 该值设置为“CLOUDFLARE”。 | |
read_only_udm.metadata.product_name | 如果日志是 DNS 日志,则该值设置为“Cloudflare Gateway DNS”;如果日志是 Gateway HTTP 日志,则设置为“Cloudflare Gateway HTTP”;如果日志是审核日志,则设置为“Cloudflare Audit”;否则设置为“Web Application Firewall”。 | |
read_only_udm.metadata.vendor_name | 该值设置为“Cloudflare”。 | |
read_only_udm.network.application_protocol | 如果日志是 DNS 日志,则该值设置为“DNS”;如果 HTTPVersion 字段包含“HTTP”,则该值设置为“HTTP”;如果 Protocol 字段不为空且不是“tls”或“TLS”,则该值设置为 Protocol 字段的值(转换为大写)。 | |
read_only_udm.network.direction | 如果 EgressIP 字段不为空,则该值设置为“OUTBOUND”。 | |
read_only_udm.network.http.parsed_user_agent | 该值取自 UserAgent 或 ClientRequestUserAgent 字段,并使用 parseduseragent 过滤条件进行解析。 | |
read_only_udm.extensions.auth.type | 如果 Action 字段为“login”或“logout”,则该值设置为“MACHINE”。 | |
read_only_udm.metadata.event_type | 如果日志是 DNS 日志,则该值设置为“NETWORK_DNS”;如果日志是网关 HTTP 日志,则设置为“NETWORK_CONNECTION”;如果日志是审核日志且 ActorIP 和 ActorEmail 字段为空,则设置为“USER_RESOURCE_ACCESS”;如果日志是审核日志且 ResourceType 和 newvalue 字段不为空,则设置为“USER_RESOURCE_UPDATE_CONTENT”;如果 Action 字段为“login”,则设置为“USER_LOGIN”;如果 Action 字段为“logout”,则设置为“USER_LOGOUT”;如果 Email 字段不为空且符合电子邮件地址格式,则设置为“USER_RESOURCE_ACCESS”;如果 EgressIP 和 SourceIP 字段不为空,或者 OriginIP 和 SourceIP 字段不为空,则设置为“NETWORK_CONNECTION”。 | |
read_only_udm.target.file.mime_type | 该值取自 EdgeResponseContentType 字段。 | |
read_only_udm.target.location.country_or_region | 该值取自“国家/地区”字段。 | |
read_only_udm.target.resource.id | 该值取自 AccountID 字段或 ResourceID 字段。 | |
read_only_udm.target.resource.product_object_id | 该值取自 AccountID 字段、AppUUID 字段或 ResourceID 字段。 | |
read_only_udm.target.user.product_object_id | 该值取自 OwnerID 字段或 UserUID 字段。 |
需要更多帮助?从社区成员和 Google SecOps 专业人士那里获得解答。