收集 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:为 Chronicle API 创建服务账号(推荐)
- 登录 Google Cloud 控制台,然后选择与您的 Google SecOps 实例关联的 Google Cloud 项目。
- 前往 IAM 和管理 > 服务账号。
- 点击创建服务账号。
- 提供以下配置详细信息:
- 服务账号名称:输入账号的名称(例如
bindplane-ingest)。 - 服务账号说明:输入说明(例如
Bindplane agent log ingestion)。
- 服务账号名称:输入账号的名称(例如
- 点击创建并继续。
- 在向此服务账号授予对项目的访问权限部分,点击选择角色,然后选择 Chronicle Editor。
- 点击继续,然后点击完成。
- 点击您创建的服务账号,然后前往密钥标签页。
- 依次点击添加密钥 > 创建新密钥。
- 选择 JSON,然后点击创建。密钥文件会下载到您的计算机上。
- 将密钥文件另存为 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以与您保存密钥文件的路径相匹配。 - 前往 IAM 和管理 > 设置,然后复制项目编号。您在配置导出器时需要用到该名称。
方法 2:下载数据注入身份验证文件(旧版)
- 登录 Google SecOps 控制台。
- 前往 SIEM 设置> 收集代理。
- 下载数据注入身份验证文件。
- 将文件安全地保存在将要安装 Bindplane 代理的系统上。
获取 Google SecOps 客户 ID
- 登录 Google SecOps 控制台。
- 前往 SIEM 设置 > 个人资料。
复制并保存组织详细信息部分中的客户 ID。
安装 Bindplane 代理
根据以下说明,在 Windows 或 Linux 操作系统上安装 Bindplane 代理。
Windows 安装
- 以管理员身份打开命令提示符或 PowerShell。
运行以下命令:
msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet等待安装完成。
运行以下命令,验证安装是否成功:
sc query observiq-otel-collector该服务应显示为 RUNNING。
Linux 安装
- 打开具有 root 或 sudo 权限的终端。
运行以下命令:
sudo sh -c "$(curl -fsSlL https://github.com/observiq/bindplane-agent/releases/latest/download/install_unix.sh)" install_unix.sh等待安装完成。
运行以下命令,验证安装是否成功:
sudo systemctl status observiq-otel-collector该服务应显示为 active (running)。
其他安装资源
如需了解其他安装选项和问题排查,请参阅 Bindplane 代理安装指南。
配置 Bindplane 代理以注入 syslog 并将其发送到 Google SecOps
找到配置文件
Linux:
sudo nano /opt/observiq-otel-collector/config.yamlWindows:
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
- Linux:
<customer_id>:上一步中的客户 IDlocation:将<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:依次点击文件 > 保存
- Linux:依次按
重启 Bindplane 代理以应用更改
如需在 Linux 中重启 Bindplane 代理,请运行以下命令:
sudo systemctl restart observiq-otel-collector验证服务是否正在运行:
sudo systemctl status observiq-otel-collector检查日志中是否存在错误:
sudo journalctl -u observiq-otel-collector -f
如需在 Windows 中重启 Bindplane 代理,请选择以下选项之一:
以管理员身份运行命令提示符或 PowerShell:
net stop observiq-otel-collector && net start observiq-otel-collector服务控制台:
- 按
Win+R,输入services.msc,然后按 Enter 键。 - 找到 observIQ OpenTelemetry 收集器。
- 右键点击并选择重启。
验证服务是否正在运行:
sc query observiq-otel-collector检查日志中是否存在错误:
type "C:\Program Files\observIQ OpenTelemetry Collector\log\collector.log"
- 按
配置 Zeek syslog 转发
Zeek 会在本地生成 TSV 日志文件。如需使用 syslog 将这些日志转发到 Bindplane 代理,请在 Zeek 传感器主机上配置 syslog 守护程序。
- 使用 root 或 sudo 权限登录 Zeek 传感器主机。
- 安装并配置
rsyslog或syslog-ng(如果尚未安装)。 创建 rsyslog 配置文件以转发 Zeek 日志:
sudo nano /etc/rsyslog.d/zeek-forward.conf添加以下配置,以将 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 代理接收器类型匹配)。
- 将
重启 rsyslog 以应用更改:
sudo systemctl restart rsyslog通过检查 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 专业人士的解答。