日志采集配置(Universal Forwarder)
做审计报告,数据进不来,后面全是白搭。Universal Forwarder(以下简称 UF)就是Splunk 的"数据入口"——它负责去各种日志源把数据拽过来,再安全地发给索引器。我个人习惯把 UF 比作"数据管道工",活儿不重但不能掉链子。
为什么单独要讲 UF?因为审计报告对数据完整性要求极高。你想想看,如果某个安全设备的日志因为 UF 配置漏了,到时候合规检查一问三不知,那才叫头疼。我在项目中遇到过不止一次,就是因为 UF 的 `inputs.conf` 里少写了一个路径,导致审计报告里缺了好几天的关键日志。
好,咱们开始。下面这张图是 UF 的核心工作流,你先记住这个框架:
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 配好容易,几十上百台管理起来才是真功夫。这里给出最佳实践:
- 使用 Deployment Server:集中推送 inputs.conf、outputs.conf、apps 和证书。避免逐台手动改配置。
- 启用 Forwarder Monitoring:在 UF 上配置
[perfmon]或[splunkd]输入,把 UF 自身的 CPU/内存/发送队列大小上报到 Splunk,建一个仪表板随时监控。 - 日志缓存与队列:如果 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确认数据到达。有条件的可以建一个小批量测试管道。