收集 DNSFilter 日志
本文档介绍了如何配置 DNSFilter,以使用 HTTP 事件收集器 (HEC) 协议通过 Webhook 将日志推送到 Google Security Operations。
DNSFilter 是一款 AI 赋能的 DNS 安全解决方案,可提供威胁防护、内容过滤和网络可见性。借助数据导出功能,您可以通过 HTTP 事件收集器 (HEC) API 将 DNS 查询日志数据自动导出到 SIEM 平台,从而支持实时安全监控和合规性报告。
准备工作
请确保满足以下前提条件:
- Google SecOps 实例
- 拥有管理员权限或更高级别的权限,可访问 DNSFilter 信息中心
- 已启用 DNSFilter 数据导出附加服务功能(作为付费附加服务提供,适用于 Basic、Pro 和 Enterprise 方案)
- 对 Google Cloud Console 的访问权限(用于创建 API 密钥)
在 Google SecOps 中创建 Webhook Feed
创建 Feed
- 依次前往 SIEM 设置> Feed。
- 点击添加新 Feed。
- 在下一页上,点击配置单个 Feed。
- 在 Feed 名称字段中,输入 Feed 的名称(例如
DNSFilter HEC Feed)。 - 选择 Webhook 作为来源类型。
- 选择 DNSFILTER 作为日志类型。
- 点击下一步。
- 为以下输入参数指定值:
- 拆分分隔符(可选):留空,因为每个 HEC 请求都包含格式正确的事件
- 资产命名空间:资产命名空间
- 注入标签:要应用于此 Feed 中事件的标签
- 点击下一步。
- 在最终确定界面中查看新的 Feed 配置,然后点击提交。
生成并保存密钥
创建 Feed 后,您必须生成用于身份验证的密钥:
- 在 Feed 详情页面上,点击生成密钥。
- 系统会显示一个包含密钥的对话框。
复制并妥善保存此密钥。
获取 Feed 端点网址
- 前往相应 Feed 的详细信息标签页。
- 在端点信息部分,复制 Feed 端点网址。
网址格式为:
https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate或
https://<REGION>-malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate保存此网址以供后续步骤使用。
点击完成。
创建 Google Cloud API 密钥
Google SecOps 需要使用 API 密钥进行身份验证。在 Google Cloud Console 中创建受限 API 密钥。
创建 API 密钥
- 前往 Google Cloud 控制台的“凭据”页面。
- 选择您的项目(与您的 Google SecOps 实例关联的项目)。
- 点击创建凭据 > API 密钥。
- 系统会创建一个 API 密钥,并在对话框中显示该密钥。
- 点击修改 API 密钥以限制密钥。
限制 API 密钥
- 在 API 密钥设置页面中:名称:输入描述性名称(例如
Google SecOps DNSFilter Webhook API Key) - 在 API 限制下:
- 选择限制密钥。
- 在选择 API 下拉菜单中,搜索并选择 Google SecOps API(或 Chronicle API)。
- 点击保存。
- 从页面顶部的 API 密钥字段复制 API 密钥值。
安全地保存 API 密钥。
配置 DNSFilter 数据导出
构建 HEC 端点网址
将 Google SecOps 端点网址和 API 密钥组合在一起,以创建 HEC 网址:
<ENDPOINT_URL>?key=<API_KEY>示例:
https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate?key=AIzaSyD...
在 DNSFilter 中配置数据导出
- 登录 DNSFilter 信息中心。
- 依次前往工具 > 数据导出。
- 在导出目的地部分中,选择 HTTP Event Collector (HEC)。
- 在 HEC 配置部分中,输入以下内容:
- HTTP 事件收集器网址:粘贴上一步中的完整端点网址(包含 API 密钥)。
- 有效事件收集器令牌:粘贴在创建 Google SecOps Feed 期间生成的密钥。
- 点击保存配置。
DNSFilter 将测试连接,如果配置正确,则会显示一条成功消息。
验证数据注入
- 在 DNSFilter 信息中心中,依次前往工具 > 数据导出。
- 验证状态是否显示为有效或已连接。
- 在 Google SecOps 控制台中,依次前往 SIEM 设置 > Feed。
- 找到您的 DNSFilter Feed,并验证状态是否显示为有效。
- 点击 Feed 名称即可查看详情。
- 检查已注入的日志指标,确认数据正在流动。
如需搜索 DNSFilter 事件,请前往搜索,然后运行以下查询:
metadata.log_type = "DNSFILTER"
身份验证方法参考
Google SecOps Webhook Feed 支持多种身份验证方法。DNSFilter HEC 集成使用混合方法。
使用的方法:混合(网址 + 标头)
DNSFilter 会在网址中发送 API 密钥,并在请求标头中发送密钥(HEC 令牌)。
请求格式:
POST <ENDPOINT_URL>?key=<API_KEY> HTTP/1.1 Content-Type: application/json Authorization: Splunk <SECRET_KEY> { "event": "data", "timestamp": "2025-01-15T10:30:00Z" }
替代方法:自定义标头
如果配置自定义应用以将日志发送到 Google SecOps,请使用此方法以提高安全性。
请求格式:
POST <ENDPOINT_URL> HTTP/1.1 Content-Type: application/json x-goog-chronicle-auth: <API_KEY> x-chronicle-auth: <SECRET_KEY> { "event": "data", "timestamp": "2025-01-15T10:30:00Z" }优点:
- API 密钥和密文在网址中不可见
- 更安全(标头不会记录在 Web 服务器访问日志中)
- 供应商支持时的首选方法
身份验证标头名称
Google SecOps 接受以下用于身份验证的 HTTP 标头名称:
对于 API 密钥:
x-goog-chronicle-auth(推荐)X-Goog-Chronicle-Auth(不区分大小写)
对于密钥:
x-chronicle-auth(推荐)X-Chronicle-Auth(不区分大小写)Authorization: Splunk <TOKEN>(HEC 兼容性)
Webhook 限制和最佳实践
请求限制
| 限制 | 值 |
|---|---|
| 最大请求大小 | 4 MB |
| 最大 QPS(每秒查询次数) | 15000 |
| 请求超时 | 30 秒 |
| 重试行为 | 自动(使用指数退避算法 |
最佳做法
- 监控导出状态:定期检查 DNSFilter 信息中心内的数据导出状态,以确保数据持续流动。
- API 密钥轮替:定期轮替 Google Cloud API 密钥,以确保安全。
- 密钥管理:安全地存储 Google SecOps 密钥,并在密钥泄露时重新生成。
- 数据保留:在 DNSFilter 和 Google SecOps 中配置适当的数据保留政策。
- 提醒配置:在 Google SecOps 中针对关键 DNS 安全事件设置提醒。
问题排查
连接测试失败
如果 DNSFilter 数据导出配置测试失败:
- 验证 HEC 网址是否正确,以及是否包含 API 密钥参数。
- 验证密钥(HEC 令牌)是否已正确复制,没有多余的空格。
- 检查 Google Cloud API 密钥是否已启用 Chronicle API 访问权限。
- 验证 Google SecOps Feed 是否处于有效状态。
- 检查从 DNSFilter 到 Google Cloud 端点的网络连接。
Google SecOps 中未显示任何数据
如果连接成功,但未显示任何数据,请执行以下操作:
- 验证 DNS 查询是否正在 DNSFilter 部署中生成。
- 检查 DNSFilter 查询日志,确认流量正在处理。
- 在 Google SecOps 中,搜索
metadata.log_type = "DNSFILTER"以验证注入。 - 在 Google SecOps 中查看 Feed 的提取的日志指标。
- 查看 Feed 的错误日志,了解是否存在任何注入错误。
数据导出返回错误消息
常见错误原因:
- 凭据无效:API 密钥或密钥不正确或已过期。
- 区域不匹配:Google SecOps 端点网址区域与您的实例不匹配。
- 权限:API 密钥未启用 Chronicle API 访问权限。
- 网络问题:防火墙或代理阻止出站 HTTPS 连接。
UDM 映射表
| 日志字段 | UDM 映射 | 逻辑 |
|---|---|---|
| 时间 | metadata.collected_timestamp | 使用日期格式 yyyy-MM-dd HH:mm:ss Z UTC 进行转换 |
| metadata.event_type | 如果 principal_ip_present、principal_hostname_present 或 principal_mac_present 为 true,则设置为“STATUS_UPDATE”,否则设置为“GENERIC_EVENT” | |
| question_type | network.dns.questions | 使用 DNS 记录类型映射将 question_type 转换为 question.type,然后合并到数组中 |
| 代码 | network.dns.response_code | 使用 DNS 响应代码映射进行转换 |
| 协议 | network.ip_protocol | 使用 IP 协议映射进行转换 |
| 客户端 | principal.hostname | 直接复制值 |
| request_address、ip4、ip6、source_addresses | principal.ip | 合并自 request_address(提取的 IP)、ip4(提取的 IP)、ip6(提取的 IP)以及从 source_addresses 数组中提取的 IP |
| 区域 | principal.location.country_or_region | 直接复制值 |
| clientMac | principal.mac | 如果与 MAC 正则表达式匹配,则直接复制值 |
| clientID | principal.resource.product_object_id | 直接复制值 |
| 用户名 | principal.user.user_display_name | 直接复制值 |
| user_id | principal.user.userid | 直接复制值 |
| code, original_code, clientType, collection, network_name, networkID, collectionID, policy, policyID, scheduled_policy, scheduled_policyID, sec_cats, sec_allow_cats, block_cats, block_allow_cats, threat, allowed, method, 组织, organizationID, applicationID, application_name, application_categoryID, application_category_name | security_result.detection_fields | 来自各种源字段的合并标签(以键值对形式表示) |
| 域名 | target.administrative_domain | 直接复制值 |
| fqdn | target.domain.name | 直接复制值 |
| metadata.product_name | 设置为“DNSFILTER” | |
| metadata.vendor_name | 设置为“DNSFILTER” |
需要更多帮助?获得社区成员和 Google SecOps 专业人士的解答。