日志采集配置(Universal Forwarder)

做审计报告,数据进不来,后面全是白搭。Universal Forwarder(以下简称 UF)就是Splunk 的"数据入口"——它负责去各种日志源把数据拽过来,再安全地发给索引器。我个人习惯把 UF 比作"数据管道工",活儿不重但不能掉链子。

为什么单独要讲 UF?因为审计报告对数据完整性要求极高。你想想看,如果某个安全设备的日志因为 UF 配置漏了,到时候合规检查一问三不知,那才叫头疼。我在项目中遇到过不止一次,就是因为 UF 的 `inputs.conf` 里少写了一个路径,导致审计报告里缺了好几天的关键日志。

好,咱们开始。下面这张图是 UF 的核心工作流,你先记住这个框架:

Universal Forwarder 数据采集与转发流程 UF 数据采集与转发流程图 日志源 文件 / Syslog / 事件 Universal Forwarder 读取 → 解析 → 缓存 压缩 → TLS 加密 核心配置 inputs.conf / outputs.conf 网络传输 TCP 9997 / 加密 Indexer 索引、存储、搜索

3.1 安装 UF 前的准备

安装本身不复杂,但准备工作决定成败。我建议你列一个检查清单:

  • OS 兼容性:Windows 还是 Linux?UF 支持 RHEL、Ubuntu、CentOS、Windows Server 等主流系统。注意 32 位系统已逐渐被弃用。
  • 权限要求:读取日志文件的权限。例如 Linux 下 /var/log 通常需要 root 或 adm 组权限。我曾经在审计项目里因为 rsyslog 的权限没放开,UF 一直报 `Permission denied`,排查了半天。
  • 端口规划:UF 与 Indexer 通过 TCP 9997 通信(默认)。也要确认防火墙、安全组里放行了这个端口。
  • 部署方式:手动静默安装、rpm/deb 包推送,或通过配置管理工具(如 Ansible、SaltStack)。

3.2 安装与基本验证

Linux 下一行命令搞定(以 RHEL 为例):

sudo rpm -ivh splunkforwarder-9.0.5-xxx-linux-2.6-x86_64.rpm
sudo /opt/splunkforwarder/bin/splunk start --accept-license

启动后跑 `./splunk status` 检查进程。嗯,这里要注意:第一次启动会要求接受许可证并设置 admin 密码,建议用 `--seed-passwd` 参数非交互式完成。

个人习惯:使用 Ansible 批量部署时,我会把 `seed-password` 和 `deployment-server` 参数写在 playbook 里,一次搞定所有配置。

3.3 核心配置:inputs.conf

这是 UF 的"耳朵"——告诉 UF 去听哪些日志。文件路径在 $SPLUNK_HOME/etc/system/local/ 或 etc/apps/<app_name>/local/。

一个典型的内存片段:

[monitor:///var/log/secure]
index = os_security
sourcetype = linux_secure
disabled = 0

[monitor:///var/log/messages]
index = os_events
sourcetype = syslog
whitelist = \.log$

常用参数说明:

参数说明典型值
monitor://要监控的文件或目录/var/log/*.log
index数据写入的目标索引os_security
sourcetype日志类型,决定解析方式linux_secure
whitelist文件名白名单正则\.log$
blacklist文件名黑名单正则\.gz$

我个人建议:审计场景下,index 一定要按业务域划分(如 security、network、application),不要一股脑丢进 main。否则后面审计报告搜索时要写一堆索引限定。

3.4 输出配置:outputs.conf

UF 的"嘴巴"——告诉 UF 把数据发给谁。配置同样在 local/ 目录:

[tcpout]
defaultGroup = primary_indexers
compressed = true
sendCookedData = false

[tcpout:primary_indexers]
server = 192.168.1.10:9997, 192.168.1.11:9997
sslVerifyServerCert = false
sslCommonNameToCheck = splunk_indexer

重要参数说明:

  • compressed = true:启用压缩,节省带宽。我一般都会打开。
  • sendCookedData = false:UF 默认发原始数据,不要改。
  • server:可以写多个 IP 用逗号分隔,实现负载均衡和故障切换。
  • sslVerifyServerCert:生产环境建议设为 true 并配好证书。
警告:如果想用负载均衡,务必确认 Indexer 之间的数据重复处理策略。默认 UF 会轮询发送,同一事件可能被不同 Indexer 接收。审计数据要求严格去重,建议使用 autoLB = false 并启用 filterByIndex 或索引器集群模式。

3.5 部署与健康监控

单台 UF 配好容易,几十上百台管理起来才是真功夫。这里给出最佳实践:

  1. 使用 Deployment Server:集中推送 inputs.conf、outputs.conf、apps 和证书。避免逐台手动改配置。
  2. 启用 Forwarder Monitoring:在 UF 上配置 [perfmon] 或 [splunkd] 输入,把 UF 自身的 CPU/内存/发送队列大小上报到 Splunk,建一个仪表板随时监控。
  3. 日志缓存与队列:如果 Indexer 宕机,UF 的数据会缓存在本地。默认队列大小是 500KB,对大量日志可能不够。可以在 inputs.conf 中加:
[default]
queueSize = 10000  ; 单位 KB
maxKBps = 1024       ; 限速 1MB/s,防止 UF 把带宽吃满
我在项目中遇到过:某个客户给每个 UF 配了单向防火墙,只允许 UF → Indexer 的 9997 端口。结果 Deployment Server 没法推送更新,UF 配置出问题后只能人工上去修。建议至少留一个管理通道(如 SSH 堡垒机或 Deployment Server 的 8089 端口)。

3.6 避坑指南

  • 文件轮转导致重复:有些日志系统使用 copytruncate 模式,UF 可能重复读取旧内容。用 logrotate 时配合 copytruncate + inode监控 容易出问题。我建议用 create 模式,或配置 UF 的 followTail = 0 强制从文件尾部读取。
  • 时间戳 & localtime:UF 默认使用系统时区。如果你采集的是 UTC 日志,但审计报告要求本地时间,可以在 inputs.conf 里按 sourcetype 指定 TZ = UTC,然后在搜索时做时区转换。别在 UF 上硬改时区,否则索引时间全乱。
  • 别忘了索引权限:审计数据通常需要限制访问。UF 只能产生数据,但索引的读写权限要靠 Splunk admin 后配置。我在一次审计发现中,发现所有索引都是公开可读,差点出大事。
  • 测试与验证:改完配置后用 splunk reload deploy-server 或重启 UF,然后去索引器上搜 index=* sourcetype=* | head 10 确认数据到达。有条件的可以建一个小批量测试管道。