Gguerra4networks/Splunk-SIEM-Log-Analysis
GitHub: Gguerra4networks/Splunk-SIEM-Log-Analysis
一个 Splunk SIEM 日志分析实操实验,指导用户在 Azure 环境中部署 Splunk 并利用 SPL 搜索进行威胁检测、构建安全仪表盘和配置自动化告警。
Stars: 0 | Forks: 0
[README_lab3.md](https://github.com/user-attachments/files/28820316/README_lab3.md)
# Splunk-SIEM-日志分析
一个实操实验,演示了如何部署 Splunk 并接入真实日志数据,编写 SPL 搜索以发现威胁,构建实时安全仪表盘,创建自动化检测告警,以及进行基础的威胁狩猎。
# 实验 3 — Splunk SIEM 与日志分析
     
**技术栈:** Splunk Enterprise · Azure Ubuntu VM · Windows Server (实验 1)
**角色:** SOC Analyst Tier 1–3 · Security Engineer · Incident Responder · Cloud Security Engineer
## 关于本实验
一家中型组织每天都会生成数以百万计的日志事件 —— 来自工作站的 Windows Event Logs、来自 Active Directory 的身份验证日志、防火墙日志、Web 服务器访问日志以及云资源日志。如果没有 SIEM,这些日志就会停留在各自独立的系统中,没有人能够跨系统搜索它们、关联事件,或者识别出预示着攻击正在发生的模式。
Splunk 是部署最广泛的商用 SIEM。在免费的实验环境中学习它,能让你掌握一项具体且可证明的技能,而这几乎是所有安全运营职位描述中都要求具备的。你在这里建立的心智模型可以直接应用于 Microsoft Sentinel、AWS Security Hub 和 Google Chronicle。
## 架构 — Splunk 如何接收和处理日志
```
┌─────────────────────── Azure Virtual Network ────────────────────────────┐
│ │
│ ┌──────────────────────────┐ │
│ │ Windows Server VM │ ← Active Directory from Lab 1 │
│ │ Security/System/App │ │
│ └────────────┬─────────────┘ │
│ │ Event Logs │
│ ▼ │
│ ┌──────────────────────────┐ │
│ │ Universal Forwarder │ ← Lightweight agent on Windows VM │
│ │ inputs.conf · port 9997│ Compresses, encrypts, forwards │
│ └────────────┬─────────────┘ │
│ │ encrypted · port 9997 │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────────────┐ │
│ │ Ubuntu VM — Splunk Enterprise │ │
│ │ │ │
│ │ ┌──────────────────────┐ ┌──────────────────────┐ │ │
│ │ │ Splunk indexer │─────►│ Splunk web UI │ │ │
│ │ │ windows_logs index │ │ Search & reporting │ │ │
│ │ │ port 9997 receiver │ │ port 8000 │ │ │
│ │ └──────────────────────┘ └──────────┬───────────┘ │ │
│ └─────────────────────────────────────────── │ ──────────────────────┘ │
└────────────────────────────────────────────── │ ─────────────────────────┘
│ port 8000
▼
┌───────────────────────┐
│ Analyst browser │
│ Dashboards · Alerts │
│ SPL searches │
└───────────────────────┘
```
**工作流程:**
Universal Forwarder 代理运行在你的 Windows Server VM 上,通过 `inputs.conf` 监控 Security、System 和 Application 事件日志,并通过端口 9997 将其流式传输到运行在独立 Ubuntu VM 上的 Splunk indexer。indexer 将事件存储在一个命名的 index (`windows_logs`) 中。端口 8000 上的 Splunk Web UI 是你编写 SPL 搜索、构建仪表盘和配置自动化告警的地方 —— 所有这些都针对已索引的数据进行。
## 完成本实验后,你将能够做到
| 技能 | 实际应用 |
|---|---|
| 部署 Splunk 并配置数据输入 | 每次 Splunk 部署都从导入数据开始 —— Universal Forwarder 是大多数企业环境向 Splunk 输送日志的方式 |
| 熟练使用 Splunk 界面 | 搜索、仪表盘、告警、报告 —— 了解其布局是任何 SOC 角色的基本要求 |
| 编写 SPL 搜索 | SPL 是你向 Splunk 提问的方式 —— 这项技能能区分出哪些分析师能够发现威胁,哪些只能盯着仪表盘看 |
| 构建安全仪表盘 | 一目了然地可视化登录失败、锁定和非工作时间内的活动 |
| 识别失败的登录尝试 | 区分正常的用户失误与暴力破解或密码喷洒攻击 |
| 构建自动化告警 | 当你定义的条件满足时,Splunk 就会触发告警 —— 这就是真实 SOC 检测的工作方式 |
| 搜索账户锁定事件 | 一连串的锁定事件可能表明密码喷洒攻击正在进行中 |
## 前置条件
- 完成实验 1(在 Azure 中运行带有 Active Directory 的 Windows Server VM) —— 或者使用 Splunk 内置的样本数据作为替代
- 一个 Azure 账户(符合免费层条件)
- 对 Linux 终端(SSH 命令)有基本的适应能力
## 关键概念
在开始之前阅读这些内容。它们解释了你将在每一个步骤中看到的术语。
### 什么是 SIEM?
SIEM 代表安全信息和事件管理。SIEM 从你的整个环境中收集日志数据,并使其集中在一个地方可供搜索。它的两个核心工作是关联(跨系统连接事件,以发现任何单一系统都无法单独揭示的模式)和告警(当满足可疑条件时自动通知分析师)。
### 什么是 SPL?
SPL(Splunk 处理语言)是你用来向 Splunk 提问的查询语言。它的工作方式就像一个 pipeline —— 你从一个搜索开始,然后通过命令将结果 pipe(传递)出去,进行过滤、转换和可视化。每个 SPL 搜索都遵循以下模式:
```
index=windows_logs EventCode=4625
| stats count by Account_Name
| sort -count
```
查找事件 → 塑造结果。在开始之前你不需要了解 SPL —— 本实验中的每一个搜索都会逐行进行解释。
### 什么是 Splunk index?
index 是一个用于保存事件的命名存储桶,类似于数据库表。当日志到达时,它们会被存储在一个 index 中。当你进行搜索时,你需要指定 `index=name`。在本实验中,你将创建一个名为 `windows_logs` 的 index。
### 什么是 Universal Forwarder?
Universal Forwarder 是一个轻量级的免费代理,用于监控 Windows Event Logs 和日志文件,然后将数据压缩、加密,并通过端口 9997 转发到你的 Splunk indexer。它旨在后台静默运行于生产服务器上,对 CPU 和 RAM 的影响极小。
### 什么是 Windows Event IDs?
Windows 在事件日志中将每一个系统活动记录为带有编号的事件。在安全工作中,你会经常使用这三个事件:
| EventCode | 含义 | 安全相关性 |
|---|---|---|
| 4624 | 成功登录 | 基准 —— 谁在登录以及如何登录 |
| 4625 | 登录失败 | 激增 = 暴力破解;分散在多个账户 = 密码喷洒 |
| 4740 | 账户被锁定 | 一连串的锁定通常表明自动化攻击正在进行中 |
### 什么是 inputs.conf?
这是 Windows VM 上的一个配置文件,用于告诉 Universal Forwarder 要收集和转发哪些日志。方括号中的每个部分定义了一个数据源。你只需在设置期间编辑此文件一次。
## 步骤 1 — 获取免费的 Splunk
Splunk Enterprise 可免费下载。你将获得 60 天的完整试用期,之后它会自动转换为免费许可证。免费许可证每天允许高达 500MB 的数据索引量 —— 这对本实验来说绰绰有余。
下载适用于 Linux 的 **Splunk Enterprise**(即你接下来要创建的 Ubuntu VM)。请不要选择 Splunk Cloud(托管 SaaS)或 Splunk SOAR。
## 步骤 2 — 在 Azure 中部署 Ubuntu VM
在 Azure VM 上运行 Splunk 可以让你的计算机关闭时它依然保持运行,并且能让你的 Active Directory VM(实验 1)通过 Azure 内部网络发送日志。
| VM 设置 | 值 |
|---|---|
| 操作系统 | Ubuntu 22.04 LTS(符合免费层条件) |
| 大小 | Standard_B2s(最低 2 vCPU,4GB RAM) |
| 磁盘 | 最低 30GB |
| 入站 NSG 端口 8000 | 仅限你的 IP 地址(Splunk Web UI) |
| 入站 NSG 端口 9997 | 仅限 VNet 地址范围,例如 10.0.0.0/16(forwarder 输入 —— 非公共互联网) |
| 入站 NSG 端口 22 | 仅限你的 IP 地址(SSH) |
### 通过 SSH 连接
**macOS / Linux** —— SSH 是内置的。打开终端并运行:
```
ssh yourusername@YOUR_VM_PUBLIC_IP
# 出现 host fingerprint 提示时输入 yes,然后输入您的密码
```
**Windows** —— 首先安装 [PuTTY](https://www.putty.org)(免费,下载 64 位 `.msi` 安装程序)。打开 PuTTY,在 Host Name 字段中输入 VM 的公网 IP,端口输入 22,连接类型选择 SSH,然后点击 Open。当终端出现时,输入你的 VM 管理员用户名和密码。注意:在 PuTTY 中输入密码字符时屏幕上不会显示 —— 这是正常的 Linux 行为。
## 步骤 3 — 在 Ubuntu 上安装 Splunk
通过 SSH 登录到你的 Ubuntu VM 并运行以下命令:
```
# 下载 Splunk Enterprise
# 注意:Splunk 的 URL 会随每次发布而更新。如果返回 404,
# 登录 splunk.com → Free Trials & Downloads → Linux .deb → 复制当前的 wget 命令。
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"
# 安装 package
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
```
在浏览器中打开 Web UI:
```
http://:8000
```
## 步骤 4 — 配置数据输入
### A 部分 — 在 Splunk 中启用接收
在安装 forwarder 之前,先告诉 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
请在来自实验 1 的 **Windows Server VM** 上执行此操作,而不是在 Ubuntu VM 上。
1. 在 Windows Server VM 上,访问 [splunk.com/download/universal-forwarder](https://www.splunk.com/en_us/download/universal-forwarder.html)
2. 下载 **Windows 64-bit** 安装程序
3. 运行安装程序:
- Deployment Server:输入你的 Ubuntu VM 的**私有 IP** 及端口 `8089`
- Receiving Indexer:输入你的 Ubuntu VM 的**私有 IP** 及端口 `9997`
4. 使用默认设置完成安装
### C 部分 — 配置 inputs.conf
此文件会准确地告诉 forwarder 要收集哪些 Windows Event Logs。在 Windows Server VM 上,请在 Windows 资源管理器中导航至此路径:
```
C:\Program Files\SplunkUniversalForwarder\etc\system\local\
```
如果 `local` 文件夹不存在,请创建它。以管理员身份打开记事本,并将包含以下内容的文件保存在该位置,命名为 `inputs.conf`:
```
[WinEventLog://Security]
# Authentication 事件 — 登录、失败、锁定
disabled = 0
start_from = oldest
current_only = 0
evt_resolve_ad_obj = 1
[WinEventLog://System]
# OS 级别事件 — 服务启动/停止、驱动程序失败
disabled = 0
[WinEventLog://Application]
# 来自已安装应用程序的事件
disabled = 0
```
保存后,重启 forwarder 以应用更改。在 Windows Server VM 上以管理员身份在 PowerShell 中运行以下命令:
```
Restart-Service SplunkForwarder
```
## 步骤 5 — 基本 SPL 搜索
所有搜索都在 **Search & Reporting** 应用顶部的搜索栏中输入。使用搜索栏右侧的选择器选择时间范围。
### 确认数据正在传输
```
index=windows_logs | head 100
```
如果返回了结果,说明你的 forwarder 正在工作。如果没有返回任何结果,请验证 Windows VM 上的 `SplunkForwarder` 服务是否正在运行。
### 查找失败的登录尝试(EventCode 4625)
```
index=windows_logs sourcetype=WinEventLog:Security EventCode=4625
| stats count by Account_Name, Workstation_Name
| sort -count
```
在很短的时间窗口内,如果一个账户失败 5 次或更多,这可能是暴力破解的指标。Active Directory 中不存在的账户则表明存在枚举行为。
### 查找成功的登录(EventCode 4624)
```
index=windows_logs sourcetype=WinEventLog:Security EventCode=4624
| stats count by Account_Name, Logon_Type
| sort -count
```
| Logon_Type | 含义 |
|---|---|
| 2 | 交互式 —— 有人在使用键盘 |
| 3 | 网络 —— 正在访问文件共享 |
| 5 | 服务账户 —— 自动化的,通常是符合预期的 |
| 10 | 远程交互式 —— RDP 会话 |
### 查找账户锁定事件(EventCode 4740)
```
index=windows_logs sourcetype=WinEventLog:Security EventCode=4740
| table _time, Account_Name, Caller_Computer_Name
| sort -_time
```
同一个账户被多次锁定指向暴力破解。而分散在多个账户的锁定则表明可能是密码喷洒攻击。
### 失败登录用户名 Top 10 —— 威胁狩猎
```
index=windows_logs sourcetype=WinEventLog:Security EventCode=4625 earliest=-24h
| stats count as failures by Account_Name
| sort -failures
| head 10
```
在 24 小时内失败 20 次或以上的账户需要进行调查。不存在的用户名表明存在账户枚举。
### 检测非工作时间的登录
```
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
```
服务账户在非工作时间的登录(Type 5)是正常的。而普通用户在非工作时间的交互式登录(Type 2 或 10)则需要审查。
## 步骤 6 — 构建安全仪表盘
仪表盘可以让你永久查看安全态势,而无需手动运行搜索。
1. 点击顶部导航栏中的 **Dashboards** → **Create New Dashboard**
2. 将其命名为 `Windows Security Overview` → **Create Dashboard**
3. 为下面的每个面板点击 **Add Panel**:
| 面板名称 | 搜索 | 可视化 |
|---|---|---|
| 失败登录 —— 过去 24 小时 | EventCode=4625 以及 `stats count by Account_Name` | 柱状图 |
| 账户锁定 —— 过去 7 天 | EventCode=4740 以及 `table` 输出 | 事件列表 |
| 随时间变化的登录活动 | EventCode=4624 以及 `timechart count` | 折线图 |
| 源工作站 Top —— 非工作时间 | 非工作时间搜索以及 `stats count by Workstation_Name` | 柱形图 |
对于每个面板:选择 **New Search**,粘贴步骤 5 中的相关搜索,选择可视化类型,然后保存。
## 步骤 7 — 创建自动化告警
告警可以实现自动化检测。Splunk 按计划运行搜索,并在满足条件时通知你 —— 而无需等待人工去发现。
首先,运行此搜索以确认其有效:
```
index=windows_logs sourcetype=WinEventLog:Security EventCode=4625
| stats count as failures by Account_Name
| where failures > 10
```
然后将其保存为告警:
1. 点击 **Save As** → **Alert**
2. 名称:`Potential Brute Force — High Failure Count`
3. 告警类型:`Scheduled`
4. 运行频率:`15 minutes`
5. 触发条件:`Number Results is greater than 0`
6. 触发操作:`Add to Triggered Alerts`
7. 点击 **Save**
## 验证清单
| 检查项 | 如何验证 |
|---|---|
| 数据正在流入 Splunk | 运行 `index=windows_logs \| head 10` —— 应该返回最近的事件 |
| 失败登录搜索有效 | 运行 EventCode=4625 搜索。如果没有结果,可在 Windows VM 上故意输错几次密码,然后再搜索 |
| 仪表盘显示数据 | Windows Security Overview 显示已填充数据的面板 |
| 告警处于活动状态 | Settings → Searches, Reports, and Alerts —— 你的告警显示为 Enabled |
## 这如何应用于云环境
| Splunk 技能 | 云端等价物 |
|---|---|
| 收集 Windows 事件的 Universal Forwarder | Azure Monitor Agent · AWS CloudWatch agent |
| 将数据索引到命名存储桶中 | Log Analytics workspace 表 · CloudWatch Log Groups |
| SPL `stats count by Account_Name` | Microsoft Sentinel 中的 KQL `summarize count() by AccountName` |
| 基于失败阈值告警 | Sentinel Scheduled Query Rule · AWS GuardDuty finding |
| 构建仪表盘 | Azure Workbooks · CloudWatch Dashboards |
| 调查 EventCode 4625 | Sentinel Sign-in 日志 · AWS CloudTrail `ConsoleLogin` 事件 |
## 本实验的作品集产物
截取以下内容的屏幕截图,并将其连同每个截图的简短书面总结一起放入此代码库中:
| 产物 | 需截取的内容 |
|---|---|
| 仪表盘截图 | 显示所有四个面板已填充数据的 Windows Security Overview |
| 告警配置 | 显示计划和触发条件的暴力破解告警设置页面 |
| SPL 搜索导出 | 将非工作时间登录的搜索保存为 Report 并将其导出 |
| 发现总结 | 用一段话描述你在日志中发现了什么,以及这在真实环境中意味着什么 |
## 资源
- [Splunk 文档](https://docs.splunk.com/Documentation/Splunk)
- [Splunk SPL 快速参考](https://docs.splunk.com/Documentation/Splunk/latest/SearchReference/ListOfSearchCommands)
- [Windows Security Event IDs 参考 —— Microsoft](https://learn.microsoft.com/en-us/windows/security/threat-protection/auditing/security-auditing-overview)
- [CompTIA CySA+ 认证](https://www.comptia.org/certifications/cybersecurity-analyst)
- [Splunk Core Certified User 考试](https://www.splunk.com/en_us/training/certification-track/splunk-core-certified-user.html)
标签:安全运营, 扫描框架, 红队行动