本文使用 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 数据流
text
日志源(文件/网络/数据库)
│
▼
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 Enterprise 10.6 (10.6.0.5,2026-09-30 发布,版本号已改为四段式);官网下载页也提供 10.4.2。学习环境两者皆可,下面示例用 9.4.0(直链已实测可用)。
方式一:命令行直链下载(无需登录,推荐)
bash
wget -O splunk.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 包(推荐)
bash
sudo dpkg -i splunk-9.x.x-xxxxxxxxxxxx-linux-2.6-amd64.deb
# 默认安装目录:/opt/splunk
方式 B:tgz 绿色包
bash
sudo tar xvzf splunk-9.x.x-xxxxxxxxxxxx-linux-2.6-amd64.tgz -C /opt
4.3 首次启动
bash
sudo /opt/splunk/bin/splunk start --accept-license
首次启动时,系统会提示设置管理员账号与密码(密码需至少 8 位 ASCII 字符),按提示完成输入即可。
4.4 设置开机自启(可选)
bash
sudo /opt/splunk/bin/splunk enable boot-start -systemd-managed 1 --accept-license
4.5 访问与登录
浏览器打开:
text
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):
ini
[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 换成你自己的索引):
sql
index=test
index=test error
index=test | top host
index=test | stats count by sourcetype # 查询 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 次):
sql
index=os sourcetype=linux_secure "Failed password"
| stats count by src_ip
| where count >= 5
或,当 src_ip 字段没提取出来时使用:
sql
index=os "Failed password"
| rex "from (?<src_ip>\d+\.\d+\.\d+\.\d+)"
| stats count by src_ip
| where count >= 5
配置:Scheduled,每 5 分钟跑(cron */5 * * * *),时间范围 -10m,结果数 > 0 触发。



2. 爆破成功登录(先失败多次、随后登录成功):
sql
index=os sourcetype=linux_secure ("Failed password" OR "Accepted password")
| rex "from (?<src_ip>\d+\.\d+\.\d+\.\d+)"
| rex "(?<act>Failed|Accepted) password"
| stats count(eval(act="Failed")) as fails, count(eval(act="Accepted")) as ok by src_ip
| where fails >= 3 AND ok >= 1

监测配置:每 15 分钟(*/15 * * * *),时间范围 -30m,结果数 > 0 触发(失败→成功有过程跨度,窗口要够大)。

3. 非工作时间登录(早 7 点前、晚 10 点后):
sql
index=os sourcetype=linux_secure "Accepted password"
| eval hour=strftime(_time, "%H")
| where hour < 7 OR hour >= 22
监测配置:每 30 分钟(*/30 * * * *),时间范围 -60m,结果数 > 0 触发。想只在夜里跑可用 cron */30 0-6,22-23 * * *。

4. root 直接登录(很多环境禁止):
sql
index=os sourcetype=linux_secure "Accepted password for root"
监测配置:每 5 分钟(*/5 * * * *),时间范围 -10m,结果数 > 0 触发(root 登录高危,要快发现)。
5. ERROR 告警(用练习日志验证告警功能):
sql
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 · 失败登录趋势(折线图):
sql
index=os "Failed password" | timechart count

面板 2 · 失败登录来源 IP(条形图):
sql
index=os "Failed password"
| rex "from (?<src_ip>\d+\.\d+\.\d+\.\d+)"
| top src_ip

面板 3 · 失败 vs 成功登录(饼图):
sql
index=os ("Failed password" OR "Accepted password")
| rex "(?<act>Failed|Accepted) password"
| stats count by act
8.4 图表类型怎么选
timechart结尾 → 折线图/柱状图(时间趋势);top/stats count by结尾 → 条形图/饼图(占比、排行);stats count单一数值 → 单值(大数字卡片)。
附:常用命令速查
bash
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 # 查看状态