收集 DNSFilter 日志
解析器版本:1.0
本文档介绍了如何配置 DNSFilter,以便通过 HTTP 事件收集器 (HEC) 协议使用网络钩子将日志推送到 Google Security Operations。
DNSFilter 是一款 AI 赋能的 DNS 安全解决方案,可提供威胁防护、内容过滤和网络可见性。数据导出功能支持通过 HTTP 事件收集器 (HEC) API 将 DNS 查询日志数据自动导出到 SIEM 平台,从而支持实时安全监控和合规性报告。
准备工作
请确保满足以下前提条件:
- Google SecOps 实例
- 拥有管理员或更高级别权限,可访问 DNSFilter 信息中心
- DNSFilter 数据导出插件功能已启用(作为付费插件,适用于基本版、专业版和企业版方案)
- 拥有对 Google Cloud Console 的访问权限(用于创建 API 密钥)
在 Google SecOps 中创建 webhook Feed
创建 Feed
- 依次前往设置 > 数据管理 > Feed。如果您使用的是仅 SIEM 平台,请依次前往设置 > Feed。
- 点击添加新新闻信息流。
- 在下一页上,点击配置单个 Feed。
- 在 Feed 名称字段中,输入 Feed 的名称(例如
DNSFilter HEC Feed)。 - 选择 Webhook 作为来源类型。
- 选择 DNSFILTER 作为日志类型。
- 点击下一步。
- 为以下输入参数指定值:
- 拆分定界符(可选):留空,因为每个 HEC 请求都包含格式正确的事件
- 资产命名空间:资产命名空间
- 注入标签:要应用于此 Feed 中事件的标签
- 点击下一步。
- 在最终确定界面中查看新的新闻信息流配置,然后点击提交。
生成并保存密钥
创建 Feed 后,您必须生成用于身份验证的密钥:
- 在 Feed 详情页面上,点击生成密钥。
- 系统会显示一个对话框,其中包含密钥。
复制并妥善保存密钥。
获取 Feed 端点网址
- 前往该 Feed 的详细信息标签页。
- 在端点信息部分,复制 Feed 端点网址。
网址格式为:
https://{region}-chronicle.googleapis.com/v1/{parent}/logs:import其中,
{region}是 Google SecOps 实例所在的区域(例如us、europe或asia-southeast1),{parent}是资源路径,格式为projects/<PROJECT_ID>/locations/<LOCATION>/instances/<INSTANCE_ID>/logTypes/<LOG_TYPE>。保存此网址,以便在后续步骤中使用。
点击完成。
创建 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://{region}-chronicle.googleapis.com/v1/{parent}/logs:import?key=AIzaSyD...
在 DNSFilter 中配置数据导出
- 登录 DNSFilter 信息中心。
- 前往工具 > 数据导出。
- 在导出目的地部分,选择 HTTP Event Collector (HEC)。
- 在 HEC 配置部分中,输入以下内容:
- HTTP Event Collector 网址:粘贴上一步中包含 API 密钥的完整端点网址。
- Active Event Collector Token(活跃事件收集器令牌):粘贴在创建 Google SecOps Feed 期间生成的密钥。
- 点击保存配置。
DNSFilter 将测试连接,如果配置正确,则会显示成功消息。
验证数据注入
- 在 DNSFilter 信息中心内,依次前往 Tools > Data Export(工具 > 数据导出)。
- 验证状态是否显示为有效或已连接。
- 在 Google SecOps 中,依次前往设置 > 数据管理 > Feed。如果您使用的是仅 SIEM 平台,请依次前往设置 > Feed。
- 找到您的 DNSFilter Feed,并验证状态是否显示为有效。
- 点击 Feed 名称即可查看详细信息。
- 检查注入的日志指标,确认数据正在流动。
如需搜索 DNSFilter 事件,请前往搜索,然后运行以下查询:
metadata.log_type = "DNSFILTER"
身份验证方法参考
Google SecOps 网络钩子 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 密钥和 Secret 在网址中不可见
- 更安全(标头不会记录在 Web 服务器访问日志中)
- 供应商支持的首选方法
身份验证标头名称
Google SecOps 接受以下标头名称进行身份验证:
对于 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 中未显示任何数据
如果连接成功但未显示任何数据,请执行以下操作:
- 验证 DNSFilter 部署中是否正在生成 DNS 查询。
- 查看 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 专业人士的解答。