收集自定义 DNS 日志

解析器版本:1.0

支持的平台:

本文档介绍了如何使用 Google Cloud Storage V2 将自定义 DNS 日志注入到 Google Security Operations。

自定义 DNS 是一种通用日志类型,用于记录来自自定义或不受支持的 DNS 实现的 DNS 服务器日志。它可捕获 DNS 查询和响应数据,包括网域、记录类型和客户端信息。由于这些日志来自非标准 DNS 源,因此您必须将其导出到 Google Cloud Storage (GCS) 存储桶,然后配置 Google SecOps Feed 以注入这些日志。

准备工作

请确保满足以下前提条件:

  • Google SecOps 实例
  • 启用了 Cloud Storage API 的 Google Cloud 项目
  • 创建和管理 GCS 存储分区的权限
  • 管理 GCS 存储分区的 IAM 政策的权限
  • 以支持的格式(建议使用 JSON)生成日志的 DNS 服务器或服务
  • 对 DNS 服务器的管理员访问权限,用于配置日志导出

创建 Google Cloud Storage 存储桶

  1. 前往 Google Cloud 控制台
  2. 选择您的项目或创建新项目。
  3. 在导航菜单中,依次前往 Cloud Storage > 存储分区
  4. 点击创建存储分区
  5. 提供以下配置详细信息:

    设置
    为存储桶命名 输入一个全局唯一的名称(例如 custom-dns-logs
    位置类型 根据您的需求进行选择(区域级、双区域、多区域)
    位置 选择离您的 Google SecOps 实例最近的位置(例如 us-central1
    存储类别 标准(建议用于经常访问的日志)
    访问权限控制 均匀(推荐)
    保护工具 可选:启用对象版本控制或保留政策
  6. 点击创建

配置自动将 DNS 日志导出到 GCS

导出 DNS 日志的方法取决于您的 DNS 服务器实现。请选择最适合您环境的方法。

选项 1:Cloud Logging 接收器(适用于 GCE 上的 DNS 服务器)

如果您的 DNS 服务器在 Google Compute Engine 实例上运行并记录到 Cloud Logging,请创建一个日志接收器,以将 DNS 日志直接导出到 GCS。

  1. GCP 控制台中,依次前往日志记录 > 日志路由器
  2. 点击创建接收器
  3. 提供以下配置详细信息:

    设置
    接收器名称 custom-dns-to-gcs
    接收器目标位置 Cloud Storage 存储桶
    存储分区 custom-dns-logs
    包含项过滤条件 与您的 DNS 日志条目匹配的过滤条件(例如,resource.type="gce_instance" AND logName="projects/YOUR_PROJECT_ID/logs/dns"
  4. 点击创建接收器

选项 2:Cloud Scheduler 与 Cloud Build(适用于本地 DNS 服务器)

使用由 Cloud Scheduler 触发的 Cloud Build 运行容器化导出作业,该作业会从远程服务器收集 DNS 日志并将其写入 GCS。

  1. 为导出作业创建服务账号:

    1. GCP 控制台中,依次前往 IAM 和管理 > 服务账号
    2. 点击创建服务账号
    3. 提供以下配置详细信息:
      • 服务账号名称:输入 dns-log-export-sa
      • 服务账号说明:输入 Service account for automated DNS log export to GCS
    4. 点击创建并继续
    5. 添加以下角色:
      • Storage Object Admin(用于将文件写入 GCS)
      • Cloud Build 编辑者(用于运行 Cloud Build 作业)
    6. 点击完成
  2. 创建 Cloud Build 配置文件 (cloudbuild.yaml):

    steps:
      - name: 'gcr.io/cloud-builders/gcloud'
        entrypoint: 'bash'
        args:
          - '-c'
          - |
            # Collect DNS logs from your server
            # Replace with the actual command for your environment
            # Example: pull logs via syslog-ng, rsync from remote server, or query DNS log API
            curl -s -H "Authorization: Bearer $${API_TOKEN}" \
              "https://your-dns-server.example.com/api/logs?format=json" \
              -o /workspace/dns_logs.json
            # Upload to GCS
            gcloud storage cp /workspace/dns_logs.json \
              gs://${_BUCKET_NAME}/dns/dns_logs_$(date -u +%Y%m%d_%H%M%S).json
    substitutions:
      _BUCKET_NAME: 'custom-dns-logs'
    
  3. 创建 Cloud Scheduler 作业以触发构建:

    1. GCP Console 中,前往 Cloud Scheduler
    2. 点击创建作业
    3. 提供以下配置详细信息:

      设置
      名称 dns-log-export-hourly
      区域 选择与您的 GCS 存储桶相同的区域
      频率 0 * * * *(每小时)
      时区 世界协调时间 (UTC)(推荐)
      目标类型 HTTP
      网址 https://cloudbuild.googleapis.com/v1/projects/YOUR_PROJECT_ID/builds
      HTTP 方法 POST
      身份验证标头 添加 OAuth 令牌
      服务账号 dns-log-export-sa@YOUR_PROJECT_ID.iam.gserviceaccount.com
    4. 点击创建

方法 3:Storage Transfer Service(适用于本地文件系统)

如果 DNS 日志写入本地文件系统,请使用 Storage Transfer Service 和转移代理将其移至 GCS。

  1. GCP Console 中,前往 Storage Transfer Service
  2. 点击创建转移作业
  3. 选择 POSIX 文件系统作为来源。
  4. 按照说明在 DNS 服务器或可访问 DNS 日志文件的机器上安装 Storage Transfer Agent
  5. 配置转移作业:

    设置
    源目录 DNS 日志文件目录的路径
    目标存储桶 custom-dns-logs
    目标路径 dns/
    时间表 设置周期性时间表(例如,每小时一次)
  6. 点击创建

检索 Google SecOps 服务账号

  1. 依次前往 SIEM 设置 > Feed
  2. 点击添加新 Feed
  3. 点击配置单个 Feed
  4. Feed 名称字段中,输入 Feed 的名称(例如 Custom DNS Logs)。
  5. 选择 Google Cloud Storage V2 作为来源类型
  6. 选择 Custom DNS 作为日志类型
  7. 点击获取服务账号
  8. 系统会显示一个唯一的服务账号电子邮件地址,例如:

    chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.com
    
  9. 复制此电子邮件地址,以便在下一步中使用。

向 Google SecOps 服务账号授予 IAM 权限

Google SecOps 服务账号需要您的 GCS 存储桶的 Storage Object Viewer 角色。

  1. 前往 Cloud Storage > 存储分区
  2. 点击您的存储桶名称(例如 custom-dns-logs)。
  3. 前往权限标签页。
  4. 点击授予访问权限
  5. 提供以下配置详细信息:
    • 添加主账号:粘贴 Google SecOps 服务账号电子邮件地址(例如 chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.com)。
    • 分配角色:选择 Storage Object Viewer
  6. 点击保存

配置 Google SecOps Feed

  1. 依次前往 SIEM 设置 > Feed
  2. 点击添加新 Feed
  3. 点击配置单个 Feed
  4. Feed 名称字段中,输入 Feed 的名称(例如 Custom DNS Logs)。
  5. 选择 Google Cloud Storage V2 作为来源类型
  6. 选择 Custom DNS 作为日志类型
  7. 点击下一步
  8. 为以下输入参数指定值:

    • 存储桶 URI:输入 GCS 存储桶 URI:

      gs://custom-dns-logs/dns/
      
      • custom-dns-logs 替换为您的 GCS 存储桶名称。
      • dns 替换为您配置的前缀路径。
    • 来源删除选项:根据您的偏好选择删除选项:

      • 永不:转移后永不删除任何文件(建议用于测试)。
      • 删除已转移的文件和空目录:成功转移后删除文件和空目录。

    • 文件存在时间上限:包含在过去指定天数内修改的文件(默认值为 180 天)。

    • 资产命名空间资产命名空间

    • 注入标签:要应用于此 Feed 中事件的标签。

  9. 点击下一步

  10. 最终确定界面中查看新的 Feed 配置,然后点击提交

UDM 映射表

日志字段 UDM 映射 逻辑
receiveTimestamp metadata.event_timestamp 解析为 RFC 3339
message metadata.event_type 已映射:"dns_query"NETWORK_DNS
jsonPayload.msg metadata.product_event_type 直接映射
insertId metadata.product_log_id 直接映射
message metadata.product_name 已映射:"dns_query"Custom DNS
message metadata.vendor_name 已映射:"dns_query"CUSTOM
message network.application_protocol 已映射:"dns_query"DNS
dns_answers network.dns.answers 已合并
message network.dns.answers 已映射:"dns_query"dns_answers
dns_question network.dns.questions 已合并
message network.dns.questions 已映射:"dns_query"dns_question
dns.response_code network.dns.response_code 已重命名/已映射
message principal.hostname 已映射:"dns_query"jsonPayload.dns_query.server
jsonPayload.dns_query.server principal.ip 已合并
message principal.ip 已映射:"dns_query"jsonPayload.dns_query.server
message security_result 已映射:"dns_query"security_result
logName security_result.category_details 已合并
message security_result.category_details 已映射:"dns_query"logName
message security_result.severity 已映射:"dns_query"INFORMATIONAL"dns_query"MEDIUM"dns_query"HIGH
labels.application target.application 直接映射
message target.hostname 已映射:"dns_query"jsonPayload.dns_query.server
jsonPayload.dns_query.server target.ip 已合并
message target.ip 已映射:"dns_query"jsonPayload.dns_query.server
component_label target.labels 已合并
instance_group_label target.labels 已合并
message target.labels 已映射:"dns_query"component_label"dns_query"instance_group_label
labels.region target.location.country_or_region 直接映射
resource.labels.zone target.resource.attribute.cloud.availability_zone 直接映射
message target.resource.attribute.cloud.environment 已映射:"dns_query"GOOGLE_CLOUD_PLATFORM
resource.labels.project_id target.resource.attribute.cloud.project.id 直接映射
message target.resource.resource_type 已映射:"dns_query"VIRTUAL_MACHINE
不适用 metadata.event_type 常量:NETWORK_DNS
不适用 metadata.product_name 常量:Custom DNS
不适用 metadata.vendor_name 常量:CUSTOM
不适用 network.application_protocol 常量:DNS
不适用 principal.hostname 常量:jsonPayload.dns_query.server
不适用 security_result.severity 常量:INFORMATIONAL
不适用 target.hostname 常量:jsonPayload.dns_query.server
不适用 target.resource.attribute.cloud.environment 常量:GOOGLE_CLOUD_PLATFORM
不适用 target.resource.resource_type 常量:VIRTUAL_MACHINE

更新日志

查看相应解析器的更改日志

需要更多帮助?获得社区成员和 Google SecOps 专业人士的解答。