收集 Zeek(以前称为 Bro)TSV 日志

支持的语言:

本文档介绍了如何使用 Bindplane 代理将 Zeek(以前称为 Bro)TSV 日志注入到 Google Security Operations。

Zeek(以前称为 Bro)是一个网络安全监控平台,可被动分析网络流量并生成详细的、使用制表符分隔的日志文件,其中涵盖连接、DNS 查询、HTTP 事务、SSL/TLS 会话和文件分析。默认情况下,Zeek 传感器会在 /opt/zeek/logs/ 或 /usr/local/zeek/logs/ 下生成 TSV 日志文件。

准备工作

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

  • Google SecOps 实例
  • Windows Server 2016 或更高版本,或者具有 systemd 的 Linux 主机
  • Bindplane 代理与 Zeek 传感器主机之间的网络连接
  • 如果在代理后面运行,请确保按照 Bindplane 代理要求打开防火墙端口
  • 对 Zeek 传感器主机的特权访问权限,以及读取日志文件的权限
  • 对传感器文件系统上的 Zeek TSV 日志文件(通常位于 /opt/zeek/logs/ 或 /usr/local/zeek/logs/ 下)的访问权限

获取 Bindplane 代理的 Google SecOps 凭据

如需向 Google SecOps 验证 Bindplane 代理的身份,请选择以下方法之一:

  • 新部署:使用 Chronicle API(选项 1)。
  • 旧版部署:继续使用数据注入身份验证文件(方法 2),直到 Ingestion API 于 2027 年 7 月 20 日停用。
  1. 登录 Google Cloud 控制台,然后选择与您的 Google SecOps 实例关联的 Google Cloud 项目。
  2. 前往 IAM 和管理 > 服务账号。
  3. 点击创建服务账号。
  4. 提供以下配置详细信息:
    • 服务账号名称:输入账号的名称(例如 bindplane-ingest)。
    • 服务账号说明:输入说明(例如 Bindplane agent log ingestion)。
  5. 点击创建并继续。
  6. 在向此服务账号授予对项目的访问权限部分,点击选择角色,然后选择 Chronicle Editor。
  7. 点击继续,然后点击完成。
  8. 点击您创建的服务账号,然后前往密钥标签页。
  9. 依次点击添加密钥 > 创建新密钥。
  10. 选择 JSON,然后点击创建。密钥文件会下载到您的计算机上。
  11. 将密钥文件另存为 Bindplane 收集器目录(在 Linux 上为 /opt/observiq-otel-collector/ingestion-auth.json,在 Windows 上为 C:\Program Files\observIQ OpenTelemetry Collector\ingestion-auth.json)中的 ingestion-auth.json,或更新 config.yaml 中的 creds_file_path 以与您保存密钥文件的路径相匹配。
  12. 前往 IAM 和管理 > 设置,然后复制项目编号。您在配置导出器时需要用到该名称。

方法 2:下载数据注入身份验证文件(旧版)

  1. 登录 Google SecOps 控制台。
  2. 前往 SIEM 设置> 收集代理。
  3. 下载数据注入身份验证文件。
  4. 将文件安全地保存在将要安装 Bindplane 代理的系统上。

获取 Google SecOps 客户 ID

  1. 登录 Google SecOps 控制台。
  2. 前往 SIEM 设置 > 个人资料。
  3. 复制并保存组织详细信息部分中的客户 ID。

安装 Bindplane 代理

根据以下说明,在 Windows 或 Linux 操作系统上安装 Bindplane 代理。

Windows 安装

  1. 以管理员身份打开命令提示符或 PowerShell。
  2. 运行以下命令:

    msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet
    
  3. 等待安装完成。

  4. 运行以下命令,验证安装是否成功:

    sc query observiq-otel-collector
    

    该服务应显示为 RUNNING。

Linux 安装

  1. 打开具有 root 或 sudo 权限的终端。
  2. 运行以下命令:

    sudo sh -c "$(curl -fsSlL https://github.com/observiq/bindplane-agent/releases/latest/download/install_unix.sh)" install_unix.sh
    
  3. 等待安装完成。

  4. 运行以下命令,验证安装是否成功:

    sudo systemctl status observiq-otel-collector
    

    该服务应显示为 active (running)。

其他安装资源

