Alex-Tech-lab/Splunk-SIEM-and-log-analysis
GitHub: Alex-Tech-lab/Splunk-SIEM-and-log-analysis
一个手把手教你部署 Splunk SIEM 并对 Windows Active Directory 日志进行安全分析的实验教程,涵盖日志采集、SPL 搜索、仪表板构建和自动告警配置。
Stars: 0 | Forks: 0
# 实验 03 — Splunk SIEM 与日志分析






实验视频 - https://www.loom.com/share/db603253425a4fc89bae9c854054449f
## 概述
一家中型组织每天会产生数以百万计的日志事件——Windows 事件日志、来自 Active Directory 的身份验证记录、防火墙日志、Web 服务器访问日志、云资源日志。如果没有 SIEM,这些日志会散落在不同的系统中,无法跨系统搜索、关联事件,也无法检测表明正在进行攻击的模式。
本实验将在 Ubuntu 虚拟机上部署 Splunk Enterprise,通过 Universal Forwarder 将其与实验 01 中的 Active Directory 环境连接起来,并培养核心 SOC 分析师技能:SPL 搜索编写、安全仪表板构建和自动警报创建。Splunk 是部署最广泛的商业 SIEM——这些技能几乎出现在每个安全运营职位的描述中。
## 架构 — Splunk 如何接收和处理日志
```
┌──────────────────────────────────────────────────────────────────┐
│ Azure Virtual Network — lab.local │
│ │
│ ┌───────────────────────────┐ ┌───────────────────────┐ │
│ │ Windows Server 2025 VM │ │ Ubuntu 22.04 VM │ │
│ │ Lab 01 · Active Directory│ │ Splunk Enterprise │ │
│ │ │ │ │ │
│ │ ┌─────────────────────┐ │ │ ┌─────────────────┐ │ │
│ │ │ Windows Event Logs │ │ │ │ Splunk indexer │ │ │
│ │ │ Security · System │ │ │ │ index= │ │ │
│ │ │ Application │ │ │ │ windows_logs │ │ │
│ │ └──────────┬──────────┘ │ │ └────────┬────────┘ │ │
│ │ │ │ │ │ │ │
│ │ ┌──────────▼──────────┐ │ │ ┌────────▼────────┐ │ │
│ │ │ Universal Forwarder│ │ │ │ Search head │ │ │
│ │ │ Reads inputs.conf │──┼──────┼─▶│ SPL · Alerts │ │ │
│ │ │ Compress · encrypt │ │ 9997 │ │ Dashboards │ │ │
│ │ └─────────────────────┘ │ │ └────────┬────────┘ │ │
│ └───────────────────────────┘ └───────────┼───────────┘ │
│ │ │
└─────────────────────────────────────────────────┼───────────────┘
│ port 8000
┌───────▼────────┐
│ Splunk web UI │
│ http:// │
│ :8000 │
└────────────────┘
```
## 实验详情
| 字段 | 值 |
|---|---|
| SIEM 平台 | Splunk Enterprise — 60 天试用,之后免费(500 MB/天) |
| 日志源 | 来自实验 01 的 Windows Server 2025 (Active Directory) |
| Splunk 虚拟机操作系统 | Ubuntu 22.04 LTS |
| 索引名称 | `windows_logs` |
| 预估成本 | $0 |
| 完成时间 | 跨会话需 4–6 小时 |
| 认证对标 | CompTIA Security+ · CySA+ · Splunk Core Certified User |
| 前置条件 | 实验 01 — Active Directory(提供日志源) |
## 本实验适用对象
| 角色 | 本实验如何适用 |
|---|---|
| SOC Analyst Tier 1 | 监控仪表板以获取警报,搜索日志以查找可疑活动,上报发现的问题 |
| SOC Analyst Tier 2–3 | 构建检测规则,跨数据源关联事件,威胁狩猎 |
| Cloud Security Engineer | Microsoft Sentinel 和 AWS Security Hub 使用相同的 SIEM 概念——本实验教授其心智模型 |
| Incident Responder | 在活动事件期间搜索日志,构建事件时间线,确定入侵范围 |
## 关键概念 — 开始前必读
### 什么是 SIEM?
SIEM(安全信息和事件管理)平台从整个环境(服务器、工作站、防火墙、云服务、应用程序)收集日志数据,并使其在一个地方可被搜索。它的两个核心工作是**关联**(跨系统连接事件以识别单一系统无法单独揭示的模式)和**警报**(在满足可疑条件时自动通知分析师)。没有 SIEM,安全团队需要单独登录每个系统。有了它,单个分析师就可以同时跨数千个系统进行搜索。
### 什么是 SPL?
SPL(Splunk 处理语言)是用于向 Splunk 提问的查询语言。它作为管道工作——从搜索开始,然后通过过滤、转换和可视化数据的命令传递结果:
```
index=windows_logs EventCode=4625
| stats count by Account_Name
| sort -count
```
这会查找所有失败的登录事件,按用户名计数,并从高到低排序。每个 SPL 搜索都遵循相同的模式:**查找事件,然后重塑结果**。
### 什么是 Splunk 索引?
索引是存储事件的命名存储桶。当日志到达 Splunk 时,它们被存储在索引中。搜索时,使用 `index=name` 指定索引。为不同的数据源使用单独的索引,可以独立控制保留期、权限和存储。本实验使用一个索引:`windows_logs`。
### 什么是 Universal Forwarder?
Universal Forwarder 是一个轻量级的免费代理,安装在任何你想将其日志发送到 Splunk 的机器上。它监控日志文件和 Windows 事件日志,压缩并加密数据,然后通过端口 9997 将其转发到 Splunk 索引器。它被设计为在生产服务器的后台以最少的 CPU 和 RAM 占用静默运行。
### 什么是 Windows 事件 ID?
Windows 将每个系统事件记录为 Windows 事件日志中的一个带编号条目。安全工作中经常使用的三个 ID:
| 事件 ID | 含义 | 查找内容 |
|---|---|---|
| 4624 | 成功登录 | 正常工作时间之外的常规用户账户交互式登录(类型 2、10) |
| 4625 | 登录失败 | 一个账户的激增 = 暴力破解。分布在多个账户 = 密码喷洒 |
| 4740 | 账户锁定 | 来自同一源机器的多次锁定 = 活动攻击 |
## 你将学到什么
| 技能 | 实际应用 |
|---|---|
| 部署 Splunk 并配置数据输入 | 每个 Splunk 部署都从获取数据开始——Universal Forwarder 是大多数企业环境提供日志的方式 |
| 浏览 Splunk 界面 | 搜索、仪表板、警报、报告——了解布局是任何 SOC 角色的基本要求 |
| 编写 SPL 搜索 | SPL 是你向 Splunk 提问的方式——这项技能将能发现威胁的分析师与只会盯着仪表板的分析师区分开来 |
| 构建安全仪表板 | 一目了然地可视化安全态势——随时间变化的失败登录、主要源 IP、锁定事件 |
| 识别失败的登录尝试 | 区分正常的用户错误与暴力破解和密码喷洒攻击 |
| 构建自动警报 | 当满足定义的条件时,Splunk 会触发警报——自动检测的基础 |
| 检测工作时间外的登录 | 识别正常工作时间之外的异常交互式登录 |
## 步骤 1 — 免费获取 Splunk
Splunk Enterprise 可免费下载。你会收到 60 天的完整试用版,之后它会自动转换为免费许可证(500 MB/天——足够用于家庭实验)。
下载地址:[splunk.com/en_us/download/splunk-enterprise.html](https://www.splunk.com/en_us/download/splunk-enterprise.html)
## 步骤 2 — 在 Ubuntu Azure 虚拟机上部署 Splunk
在 Azure 上运行 Splunk 意味着当你的本地机器关闭时它仍然可以访问,并且你实验 01 中的 Windows Server 虚拟机可以直接通过 Azure 内部网络向其发送日志。
### Azure 虚拟机设置
| 设置 | 值 | 原因 |
|---|---|---|
| 操作系统 | Ubuntu 22.04 LTS | 符合免费层条件,Splunk 支持 |
| 大小 | Standard_B2s (2 vCPU · 4 GB RAM) | Splunk 至少需要 4 GB RAM |
| 磁盘 | 至少 30 GB | 日志存储 |
| 入站端口 8000 | 仅限你的 IP | Splunk Web UI — 限制为仅你的 IP 访问 |
| 入站端口 9997 | 仅限 VNet 范围(例如 10.0.0.0/16) | 转发器输入 — 仅限内部,不面向公共互联网 |
| 入站端口 22 | 仅限你的 IP | SSH 访问 |
### 如何通过 SSH 连接到 Ubuntu 虚拟机
**macOS / Linux** — SSH 已内置。打开终端并运行:
```
ssh yourusername@YOUR_VM_PUBLIC_IP
# 在提示关于主机指纹时输入 yes
# 输入您的密码
```
**Windows** — 先安装 [PuTTY](https://putty.org):
1. 从 putty.org 下载 64 位 Windows 安装程序 → 运行 → 接受默认设置
2. 打开 PuTTY → 输入你虚拟机的公共 IP → 端口 22 → 连接类型 SSH → 点击 Open
3. 接受主机密钥 → 输入你的用户名 → 输入你的密码
4. 输入密码时,屏幕上不会显示任何内容——这是正常的 Linux 行为。输入完毕后按 Enter。
### 安装 Splunk
在你的 SSH 会话中运行这些命令:
```
# 下载 Splunk Enterprise
# 如果返回 404,请检查 splunk.com 以获取最新版本的 URL
wget -O splunk-linux-amd64.deb \
"https://download.splunk.com/products/splunk/releases/10.2.2/linux/splunk-10.2.2-80b90d638de6-linux-amd64.deb"
# 安装该软件包
sudo dpkg -i splunk-linux-amd64.deb
# 启动 Splunk 并接受许可协议
# 系统将提示您设置 admin 用户名和密码
sudo /opt/splunk/bin/splunk start --accept-license
# 启用 Splunk 以在 VM 重启时自动启动
sudo /opt/splunk/bin/splunk enable boot-start
# 验证 Splunk 是否正在运行
sudo /opt/splunk/bin/splunk status
```
在浏览器中访问 Web UI:
```
http://:8000
```
## 步骤 3 — 配置数据输入
### A 部分 — 在 Splunk 中启用接收
在安装转发器之前,配置 Splunk 以监听传入数据。
1. 在 `http://your-vm-ip:8000` 登录 Splunk Web UI
2. 点击 **Settings → Forwarding and Receiving**
3. 点击 **Configure Receiving → New Receiving Port** → 输入 `9997` → **Save**
4. 点击 **Settings → Indexes → Create New Index** → 命名为 `windows_logs` → **Save**
### B 部分 — 在 Windows Server 上安装 Universal Forwarder
在你的 **Windows Server 虚拟机(来自实验 01)** 上运行此操作——不要在 Splunk Ubuntu 虚拟机上运行。
1. 在你的 Windows Server 上,打开浏览器并转到 [splunk.com/en_us/download/universal-forwarder.html](https://www.splunk.com/en_us/download/universal-forwarder.html)
2. 下载 **Windows 64-bit** 安装程序
3. 运行安装程序:
- Deployment Server:输入你的 Splunk 虚拟机的**私有 IP**和端口 `8089`
- Receiving Indexer:输入你的 Splunk 虚拟机的**私有 IP**和端口 `9997`
4. 使用默认设置完成安装
### C 部分 — 配置 inputs.conf
`inputs.conf` 文件告诉转发器要收集哪些 Windows 事件日志。在 **Windows Server 虚拟机** 上创建或编辑此文件。
```
# C:\Program Files\SplunkUniversalForwarder\etc\system\local\inputs.conf
[WinEventLog://Security]
# Security log — 身份验证事件:登录、失败、锁定
disabled = 0
start_from = oldest
current_only = 0
evt_resolve_ad_obj = 1
# 解析 AD 对象名称,以便显示用户名而不是 SID 字符串
[WinEventLog://System]
# System log — OS 事件:服务启动/停止、驱动程序故障
disabled = 0
[WinEventLog://Application]
# Application log — 来自已安装应用程序的事件
disabled = 0
```
保存后,重启转发器以应用更改:
```
# 在 Windows Server VM 上以管理员身份在 PowerShell 中运行
Restart-Service SplunkForwarder
```
在 Splunk Search 中验证数据是否正在传输:
```
index=windows_logs | head 10
```
如果这返回了结果,说明转发器正在工作。如果没有返回任何内容,请验证 Windows 虚拟机上的 `SplunkForwarder` 服务是否正在运行,以及两台虚拟机之间的端口 9997 是否已开放。
## 步骤 4 — 基础 SPL 搜索
将所有搜索输入到 **Search & Reporting** 应用程序顶部的搜索栏中。使用搜索栏右侧的时间选择器设置时间范围。下面的每个搜索都会逐行解释。
### SPL 管道结构
```
index=windows_logs EventCode=4625
| stats count by Account_Name
| sort -count
│ │ │
└─ find events └─ transform └─ output
```
每个 SPL 搜索都遵循此模式:**查找 → 转换 → 输出**。`|` 管道字符将结果从一个命令传递到下一个命令。
### 确认数据正在传输
```
index=windows_logs | head 100
```
`head 100` 返回前 100 个事件。如果返回了结果,说明转发器已连接并且数据已被索引。
### 查找失败的登录尝试 (EventCode 4625)
```
index=windows_logs sourcetype=WinEventLog:Security EventCode=4625
| stats count by Account_Name, Workstation_Name
| sort -count
```
- `EventCode=4625` — 仅限登录失败事件
- `stats count by ...` — 按用户名和源机器分组统计事件数
- `sort -count` — 按最高计数优先排序(减号 = 降序)
在短时间内一个账户达到 5 次或更多计数,可能是暴力破解尝试。
### 查找成功的登录 (EventCode 4624)
```
index=windows_logs sourcetype=WinEventLog:Security EventCode=4624
| stats count by Account_Name, Logon_Type
| sort -count
```
| 登录类型 | 含义 |
|---|---|
| 2 | Interactive — 有人坐在键盘前操作 |
| 3 | Network — 访问文件共享或网络资源 |
| 5 | Service — 自动服务账户登录(通常符合预期) |
| 10 | Remote interactive — RDP 会话 |
### 查找账户锁定事件 (EventCode 4740)
```
index=windows_logs sourcetype=WinEventLog:Security EventCode=4740
| table _time, Account_Name, Caller_Computer_Name
| sort -_time
```
- `table _time, ...` — 以包含三列的表格形式显示
- `Caller_Computer_Name` — 发起失败尝试的机器
- 同一账户的多次锁定表明正在进行暴力破解或密码喷洒攻击
### 失败登录用户名前 10 名 — 威胁狩猎
```
index=windows_logs sourcetype=WinEventLog:Security EventCode=4625 earliest=-24h
| stats count as failures by Account_Name
| sort -failures
| head 10
```
- `earliest=-24h` — 仅限过去 24 小时
- `count as failures` — 将计数列重命名为 `failures` 以提高可读性
- 24 小时内失败 20 次或以上的账户需要进行调查
- Active Directory 中不存在的用户名表明发生了账户枚举
### 检测非工作时间登录
```
index=windows_logs sourcetype=WinEventLog:Security EventCode=4624
| eval hour=strftime(_time, "%H")
| where hour < 7 OR hour > 19
| table _time, Account_Name, Workstation_Name, Logon_Type
| sort -_time
```
- `eval hour=strftime(_time, "%H")` — 从时间戳中仅提取小时
- `where hour < 7 OR hour > 19` — 仅保留早上 7 点到晚上 7 点之外的事件
- 下班后的服务账户登录(类型 5)是正常且符合
- 下班后常规用户的交互式登录(类型 2)或 RDP 登录(类型 10)需要进行审查
### 暴力破解检测搜索 — 用于警报
```
index=windows_logs sourcetype=WinEventLog:Security EventCode=4625
| stats count as failures by Account_Name
| where failures > 10
```
这会查找在选定时间窗口内失败登录超过 10 次的任何账户。在实际环境中,15 分钟内失败 10 次是强烈的暴力破解指标。
## 步骤 5 — 构建安全仪表板
仪表板无需手动运行搜索即可提供持久的安全态势视图。使用步骤 4 中的搜索构建一个仪表板。
1. 点击顶部导航栏中的 **Dashboards**
2. 点击 **Create New Dashboard**
3. 命名为:`Windows Security Overview` → 点击 **Create Dashboard**
4. 为下面的每个面板点击 **Add Panel**
5. 对于每个面板:选择 **New Search**,粘贴搜索内容,选择可视化类型,保存
| 面板 | 搜索 | 可视化 |
|---|---|---|
| 失败登录 — 过去 24 小时 | `EventCode=4625` 与 `stats count by Account_Name` | 条形图 |
| 账户锁定 — 过去 7 天 | `EventCode=4740` 与 `table` 输出 | 事件列表 |
| 随时间变化的登录活动 | `EventCode=4624` 与 `timechart count` | 折线图 |
| 非工作时间的主要源 IP | 非工作时间搜索与 `stats count by Workstation_Name` | 柱状图 |
## SPL 快速参考
| 命令 | 用途 | 示例 |
|---|---|---|
| `index=` | 指定要搜索的索引 | `index=windows_logs` |
| `sourcetype=` | 按日志类型过滤 | `sourcetype=WinEventLog:Security` |
| `EventCode=` | 按 Windows 事件 ID 过滤 | `EventCode=4625` |
| `earliest=` | 设置回溯窗口 | `earliest=-24h` |
| `stats count by` | 按字段对事件进行分组计数 | `stats count by Account_Name` |
| `stats count as` | 计数并重命名列 | `stats count as failures by Account_Name` |
| `sort -field` | 降序排列 | `sort -count` |
| `sort +field` | 升序排列 | `sort +_time` |
| `table` | 选择要显示的列 | `table _time, Account_Name` |
| `head N` | 返回前 N 个结果 | `head 10` |
| `where` | 过滤转换后的结果 | `where failures > 10` |
| `eval` | 计算生成新字段 | `eval hour=strftime(_time, "%H")` |
| `timechart count` | 事件计数随时间的变化图 | `timechart count by EventCode` |
| `dedup` | 移除重复事件 | `dedup Account_Name` |
| `rename` | 重命名字段 | `rename Account_Name as Username` |
## Windows 事件 ID 参考
| 事件 ID | 描述 | 安全相关性 |
|---|---|---|
| 4624 | 成功登录 | 基线活动 — 监控非工作时间和异常登录类型 |
| 4625 | 登录失败 | 暴力破解指标 — 一个账户或多个账户的失败激增 |
| 4634 | 账户注销 | 会话持续时间跟踪 |
| 4648 | 使用显式凭据登录 | Pass-the-hash 指标 — 使用存储的凭据登录 |
| 4672 | 分配了特殊权限 | 管理员级别的访问 — 对于非管理员账户始终需要进行调查 |
| 4720 | 已创建用户账户 | 新建账户 — 需与变更管理核实 |
| 4726 | 已删除用户账户 | 账户删除 — 需核实是否经过授权 |
| 4740 | 账户锁定 | 密码喷洒指标 — 来自同一来源的多次锁定 |
| 4768 | 已请求 Kerberos 票据 | 身份验证基线 |
| 4769 | 已请求 Kerberos 服务票据 | Kerberoasting 指标 — 对服务账户的过度请求 |
## 验证清单
| 检查项 | 如何验证 |
|---|---|
| 数据正在传输 | `index=windows_logs \| head 10` 返回最近的事件 |
| 失败登录搜索有效 | 运行 EventCode=4625 搜索。如果没有结果,在你的 Windows 虚拟机上输入几次错误密码,然后再次搜索 |
| 仪表板显示数据 | Windows Security Overview 显示已填充的面板 |
| 警报处于活动状态 | Settings → Searches, Reports, and Alerts → 你的警报显示为 Enabled 状态 |
| 凭记忆使用 SPL 过滤 | 无需参考笔记即可按 IP 地址、端口和协议进行过滤 |
## 故障排除
| 问题 | 原因 | 修复方法 |
|---|---|---|
| `index=windows_logs \| head 10` 没有返回任何内容 | 转发器未运行或端口 9997 被阻止 | 在 Windows 虚拟机上运行 `Get-Service SplunkForwarder`。检查 Azure NSG 规则是否允许从 Windows 虚拟机到 Splunk 虚拟机的 9997 端口 |
| 转发器服务未启动 | inputs.conf 语法错误 | 检查文件路径是否准确,并且文件中 `=` 符号周围没有多余的空格 |
| 无法访问端口 8000 | Azure NSG 阻止了入站流量 | 在 Splunk 虚拟机上为端口 8000 添加限定为你的 IP 的入站 NSG 规则 |
| 事件出现但缺少字段 | sourcetype 设置不正确 | 确认 `sourcetype=WinEventLog:Security` 与 Splunk Data Summary 中显示的内容完全匹配 |
| 警报未触发 | 实验数据的阈值太高 | 将阈值降低到 3,或者通过输入错误密码手动生成测试失败 |
| `evt_resolve_ad_obj` 不工作 | 转发器以本地账户运行 | 以具有 AD 读取权限的域账户身份运行 SplunkForwarder 服务 |
## 核心概念参考
| 术语 | 定义 |
|---|---|
| SIEM | 安全信息和事件管理 — 用于聚合、搜索日志和发出警报的平台 |
| SPL | Splunk 处理语言 — 用于搜索和转换 Splunk 数据的查询语言 |
| 索引 | Splunk 中用于保存事件的命名存储桶——类似于数据库表 |
| Universal Forwarder | 将日志从源机器通过端口 9997 发送到 Splunk 索引器的轻量级代理 |
| inputs.conf | 转发器上的配置文件,用于定义要收集的日志源 |
| Sourcetype | 日志的格式/类型——告诉 Splunk 如何解析原始数据 |
| 索引器 | 接收、解析并存储传入日志数据的 Splunk 组件 |
| Search head | 针对已索引数据运行 SPL 查询的 Splunk 组件 |
| 警报疲劳 | 当过多低质量警报导致分析师未经调查就忽略或将其驳回时 |
| 暴力破解 | 针对一个账户从一个来源发起的多次失败登录尝试 |
| 密码喷洒 | 少量失败登录尝试分布在多个账户上,以规避锁定阈值 |
| 4624 | 表示成功登录的 Windows 事件 ID |
| 4625 | 表示登录失败的 Windows 事件 ID |
| 4740 | 表示账户锁定的 Windows 事件 ID |
## 作品集条目 — 截图和记录内容
为你的作品集收集以下证据:
1. **仪表板截图** — Windows Security Overview,其中所有四个面板已填充并带有标签。为每个面板写一句话,解释它显示的内容及其对安全运营的重要性。
2. **警报配置截图** — 显示名称、计划、阈值和触发操作的已保存警报。
3. **威胁狩猎结果** — 排名前 10 位的失败登录用户名搜索输出的截图。即使所有结果都来自你自己的测试活动,该输出也证明了你能够运行搜索并解读结果。
4. **SPL 搜索导出** — 将你的暴力破解检测搜索导出为报告。File → Save As → Report。这将使用名称保存搜索,以便你可以在面试中通过名称引用它。
## 资源
- [下载 Splunk Enterprise](https://www.splunk.com/en_us/download/splunk-enterprise.html) — 60 天试用版,之后免费
- [下载 Splunk Universal Forwarder](https://www.splunk.com/en_us/download/universal-forwarder.html)
- [Splunk SPL 参考](https://docs.splunk.com/Documentation/Splunk/latest/SearchReference/WhatsInThisManual) — 完整的命令文档
- [Splunk Fundamentals 1](https://www.splunk.com/en_us/training/free-courses/splunk-fundamentals-1.html) — 免费官方课程
- [Windows 事件 ID 参考 — Microsoft](https://learn.microsoft.com/en-us/windows-server/identity/ad-ds/plan/appendix-l--events-to-monitor)
- [Temp Mail](https://temp-mail.org/en/) — 用于 Splunk 注册的临时电子邮件
标签:Active Directory, AMSI绕过, Azure, CySA+, HTTP/HTTPS抓包, Linux虚拟机, Plaso, Security+, SOC分析师, Splunk Core认证, SPL搜索, Terraform 安全, Windows事件日志, 威胁检测, 子域名变形, 安全仪表盘, 安全实验室, 安全运营中心, 态势感知, 日志关联, 红队行动, 网络安全, 网络映射, 自动化告警, 通用转发器, 隐私保护