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 与日志分析 ![Certification](https://img.shields.io/badge/CompTIA-Security%2B-blue) ![Certification](https://img.shields.io/badge/CompTIA-CySA%2B-blue) ![Certification](https://img.shields.io/badge/Splunk-Core%20Certified%20User-informational) ![Cost](https://img.shields.io/badge/Cost-%240-brightgreen) ![Duration](https://img.shields.io/badge/Duration-4--6%20hours-yellow) ![Tool](https://img.shields.io/badge/Tool-Splunk%20Enterprise-black) **技术栈:** 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)
标签:安全运营, 扫描框架, 红队行动