如需了解其他安装选项和问题排查,请参阅 Bindplane 代理安装指南。

配置 Bindplane 代理以注入 syslog 并将其发送到 Google SecOps

找到配置文件

  • Linux:

    sudo nano /opt/observiq-otel-collector/config.yaml
    
  • Windows:

    notepad "C:\Program Files\observIQ OpenTelemetry Collector\config.yaml"
    

修改配置文件

  • 将 config.yaml 的全部内容替换为以下配置:

    receivers:
      udplog:
        listen_address: "0.0.0.0:514"
    
    exporters:
      chronicle/bro_tsv:
        protocol: https
        # Region of your instance, for example us, europe, asia-southeast1
        location: <LOCATION>
        # Project number of the Google Cloud project linked to the instance
        project: '<PROJECT_NUMBER>'
        compression: gzip
        creds_file_path: '/opt/observiq-otel-collector/ingestion-auth.json'
        customer_id: '<customer_id>'
        endpoint: chronicle.googleapis.com
        log_type: BRO_TSV
        raw_log_field: body
        ingestion_labels:
          env: production
    
    service:
      pipelines:
        logs/bro_to_chronicle:
          receivers:
            - udplog
          exporters:
            - chronicle/bro_tsv
    

配置参数

替换以下占位符:

  • 接收器配置:

    • udplog:基于协议的接收器类型:
      • udplog(适用于 UDP syslog)
      • tcplog(适用于 TCP syslog)
    • 0.0.0.0:要监听的 IP 地址:
      • 0.0.0.0,以监听所有接口(推荐)
      • 在某个接口上监听的特定 IP 地址
    • 514:要监听的端口号(例如 514、1514、6514)
  • 导出器配置:

    • bro_tsv:导出器的描述性名称
    • creds_file_path:服务账号 JSON 密钥文件的完整路径(选项 1):
      • Linux:/opt/observiq-otel-collector/ingestion-auth.json
      • Windows:C:\Program Files\observIQ OpenTelemetry Collector\ingestion-auth.json
    • <customer_id>:上一步中的客户 ID
    • location:将 <LOCATION> 替换为 Google SecOps 实例的区域(例如 us、europe 或 asia-southeast1)。导出器会使用此值作为 chronicle.googleapis.com 的前缀。如需查看完整列表,请参阅区域级端点。
    • project:将 <PROJECT_NUMBER> 替换为 IAM 和管理 > 设置中的项目编号。
    • endpoint:保持设置为 chronicle.googleapis.com。
    • BRO_TSV:日志类型,与在 Chronicle 中显示的完全一致
    • ingestion_labels:YAML 格式的可选标签(例如 env: production)
  • 流水线配置:

    • bro_to_chronicle:流水线的描述性名称

旧版提取 API 导出工具

  • 如果您使用选项 2 中的数据注入身份验证文件,请将 exporters 代码块替换为以下内容。将 creds_file_path 设置为数据注入身份验证文件的路径,如果您的实例位于美国境外,请将 malachiteingestion-pa.googleapis.com 替换为您的区域端点(例如 europe-malachiteingestion-pa.googleapis.com)。

    exporters:
      chronicle/bro_tsv:
        compression: gzip
        creds_file_path: '/opt/observiq-otel-collector/ingestion-auth.json'
        customer_id: '<customer_id>'
        endpoint: malachiteingestion-pa.googleapis.com
        log_type: BRO_TSV
        raw_log_field: body
        ingestion_labels:
          env: production
    

保存配置文件

  • 修改后,保存文件:
    • Linux:依次按 Ctrl+O、Enter 和 Ctrl+X
    • Windows:依次点击文件 > 保存

重启 Bindplane 代理以应用更改

  • 如需在 Linux 中重启 Bindplane 代理,请运行以下命令:

    sudo systemctl restart observiq-otel-collector
    
    1. 验证服务是否正在运行:

      sudo systemctl status observiq-otel-collector
      
    2. 检查日志中是否存在错误:

      sudo journalctl -u observiq-otel-collector -f
      
  • 如需在 Windows 中重启 Bindplane 代理,请选择以下选项之一:

    • 以管理员身份运行命令提示符或 PowerShell:

      net stop observiq-otel-collector && net start observiq-otel-collector
      
    • 服务控制台:

      1. 按 Win+R,输入 services.msc,然后按 Enter 键。
      2. 找到 observIQ OpenTelemetry 收集器。
      3. 右键点击并选择重启。
      4. 验证服务是否正在运行:

        sc query observiq-otel-collector
        
      5. 检查日志中是否存在错误:

        type "C:\Program Files\observIQ OpenTelemetry Collector\log\collector.log"
        

