收集 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 传感器主机具有读取日志文件的权限
- 对传感器文件系统(通常位于
/opt/zeek/logs/或/usr/local/zeek/logs/下)中的 Zeek TSV 日志文件的访问权限
获取 Google SecOps 注入身份验证文件
- 登录 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该服务应显示为 正在运行。
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该服务应显示为有效(正在运行)。
其他安装资源
如需了解其他安装选项和问题排查信息,请参阅 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: compression: gzip creds_file_path: '/etc/bindplane-agent/ingestion-auth.json' customer_id: '<customer_id>' endpoint: malachiteingestion-pa.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:提取身份验证文件的完整路径:- Linux:
/etc/bindplane-agent/ingestion-auth.json - Windows:
C:\Program Files\observIQ OpenTelemetry Collector\ingestion-auth.json
- Linux:
<customer_id>:上一步中的客户 IDendpoint:区域端点网址:- 美国:
malachiteingestion-pa.googleapis.com - 欧洲:
europe-malachiteingestion-pa.googleapis.com - 亚洲:
asia-southeast1-malachiteingestion-pa.googleapis.com - 如需查看完整列表,请参阅区域级端点
- 美国:
BRO_TSV:日志类型,与在 Chronicle 中显示的完全一致ingestion_labels:YAML 格式的可选标签(例如env: production)
流水线配置:
bro_to_chronicle:流水线的描述性名称
保存配置文件
- 修改后,保存文件:
- 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 地址。 - 如果实际 Zeek 日志文件路径不同,请将其替换为
/opt/zeek/logs/current/*.log。 - 对于 TCP 转发,请使用
@@(而不是@)(必须与 Bindplane 代理接收器类型一致)。
- 将
重新启动 rsyslog 以应用更改:
sudo systemctl restart rsyslog通过检查 Bindplane 代理日志,验证是否正在接收 syslog 消息。
UDM 映射表
| 日志字段 | UDM 映射 | 逻辑 |
|---|---|---|
| rtt、operation、tunnel_type、action、cmd、arg、rows | additional.fields | 从 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,如果 next_protocol 为 http,则 http/ssl 为 NETWORK_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 可用,则使用 uid 中的值,否则使用 id 中的值 |
| metadata.product_name | 设置为“兄弟” | |
| metadata.vendor_name | 设置为“Zeek” | |
| service_proto, source | network.application_protocol | 对于连接,从 service_proto 映射;对于文件,从来源映射;对于其他,为常量 |
| 主机名 | network.dhcp.client_hostname | 直接复制值 |
| lease_time | network.dhcp.lease_time_seconds | 已转换为 uinteger |
| 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 | 已转换为 uinteger |
| 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 的值,对于 UDP 为“UDP”,对于 TCP 为“TCP” |
| id_resp_bytes、received_bytes | network.received_bytes | 将 id_resp_bytes(针对连接)和 received_bytes(针对文件)转换为 uinteger |
| id_orig_bytes | network.sent_bytes | 已转换为 uinteger |
| uid | network.session_id | 直接复制值 |
| 加密 | 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 | 直接复制值 |
| 已建立 | 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 | 已转换为 uinteger |
| 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 | 转换为整数,如果不是 local_orig,则为来自 id.orig_p 的值或反向连接值 |
| user_email | principal.user.email_addresses | 已从 user_email 合并 |
| user、username、user_name | principal.user.userid | 用户针对 FTP 提供的值、针对 RADIUS 提供的用户名、针对 Kerberos 提供的 user_name |
| qclass | q.class | 已转换为 uinteger |
| qname、q.name | q.name | 来自 qname 或 q.name 的值 |
| qtype | q.type | 已转换为 uinteger |
| result, auth_success | security_result | 从 security_result 合并,其中针对半径失败的操作为 BLOCK,针对 SSH 的操作为 ALLOW/BLOCK/UNKNOWN |
| uri | target.administrative_domain | 使用 Grok 从 URI 中提取 |
| full_file_path, fuid | target.file.full_path | smb_files 的 full_file_path 值,文件的 fuid 值 |
| md5 | target.file.md5 | 直接复制值 |
| mime_type | target.file.mime_type | 直接复制值 |
| sha1 | target.file.sha1 | 直接复制值 |
| size、file_size | target.file.size | 将 smb_files 的大小和文件的 file_size 转换为 uinteger |
| server_host、host、CN、server | target.hostname | 来自 server_host 的值(适用于 Kerberos)、host 的值(适用于 HTTP)、CN 的值(适用于 x509)、server 的值(适用于 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,则为连接反向值 |
| path、named_pipe | target.resource.name | smb_mapping 的路径值,dce_rpc 的命名管道 |
| share_type | target.resource.type | 来自 smb_mapping 的 share_type 的值,对于 dce_rpc 为“PIPE” |
| 网址 | target.url | 由主机和 URI 连接而成 |