FardeenI/Kali-Linux-and-ELK-Stack-Detection-Engineering-Lab

GitHub: FardeenI/Kali-Linux-and-ELK-Stack-Detection-Engineering-Lab

该项目使用 Terraform 在 AWS 上快速部署包含攻击机、Windows 目标机和 ELK SIEM 的检测工程实验室,帮助安全从业者低成本实践攻击检测与日志分析。

Stars: 6 | Forks: 0

# 检测工程实验室 — AWS 上的 Kali + ELK 这是一个基于 Terraform 自动化的检测工程实验室,它向 AWS 部署了一个模拟的企业网络:一台作为攻击者的 Kali Linux,一台集成了 Sysmon 和 Winlogbeat 的 Windows 目标机,以及一台运行 Elasticsearch 和 Kibana 的 Ubuntu SIEM。克隆代码仓库,填入你的变量,几分钟内即可拥有一个完全配置好的运行环境。 ## 背景与动机 我经常通过新闻简报、博客和播客来跟进技术和网络安全的最新动态。Clint Gibler 的 [TLDR Sec](https://tldrsec.com/) 推介了一个由 Rafael Martinez 构建的检测工程实验室,该实验室使用 Terraform 向 AWS 部署攻击/防御基础设施 —— 我也想构建一个属于自己的版本。 当时我正深入研究计算机科学课程,并重度倾向于 AI 辅助软件开发,距离上次进行动手实践的安全工程已经有一段时间了。这个项目是一个回归“破坏与修复”事物的机会,同时也能学习使用 Terraform 进行基础设施即代码 的实践。 这个实验室设计中最吸引我的地方在于,它模拟了一个托管在 AWS 上的小型企业网络。它消除我通常在本地 hypervisor 上运行虚拟机时遇到的内存和存储瓶颈 —— 而且它的销毁速度与创建速度一样快。 ## 架构 ``` ┌──────────────────────────────────────────────────────────────┐ │ AWS Default VPC (us-east-1) │ │ │ │ ┌─────────────┐ [all traffic] ┌──────────────────┐ │ │ │ Kali Linux │ ──────────────────► │ Windows Server │ │ │ │ (attacker) │ │ (target) │ │ │ │ t2.medium │ │ t3.medium │ │ │ └─────────────┘ └────────┬─────────┘ │ │ │ │ │ Winlogbeat (logs → 9200) │ │ Kibana setup (→ 5601) │ │ │ │ │ ┌────────▼─────────┐ │ │ │ Ubuntu SIEM │ │ │ │ Elasticsearch │ │ │ │ Kibana │ │ │ │ t2.large │ │ │ └──────────────────┘ │ │ │ │ Operator access: SSH (22) to Kali/Ubuntu │ │ RDP (3389) to Windows │ │ Kibana UI (5601) to Ubuntu │ └──────────────────────────────────────────────────────────────┘ ``` ### 组件 | 实例 | 操作系统 | 类型 | 角色 | |---|---|---|---| | Kali Linux | Kali | t2.medium | 攻击者 —— 运行攻击工具 | | Windows Server | Windows | t3.medium | 目标机 —— Sysmon + Winlogbeat | | Ubuntu SIEM | Ubuntu | t2.large | SIEM —— Elasticsearch + Kibana | **数据流:** Kali 攻击 Windows → Sysmon 捕获详细的 Windows 事件 → Winlogbeat 将日志发送到 Elasticsearch → Kibana 将其可视化为仪表盘。 ## 成本 所有价格均为 **us-east-1** 的 AWS 按需费率,并且可能会有所变动。在部署之前,请查看 [AWS 定价页面](https://aws.amazon.com/ec2/pricing/on-demand/) 获取当前费率。 ### 计算资源 (EC2) | 实例 | 类型 | 按需费率 | 24/7 全天候运行成本 | 每周运行 5 小时成本 | |---|---|---|---|---| | Kali Linux | t2.medium | $0.0464/hr | $33.87/mo | $1.01/mo | | Ubuntu SIEM | t2.large | $0.0928/hr | $67.74/mo | $2.01/mo | | Windows 目标机 | t3.medium | $0.0416/hr | $30.37/mo | $0.90/mo | | **小计** | | | **$132/mo** | **$3.92/mo** | ### 存储 (EBS —— 无论实例处于何种状态都会持续计费) | 卷 | 大小 | 成本 | |---|---|---| | Kali root | 25 GB (gp3) | $2.00/mo | | Ubuntu SIEM root | 50 GB (gp3) | $4.00/mo | | Windows root | 30 GB (gp3) | $2.40/mo | | **小计** | | **$8.40/mo** | ### 公网 IPv4 地址 无论实例处于何种状态,AWS 对每个公网 IPv4 地址收取 $0.005/hr 的费用。对于全部三个实例,24/7 全天候运行的成本是 **$10.95/mo**;每周运行 5 小时的成本是 **$0.33/mo**。请注意,当实例停止时,动态公网 IP 会被释放,因此此项成本随运行时间而变化。 ### 总费用估算 | 使用模式 | 预估每月成本 | |---|---| | 24/7 (永远在线) | ~$151/mo | | 每周 5 小时 | ~$13/mo | ## 前置条件 在运行 `terraform apply` 之前,你需要: 1. **AWS 账户**,以及一个 IAM 用户,该用户的访问密钥已导出为环境变量: export AWS_ACCESS_KEY_ID="your-access-key" export AWS_SECRET_ACCESS_KEY="your-secret-key" 2. 已在你的 AWS 账户中创建的 **EC2 密钥对**(用于通过 SSH 连接到 Kali/Ubuntu 以及解密 Windows RDP 密码)。 3. **Kali Linux AMI 订阅** —— Kali AMI 通过 AWS Marketplace 分发,在启动前需要进行免费订阅。在运行 `terraform apply` 之前,请先[在此订阅](https://aws.amazon.com/marketplace/pp/prodview-fznsw3f7mq7to)。Windows Server AMI 由 AWS 拥有,无需订阅。 4. 已安装 **Terraform**([下载](https://developer.hashicorp.com/terraform/install))。 5. **你的公网 IP** —— 安全组将 SSH、RDP 和 Kibana 的访问限制为操作者指定的 CIDR。你需要知道采用 CIDR 表示法的公网 IP(例如 `1.2.3.4/32`)。运行以下命令以发现你当前的公网 IPv4 地址: curl -4 ifconfig.me 6. **SSH 客户端** —— 用于连接到 Kali 和 Ubuntu 实例。AWS 要求密钥对文件在使用前具有严格的权限: chmod 400 your-key.pem 7. **RDP 客户端** —— 用于连接到 Windows 实例(例如 macOS/Windows 上的 Microsoft Remote Desktop,或 Linux 上的 Remmina)。 8. **默认 VPC** —— 该实验室部署在你的 AWS 账户的默认 VPC 中。每个新的 AWS 账户在每个区域都会自带一个默认 VPC,但如果你的默认 VPC 已被删除,则需要先通过 VPC 控制台(`操作 → 创建默认 VPC`)重新创建它,然后再进行应用部署。如果你希望部署到不同的 VPC,请在 `main.tf` 中的每个 `aws_security_group` 资源中添加 `vpc_id` 参数,并在每个 `aws_instance` 资源中添加指向该 VPC 内子网的 `subnet_id` 参数。 ## 快速开始 ``` # 克隆仓库 git clone cd detection-engineering/setup/terraform # 从示例创建您的 variables 文件 cp terraform.tfvars.example terraform.tfvars # 在 terraform.tfvars 中填入您的值(参见文件以获取指导) # - Key pair 名称 # - 您的公网 IP # - 您所在区域的 AMI ID(为 us-east-1 提供了默认值) # 初始化 Terraform(下载 AWS provider) terraform init # 部署 terraform apply ``` 当应用部署完成时,Terraform 将输出所有三个实例的公网 IP。 ## 访问实验室 | 服务 | 方式 | 地址 | |---|---|---| | Kali Linux | SSH | `ssh -i your-key.pem kali@` | | Ubuntu SIEM | SSH | `ssh -i your-key.pem ubuntu@` | | Kibana | 浏览器 | `http://:5601` | | Windows | RDP 客户端 | `:3389` —— 通过 AWS 控制台使用你的密钥对解密密码 | ## 生成检测日志 实验室运行后,从 Kali 机器向 Windows 目标发起的攻击会被 Sysmon 捕获,通过 Winlogbeat 发送到 Elasticsearch,并在 Kibana 中进行可视化 —— 这正是该实验室旨在实现的核心检测工程闭环。 一次简单的端口扫描是很好的初步测试。通过 SSH 登录到 Kali 并运行: ``` ssh -i your-key.pem kali@ nmap -sV ``` 这将生成 Sysmon 的 **Event ID 3**(网络连接)条目,这些条目应在几秒钟内出现在 Kibana 的 Discover 视图中,位于 `winlogbeat-*` 数据视图下。 ## 安全组设计 三个安全组强制执行最小权限访问: - **Kali SG** —— 仅允许来自操作者 IP 的入站 SSH;出站不受限制。 - **Windows SG** —— 允许来自操作者 IP 的入站 RDP;允许来自 Kali 安全组的所有流量(攻击流量)。出站不受限制。 - **Ubuntu SG** —— 允许来自操作者 IP 的入站 SSH;允许来自操作者 IP 访问 Kibana UI (5601);仅允许来自 Windows 安全组的 Elasticsearch (9200) 和 Kibana 设置流量 (5601)。 这意味着 Elasticsearch 永远无法直接从公共互联网访问 —— 只能通过 Windows 实例的安全组成员身份从该实例进行访问。 ## 引导细节 每个实例在首次启动时都会通过 `user_data` 进行引导: **Kali** —— 运行 `apt-get full-upgrade` 并安装 `kali-linux-default` 元软件包(标准 Kali 工具套件)。针对 Wireshark 和 Kismet 的交互式提示通过 `debconf` 进行了预先设置,以防止脚本挂起。 **Ubuntu (SIEM)** —— 从官方 Elastic 8.x APT 仓库安装 Elasticsearch 和 Kibana。Elasticsearch 被配置为监听所有接口的单节点集群。SSL/TLS (`xpack.security`) 被禁用 —— Elasticsearch 8.x 软件包会在 keystore 中预先填充 SSL 凭证,这与禁用安全功能产生冲突,因此 keystore 被清空并重新创建为空状态。这是一个有意的权衡:鉴于实验室私有 VPC 的上下文,并且生产级 TLS 配置不在本实验室的学习目标范围内,中间人攻击 (MITM) 的风险是可以接受的。Kibana 被配置为监听所有接口,以便可以通过实例的公网 IP 进行访问。 **Windows (目标机)** —— 使用 [SwiftOnSecurity 配置](https://github.com/SwiftOnSecurity/sysmon-config) 安装 Sysmon 以实现全面的事件覆盖,随后安装 Winlogbeat 8.17.0。Winlogbeat 配置在启动时被修补,将其用于 Elasticsearch (9200) 和 Kibana (5601) 的目标地址指向 Ubuntu 实例的私有 IP,并且启用了仪表盘设置,以便在启动时自动将预构建的 Winlogbeat 仪表盘加载到 Kibana 中。 ## 验证部署 一旦实例运行起来,可以通过以下方式确认所有配置是否正确连通: **Kali** —— 通过 SSH 登录并抽查工具是否已安装: ``` which nmap which msfconsole which wireshark ``` **Ubuntu** —— 检查服务状态: ``` sudo systemctl status elasticsearch sudo systemctl status kibana ``` **Windows** —— 通过 RDP 登录并打开 PowerShell,以验证 Winlogbeat 配置和服务: ``` # 检查配置指向正确的 Elasticsearch/Kibana IP Get-Content "C:\Program Files\Winlogbeat\winlogbeat-8.17.0-windows-x86_64\winlogbeat.yml" # 确认服务正在运行 Get-Service winlogbeat ``` 然后在浏览器中打开 `http://:5601`。在左侧的导航菜单中,展开 **Analytics** 部分: - **Discover** —— 选择 `winlogbeat-*` 数据视图,以探索随着 Winlogbeat 流入的原始 Windows 事件日志。 - **Dashboards** —— 浏览启动时自动加载的预构建 Winlogbeat 仪表盘,获取 Windows 事件活动的可视化概览。 ## 资源追踪 所有实验室资源都已打上标签,并归类在 **AWS Service Catalog App Registry** 应用程序(`DetectionEngineeringLab`)下。这使得在 AWS 控制台的 **MyApplications** 下查找和审计实验室创建的每一个资源变得非常容易。 ## 销毁 ``` terraform destroy ``` 这将移除所有已配置的资源。由于 `*.tfstate` 已在 gitignore 中被忽略,你的状态文件是本地的 —— 在运行销毁之前,请勿删除该文件。 ## 学习目标 这个项目是对多个领域的实践: - **使用 Terraform 实现基础设施即代码** —— 将云基础设施声明为受版本控制的代码,包括 EC2 实例、安全组以及资源之间的依赖顺序。 - **检测工程基础** —— 了解 Windows 主机上的攻击者活动如何生成 artifacts,以及这些数据如何流经 Sysmon → Winlogbeat → Elasticsearch → Kibana。 - **安全组设计** —— 建模真实的网络分段策略,其中 SIEM 只能从 Windows 目标机访问(不能从公共互联网访问),攻击者可以访问目标机,但不能直接访问 SIEM。 - **云引导** —— 使用 `user_data` 在启动时完全配置实例,无需手动的部署后步骤,包括处理非交互式软件包安装和服务配置。 - **调试分布式系统** —— 诊断 Elasticsearch、Kibana 和 Winlogbeat 之间的启动顺序问题;解决 SSL/TLS keystore 冲突;以及通过安全组规则和服务日志追踪连接问题。 ## AMI 说明 (us-east-1) `terraform.tfvars.example` 中的默认 AMI ID 针对 us-east-1。如果你要部署到其他区域,请在应用之前查找适合你区域的同等 AMI。 | 实例 | 默认 AMI (us-east-1) | |---|---| | Kali Linux | ami-09e99f75cc7592017 | | Windows Server | ami-0ab5e8edee718de14 (Windows Server 2022,AWS 拥有 —— 无需 Marketplace 订阅) | | Ubuntu | ami-0ecb62995f68bb549 |
标签:AWS, DPI, ECS, ELK, IP 地址批量处理, OpenCanary, Terraform, 越狱测试, 靶场环境