配置 Zeek syslog 转发

Zeek 会在本地生成 TSV 日志文件。如需使用 syslog 将这些日志转发到 Bindplane 代理,请在 Zeek 传感器主机上配置 syslog 守护程序。

  1. 使用 root 或 sudo 权限登录 Zeek 传感器主机。
  2. 安装并配置 rsyslog 或 syslog-ng(如果尚未安装)。
  3. 创建 rsyslog 配置文件以转发 Zeek 日志:

    sudo nano /etc/rsyslog.d/zeek-forward.conf
    
  4. 添加以下配置,以将 Zeek 日志转发到 Bindplane 代理:

    module(load="imfile")
    input(type="imfile"
        File="/opt/zeek/logs/current/*.log"
        Tag="zeek:"
        Severity="info"
        Facility="local6")
    local6.* @<BINDPLANE_AGENT_IP>:514
    
    • 将 <BINDPLANE_AGENT_IP> 替换为 Bindplane 代理主机 IP 地址。
    • 将 /opt/zeek/logs/current/*.log 替换为 Zeek 日志文件的实际路径(如果不同)。
    • 使用 @@ 而不是 @ 进行 TCP 转发(必须与 Bindplane 代理接收器类型匹配)。
  5. 重启 rsyslog 以应用更改:

    sudo systemctl restart rsyslog
    
  6. 通过检查 Bindplane 代理日志,验证是否正在接收 syslog 消息。

UDM 映射表

日志字段 UDM 映射 逻辑
rtt、操作、tunnel_type、操作、cmd、arg、行 additional.fields Merged from additional_rtt, additional_op, additional_tt, additional_action, additional_cmd, additional_arg, additional_rows
extensions.auth.type 设置为“AUTHTYPE_UNSPECIFIED”
conn_state、action、error、desc metadata.description 对于 bro_conn,设置为 conn_state 说明;对于 bro_smb_files,设置为操作;对于 bro_kerberos,设置为“KERBEROS: %{error}”;对于 AsymPayloadFlow,设置为说明;对于其他,设置为常量
bro_type、qerror、next_protocol、protocol metadata.event_type 默认设置为 GENERIC_EVENT,对于 dns 设置为 NETWORK_DNS,对于 conn/ntlm/smb_mapping/dce_rpc/tunnel/mysql/ssh/udp/tcp 设置为 NETWORK_CONNECTION,对于 dhcp 设置为 NETWORK_DHCP,对于 http/ssl 设置为 NETWORK_HTTP(如果 next_protocol 为 http),对于 smb_files/files/x509 设置为 NETWORK_UNCATEGORIZED,对于 radius 设置为 USER_LOGIN,对于 ftp 设置为 NETWORK_FTP,如果 qerror query_not_present,则设置为 NETWORK_UNCATEGORIZED
bro_type、prod_event metadata.product_event_type 如果 bro_type 不为空,则取 bro_type 的值,否则取 prod_event 的值
uid、id metadata.product_log_id uid 的值(如有),否则为 id 的值
metadata.product_name 设为“兄弟”
metadata.vendor_name 设置为“Zeek”
service_proto, source network.application_protocol 从 conn 的 service_proto 映射,从文件的 source 映射,其他为常量
主机名 network.dhcp.client_hostname 直接复制的值
lease_time network.dhcp.lease_time_seconds 已转换为无符号整数
dhcp_info network.dhcp.type 如果 =~“ACK”,则设置为“ACK”;如果 =~“RELEASE”,则设置为“RELEASE”;如果 =~“INFORM”,则设置为“INFORM”;如果 =~“DISCOVER”,则设置为“DISCOVER”;如果 =~“OFFER”,则设置为“OFFER”;如果 =~“REQUEST”,则设置为“REQUEST”
assigned_ip network.dhcp.yiaddr 直接复制的值
方向 network.direction 直接复制的值
answer_list network.dns.answers 直接复制的值
trans_id network.dns.id 已转换为无符号整数
q network.dns.questions 从 q 合并
rcode network.dns.response_code 如果不是“-”,则转换为 uinteger
命令 network.ftp.command 直接复制的值
方法 network.http.method 直接复制的值
referrer network.http.referral_url 直接复制值
status_code network.http.response_code 已转换为整数
user_agent network.http.user_agent 直接复制的值
proto, protocol network.ip_protocol proto 中 conn 的值,udp 的值为“UDP”,tcp 的值为“TCP”
id_resp_bytes, received_bytes network.received_bytes 已从 id_resp_bytes(对于 conn)和 received_bytes(对于 files)转换为 uinteger
id_orig_bytes network.sent_bytes 已转换为无符号整数
uid network.session_id 直接复制的值
cipher network.tls.cipher 直接复制值
client_issuer network.tls.client.certificate.issuer 直接复制值
client_subject network.tls.client.certificate.subject 直接复制的值
客户端 network.tls.client.certificate.version 直接复制值
ja3 network.tls.client.ja3 直接复制值
曲线 network.tls.curve 直接复制的值
established network.tls.established 直接复制的值
next_protocol network.tls.next_protocol 直接复制的值
已恢复 network.tls.resumed 直接复制值
issuer, certificate.issuer network.tls.server.certificate.issuer ssl 的 issuer 字段中的值,x509 的 certificate.issuer 字段中的值
certificate.not_valid_after network.tls.server.certificate.not_after 使用日期过滤条件进行转换
certificate.not_valid_before network.tls.server.certificate.not_before 使用日期过滤条件转换
certificate.serial network.tls.server.certificate.serial 直接复制值
subject, certificate.subject network.tls.server.certificate.subject SSL 的主题值,x509 的 certificate.subject
certificate.version network.tls.server.certificate.version 已转换为字符串
ja3s network.tls.server.ja3s 直接复制值
版本 network.tls.version 直接复制值
网域 principal.administrative_domain 直接复制值
file_size principal.file.size 已转换为无符号整数
client_host、_system_name、_HostName principal.hostname 来自 client_host 的值(适用于 Kerberos)、来自 _system_name 的值(适用于 x509)、提取的 _HostName(如果已提取)
id.orig_h principal.ip 从 id.orig_h 合并
mac principal.mac 直接复制值
id.orig_p principal.port 转换为整数,值来自 id.orig_p,如果不是 local_orig,则为 conn 的反向值
user_email principal.user.email_addresses 已从 user_email 合并
user, username, user_name principal.user.userid 用户提供的值(用于 FTP、RADIUS 的用户名、Kerberos 的 user_name)
qclass q.class 已转换为无符号整数
qname, q.name q.name 来自 qname 或 q.name 的值
qtype q.type 已转换为无符号整数
result、auth_success security_result 从 security_result 合并,radius 的操作为 BLOCK,失败;ssh 的操作为 ALLOW/BLOCK/UNKNOWN
uri target.administrative_domain 使用 grok 从 URI 中提取
full_file_path、fuid target.file.full_path smb_files 的 full_file_path 中的值,files 的 fuid 中的值
md5 target.file.md5 直接复制值
mime_type target.file.mime_type 直接复制的值
sha1 target.file.sha1 直接复制的值
size, file_size target.file.size 将 smb_files 的 size 和文件的 file_size 从 size 转换为 uinteger
server_host、host、CN、server target.hostname 来自 server_host 的值(适用于 Kerberos)、主机(适用于 HTTP)、CN(适用于 x509)、服务器(适用于 SSH)
id.resp_h target.ip 从 id.resp_h 合并
host_key、host_key_alg、kex_alg、mac_alg、compression_alg、cipher_alg、auth_attempts target.labels 从各种标签对象合并
id.resp_p target.port 转换为整数,值来自 id.resp_p,如果不是 local_orig,则为 conn 的反向值
path、named_pipe target.resource.name 来自 smb_mapping 路径的值,dce_rpc 的命名管道
share_type target.resource.type smb_mapping 的 share_type 值,“PIPE”表示 dce_rpc
网址 target.url 由主机和 URI 串联而成

更新日志

查看此解析器的更新日志

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