本文使用 Ubuntu 搭建
1. Splunk 简介
Splunk 是一款企业级的统一安全与可观测性平台,主要用于实时收集、索引、搜索、监控和分析海量机器生成的大数据,核心做三件事:
- 采集—— 从日志文件、网络、数据库等来源收集数据;
- 索引—— 把原始数据解析、分字段、建立可搜索的索引;
- 搜索与可视化—— 用 SPL 查询语言分析,生成报表、告警、仪表盘。
几个核心概念:
| 概念 | 说明 |
|---|---|
| 事件(Event) | 一条日志记录,是 Splunk 处理的基本单位 |
| 索引(Index) | 存放事件的分区,类似"目录/文件夹" |
| SPL | Splunk 查询语言(Search Processing Language) |
| 数据管道 | 数据经过 Input(输入)→ Parsing(解析)→ Indexing(索引)→ Search(搜索)四个阶段 |
2. 配置要求
2.1 操作系统
- Ubuntu 16.04 LTS 及以上,推荐 22.04 / 24.04 LTS;
- Linux 内核 3.x 以上;
- ⚠️仅支持 x86_64(amd64)架构,不支持 ARM(含 Apple Silicon)。
2.2 硬件要求(三档)
| 档位 | CPU | 内存 | 磁盘 | 适用场景 |
|---|---|---|---|---|
| 官方参考 | 12 物理核 / 24 vCPU(2GHz+) | 12 GB | ≥250 GB | 生产 / 20GB 天级日志量 |
| 虚拟机推荐 ✅ | 4 vCPU | 8 GB | 60~100 GB | 测试、学习,运行流畅 |
| 最低能跑 | 2 vCPU | 4 GB | ≥60 GB | 只够装起来体验,较卡 |
- 内存是最大瓶颈:Splunk 是 Java + C 混合进程,8 GB 才比较舒服。
- 磁盘别省:安装本体约 3 GB,索引数据会持续增长;任何实例须始终保留≥5 GB 空闲空间。
- 文件系统用默认ext4即可。
2.3 端口
| 端口 | 用途 |
|---|---|
| 8000 | Splunk Web 管理界面 |
| 8089 | 管理 API / 数据接收 |
| 9997 | 分布式下 Forwarder 转发数据到 Indexer(单机用不到) |
2.4 License
- 注册 Splunk 账号下载安装包,自带60 天企业试用 License;
- 到期后可切换Free 版(每天 500 MB 数据量),但是会少一些功能。
3. Splunk 架构
3.1 数据流
日志源(文件/网络/数据库) │ ▼ Forwarder ← 采集与转发数据 │ ▼ Indexer ← 解析、分字段、建立索引 │ ▼ Search Head ← 搜索、分析、可视化3.2 核心组件
| 组件 | 职责 |
|---|---|
| Universal Forwarder | 轻量采集器,部署在数据源上,采集并转发日志 |
| Indexer | 索引器,解析数据、建立索引、存储数据 |
| Search Head | 搜索头,执行 SPL 搜索、生成仪表盘与报表 |
3.3 单机 vs 分布式
| 维度 | 单机(Standalone) | 分布式(Distributed) |
|---|---|---|
| 角色 | 采集、索引、搜索都在一台机器 | Forwarder / Indexer / Search Head 分离 |
| 扩展性 | 只能换更强服务器(纵向) | 加机器即可(横向) |
| 高可用 | 单点,宕机即中断 | 可做集群冗余 |
| 复杂度 | 低 | 高 |
| 典型日志量 | < 几十 GB/天 | 几百 GB ~ TB 级/天 |
本手册聚焦单机部署。单机里的角色以后可无缝拆到独立机器上,升级到分布式。
4. 单机部署(Ubuntu)
4.1 下载
当前版本:最新为 Splunk Enterprise10.6(10.6.0.5,2026-09-30 发布,版本号已改为四段式);官网下载页也提供10.4.2。学习环境两者皆可,下面示例用 9.4.0(直链已实测可用)。
方式一:命令行直链下载(无需登录,推荐)
wget-Osplunk.tgz"https://download.splunk.com/products/splunk/releases/9.4.0/linux/splunk-9.4.0-6b4ebe426ca6-linux-amd64.tgz"直链由「版本号 + build hash」组成,例如
9.4.0+6b4ebe426ca6。要下载其他版本,替换对应的版本号和 hash 即可(可从官网下载页文件名看到),.tgz也可换成.deb。
方式二:官网页面下载
到 https://www.splunk.com/en_us/download/splunk-enterprise.html 注册/登录后,选择 Linux 平台的.deb(或.tgz)安装包下载。
4.2 安装
方式 A:deb 包(推荐)
sudodpkg-isplunk-9.x.x-xxxxxxxxxxxx-linux-2.6-amd64.deb# 默认安装目录:/opt/splunk方式 B:tgz 绿色包
sudotarxvzf splunk-9.x.x-xxxxxxxxxxxx-linux-2.6-amd64.tgz-C/opt4.3 首次启动
sudo/opt/splunk/bin/splunk start --accept-license首次启动时,系统会提示设置管理员账号与密码(密码需至少 8 位 ASCII 字符),按提示完成输入即可。
4.4 设置开机自启(可选)
sudo/opt/splunk/bin/splunkenableboot-start -systemd-managed1--accept-license4.5 访问与登录
浏览器打开:
http://<虚拟机IP>:8000用刚才设置的管理员账号登录,进入首页即表示部署成功。
5. 数据接入
推荐使用命令行方式
5.1 三种方式对比
Splunk 官方(Getting Data In)把接入分三类,对应「添加数据」页的三个按钮:
| 方式 | 数据在哪 | 特点 |
|---|---|---|
| 上传 | 你自己电脑上的文件 | 一次性导入,练手用 |
| 监视 | Splunk 所在机器的文件/目录、TCP/UDP 端口、脚本 | 持续采集,安全告警靠它 |
| 转发 | 其他机器(装 Universal Forwarder) | 生产环境的标准做法 |
5.2 上传文件(入门练手)
- 设置 → 添加数据 →上传→ 选文件;
- 「设置来源类型」页保持自动检测,可预览事件格式;
- 「输入设置」页选择目标索引(可点「新建索引」,见 5.4);
- 检查 → 提交 → 开始搜索。
提示:可以先在电脑上新建一个
test.log,随便粘十几行带时间戳、INFO/ERROR 字样的日志,上传到索引test,方便后面练搜索和告警。
5.3 监视文件(持续采集,安全告警的数据基础)
以监控/var/log/auth.log(SSH/登录日志)为例:
- 设置 → 添加数据 →监视→ 选「文件和目录」;
- 路径填
/var/log/auth.log; - 监视方式选「持续监视」(Continuously Monitor);
- 来源类型填
linux_secure(官方对认证日志的推荐值,会自动提取 action、src_ip、user 等字段); - 「输入设置」页新建索引
os; - 提交。
完成后,SSH 登录虚拟机时故意输错几次密码,再搜index=os "Failed password"就能看到事件——告警练习就有了真实数据。
等价命令行方式(编辑/opt/splunk/etc/system/local/inputs.conf):
[monitor:///var/log/auth.log] index = os sourcetype = linux_secure保存后重启:sudo /opt/splunk/bin/splunk restart --run-as-root。
5.4 索引详解
索引是什么:Splunk 存数据的"分柜子",数据按指定索引落盘,搜索时用index=xxx限定范围。
系统自带的几个:main(默认,不指定就进这)、history(搜索历史)、summary(汇总索引),以及_internal、_audit(Splunk 自身日志)。
为什么不建议全塞 main:
- 保留策略没法分开管(安全日志留 1 年、练习数据留 7 天,混一起只能一刀切);
- 权限没法分(索引可按角色控权);
- 搜索性能(
index=os error只扫一个柜子,比扫全库快); - 清理互不干扰(删一个索引不碰别的数据)。
新建索引各字段:
- 索引名称:小写字母数字,搜索时
index=名称; - 索引数据类型:事件(普通日志,选这个)或指标(纯数值监控数据)。日志全是「事件」;
- 起始路径 / 冷路径 / 解冻路径:热温/冷/归档数据的落盘位置,学习环境留空用默认即可;
- 数据完整性检查:对数据切片算哈希防篡改,学习环境可 Disable;
- 整个索引最大大小:默认 500 GB,建议改成 10 GB 防止撑爆磁盘;
- 热/温/冷数据桶最大大小:auto,不用动。
事件 vs 指标怎么选:能用一句话描述"发生了什么"的是事件(如10:00 用户 allen 登录成功);只是"读数/计数器/仪表值"的是指标(如10:00 CPU=35%)。日志全部选事件,指标是给 collectd/statsd 这类监控数据用的。
6. 搜索入门
这里我们手动上传一个 test.log 文件测试,内容如下
2026-10-07 09:00:01 INFO app1 server started 2026-10-07 09:00:05 INFO app1 connected to db 2026-10-07 09:01:23 ERROR app2 connection timeout 2026-10-07 09:02:10 WARN app1 slow query detected 2026-10-07 09:03:45 ERROR app2 failed to send email 2026-10-07 09:05:11 INFO app1 user login ok 2026-10-07 09:06:40 ERROR app1 disk space low 2026-10-07 09:08:02 WARN app2 retry attempt 3 2026-10-07 09:10:55 ERROR app2 connection timeout 2026-10-07 09:12:30 INFO app1 backup finished进「搜索和报表」页,时间范围选「所有时间」,依次试(把index=test换成你自己的索引):
index=testindex=test errorindex=test|tophostindex=test|stats countbysourcetype# 查询 test 索引,按不同日志来源类型,分别统计各自的事件条数index=test|timechart count前两条是过滤,top看谁最多,stats count by分类统计,timechart出时间趋势图。这五条摸熟,日常搜索就够用了。
7. 告警
7.1 创建流程
告警三要素:搜索 + 触发条件 + 触发动作。
- 搜索页写好 SPL → 另存为(Save As)→告警;
- 告警类型:计划(Scheduled,定时跑,省资源,推荐)或实时(Real-time);
- 触发条件:结果数 > N / 每条结果触发 / 自定义条件;
- 触发动作:加入已触发告警(入门)、发邮件(需先配 SMTP)、webhook;
- 节流(Throttle):设置 N 分钟内不重复触发,防止告警轰炸。
验证:设置 → 搜索、报表和告警,找到告警点「立即运行」;触发后在「活动 → 已触发告警」查看记录。
7.2 安全告警常见示例
以下示例基于
index=os(auth.log,sourcetypelinux_secure)和index=test(练习日志)。
1. SSH 暴力破解(10 分钟内同一 IP 失败 ≥5 次):
index=os sourcetype=linux_secure"Failed password"|stats countbysrc_ip|wherecount>=5或,当 src_ip 字段没提取出来时使用:
index=os"Failed password"|rex"from (?<src_ip>\d+\.\d+\.\d+\.\d+)"|stats countbysrc_ip|wherecount>=5配置:Scheduled,每 5 分钟跑(cron*/5 * * * *),时间范围 -10m,结果数 > 0 触发。
2. 爆破成功登录(先失败多次、随后登录成功):
index=os sourcetype=linux_secure("Failed password"OR"Accepted password")|rex"from (?<src_ip>\d+\.\d+\.\d+\.\d+)"|rex"(?<act>Failed|Accepted) password"|statscount(eval(act="Failed"))asfails,count(eval(act="Accepted"))asokbysrc_ip|wherefails>=3ANDok>=1
监测配置:每 15 分钟(*/15 * * * *),时间范围 -30m,结果数 > 0 触发(失败→成功有过程跨度,窗口要够大)。
3. 非工作时间登录(早 7 点前、晚 10 点后):
index=os sourcetype=linux_secure"Accepted password"|evalhour=strftime(_time,"%H")|wherehour<7ORhour>=22监测配置:每 30 分钟(*/30 * * * *),时间范围 -60m,结果数 > 0 触发。想只在夜里跑可用 cron*/30 0-6,22-23 * * *。
4. root 直接登录(很多环境禁止):
index=os sourcetype=linux_secure"Accepted password for root"监测配置:每 5 分钟(*/5 * * * *),时间范围 -10m,结果数 > 0 触发(root 登录高危,要快发现)。
5. ERROR 告警(用练习日志验证告警功能):
index=test ERROR|stats count监测配置:每 10 分钟(*/10 * * * *),时间范围 -15m,结果数 > 0 触发。
6. 以后接 Windows 日志时的三个经典(SPL 换成index=wineventlog EventCode=xxx):
1102审计日志被清除(可疑)4740账户被锁定(爆破迹象)4732用户被加入管理员组(权限提升)
监测时间怎么定(通用原则):
- 越紧急跑得越勤:高危(root 登录、爆破)5 分钟级;一般 10~30 分钟;低频不紧急(非工作时间)30 分钟~1 小时;
- 时间范围 ≥ 2 倍运行间隔(5 分钟跑查 -10m,15 分钟跑查 -30m),避免漏掉两次运行交界的数据;
- 有"前后关联"的检测(如失败→成功)窗口要放大,覆盖整个过程。
8. 仪表盘
仪表盘就是把搜索结果变成图表、拼到一个页面。两条路径:
8.1 最快路径:从搜索直接生成面板
- 搜索页写一个 SPL(如
index=os "Failed password" | timechart count); - 点搜索框下方的「可视化」标签,选图表类型(柱状图/折线图/饼图);
- 点右上角「另存为 → 仪表盘面板」;
- 选「新建仪表盘」起名保存;之后再加面板时选「已有仪表盘」。
8.2 正规做法:Dashboard Studio
- 顶部导航「搜索和报表」→ 左侧「仪表盘」→「新建仪表盘」;
- 选Dashboard Studio(新版,推荐)或 Classic;
- 「添加面板」→ 每个面板填 SPL、选图表类型;
- 拖拽布局、加标题,保存。
8.3 现成示例:SSH 登录监控仪表盘
三个面板(都基于index=os):
面板 1 · 失败登录趋势(折线图):
index=os"Failed password"|timechart count面板 2 · 失败登录来源 IP(条形图):
index=os"Failed password"|rex"from (?<src_ip>\d+\.\d+\.\d+\.\d+)"|topsrc_ip面板 3 · 失败 vs 成功登录(饼图):
index=os("Failed password"OR"Accepted password")|rex"(?<act>Failed|Accepted) password"|stats countbyact8.4 图表类型怎么选
timechart结尾 → 折线图/柱状图(时间趋势);top/stats count by结尾 → 条形图/饼图(占比、排行);stats count单一数值 → 单值(大数字卡片)。
附:常用命令速查
sudo/opt/splunk/bin/splunk start --run-as-root# 启动sudo/opt/splunk/bin/splunk stop --run-as-root# 停止sudo/opt/splunk/bin/splunk restart --run-as-root# 重启sudo/opt/splunk/bin/splunk status --run-as-root# 查看状态