parth0xu/Intrusion-Detection-System-Project

GitHub: parth0xu/Intrusion-Detection-System-Project

一个基于 Snort 2.9 与 ELK Stack 的网络入侵检测实验项目,用于学习实时威胁检测、自定义规则编写和告警可视化。

Stars: 1 | Forks: 0

# Snort IDS 实验 — 在 Ubuntu 上进行网络入侵检测 这是一个在 Ubuntu Linux 上使用 VirtualBox 将 Snort 2.9 作为网络入侵检测系统 (NIDS) 的实操实验。该实验展示了针对 Metasploitable 2 目标机的实时流量监控、自定义规则创建和告警生成。 ## 实验环境 | 组件 | 详情 | |---|---| | 主机 OS | Windows (VirtualBox 宿主机) | | IDS 机器 | Ubuntu Linux (VirtualBox 虚拟机) | | 目标机器 | Metasploitable 2 (VirtualBox 虚拟机) | | Snort 版本 | 2.9.20 | | 网络适配器 | 桥接网卡 — `enp0s3` | | 混杂模式 | 全部允许 | | HOME_NET | `192.168.16.0/24` | 两台虚拟机位于同一个桥接网络中,这使得在 Ubuntu 上运行的 Snort 能够监控攻击者 (Metasploitable) 与 IDS 机器之间的流量。 ## 安装与配置 ### 1. 安装 Snort ``` sudo apt-get install snort -y ``` 在安装过程中,会出现两个提示: - **网卡接口**:设置为 `enp0s3`(当前活动的网络接口 —— 使用 `ifconfig` 验证) - **HOME_NET**:以 CIDR 表示法设置您的子网(例如:`192.168.2.0/24`) ### 2. 开启混杂模式 (VirtualBox) 在 VirtualBox 虚拟机设置 → 网络 → 高级中: - 将**混杂模式**设置为`全部允许` 这使得网卡 (NIC) 能够捕获网络段上的所有数据包,而不仅仅是发给该虚拟机的数据包 —— 这对于 IDS 的功能至关重要。 ### 3. 验证 Snort 配置目录 ``` ls -al /etc/snort ``` 关键文件: - `snort.conf` — 主配置文件 - `rules/local.rules` — 自定义规则的存放处 - `snort.debian.conf` — Debian 专属覆盖配置(在 Debian/Ubuntu 系统中,HOME_NET 在此处定义) ### 4. 编辑 snort.conf — 设置 HOME_NET ``` sudo vim /etc/snort/snort.conf ``` 找到并更新: ``` ipvar HOME_NET 192.168.16.0/24 ipvar EXTERNAL_NET any ``` 这告诉 Snort 应该将哪个 IP 范围视为受保护的内部网络。 ### 5. 确认包含 local.rules 在 `snort.conf` 中,确认存在这一行且**未被**注释掉: ``` include $RULE_PATH/local.rules ``` ### 6. 测试配置 ``` sudo snort -T -i enp0s3 -c /etc/snort/snort.conf ``` 预期输出:`Snort successfully validated the configuration!` ## 自定义规则 规则写在 `/etc/snort/rules/local.rules` 中。 ``` sudo vim /etc/snort/rules/local.rules ``` ### 规则语法 ``` action protocol src_ip src_port -> dst_ip dst_port (options) ``` | 字段 | 描述 | |---|---| | `action` | `alert`, `log`, `drop`, `reject` | | `protocol` | `tcp`, `udp`, `icmp`, `ip` | | `msg` | 人类可读的告警消息 | | `sid` | 唯一规则 ID(本地规则使用 10000+) | | `rev` | 规则修订号 | ### 编写的规则 **规则 1 — ICMP Ping 检测** ``` alert icmp any any -> $HOME_NET any (msg:"ICMP Ping Detected"; sid:10001; rev:1;) ``` 检测任何发往家庭网络的 ICMP 回显请求。在实际场景中,攻击者会使用 ping 扫描来进行主机发现/网络侦察。 **规则 2 — SSH 认证尝试** ``` alert tcp any any -> $HOME_NET 22 (msg:"SSH Authentication Attempt"; sid:10002; rev:1;) ``` 针对任何发往 22 端口的 TCP 流量触发。对于检测 SSH 暴力破解尝试或针对 SSH 服务的未授权访问尝试非常有用。 **规则 3 — FTP 认证尝试** *(通过 Snorpy 2.0 创建)* ``` alert tcp any any -> $HOME_NET 21 (msg:"FTP Authentication Attempt"; sid:100003; rev:1;) ``` 检测发往 FTP 端口 21 的连接尝试。FTP 以明文形式传输凭证 —— 对该端口的任何认证尝试都值得记录。 ## 在 NIDS 模式下运行 Snort ``` sudo snort -A console -i enp0s3 -c /etc/snort/snort.conf ``` | 标志 (Flag) | 用途 | |---|---| | `-A console` | 实时将告警打印到标准输出 (stdout) | | `-i enp0s3` | 在该接口上监听 | | `-c` | 使用此配置文件 | ## 告警输出 — 检测证明 从 Metasploitable 2 对 Ubuntu IDS 机器发起了一次 ping 扫描: ``` msfadmin@metasploitable:~$ ping -c5 192.168.16.24 ``` Snort 立即触发了 ICMP 规则并记录了双向流量: ``` 02/10-17:15:13.623259 [**] [1:10001:1] ICMP Ping Detected [**] [Priority: 0] {ICMP} 192.168.16.120 -> 192.168.16.24 02/10-17:15:13.623321 [**] [1:10001:1] ICMP Ping Detected [**] [Priority: 0] {ICMP} 192.168.16.24 -> 192.168.16.120 ``` 每一行告警包含: - **时间戳** — 数据包的准确时间 - **规则 SID** — `[1:10001:1]` 映射到我们的自定义规则 - **消息** — `ICMP Ping Detected` - **协议** — `{ICMP}` - **源 → 目的** — 显示双向的 IP 对 ## Snorpy 2.0 — 基于 Web 的规则构建器 [Snorpy](http://snorpy.cyb3rs3c.net/) 提供了一个图形用户界面 (GUI),无需记忆语法即可构建 Snort 规则。这里使用它来生成 FTP 检测规则。这对于在 `local.rules` 中进行手动微调之前的快速规则原型设计非常有用。 ## 关键要点 - **混杂模式**是 IDS 正常运作的必要条件 —— 没有它,网卡会丢弃未发送给它的包,而 Snort 将什么也看不到 - **HOME_NET 范围界定**很重要:带有 `-> $HOME_NET` 的规则仅对入站流量触发;双向监控需要双方都设为 `any` 或设置单独的规则 - **SID 命名空间**:1000000 以下的 SID 为 Snort 保留;本地自定义规则应从 1000000+ 开始(或者在实验环境中使用 10000+ 范围) - **告警噪音**:在生产环境中,ICMP 规则会产生大量误报 —— 在实际部署中,会使用阈值和抑制列表来调整规则 ## 接下来做什么 - [ ] 添加 Snort 3 的设置并比较规则语法的差异 - [ ] 编写用于 Nmap 扫描检测的规则(SYN 扫描、NULL 扫描、XMAS 扫描) - [ ] 与 SIEM(例如 ELK stack)集成以实现日志可视化 - [ ] 使用 `inline` 和 `drop` 操作测试 IPS 模式 - [ ] 为常见的 Metasploit payload 编写检测规则 ## 截图 | 步骤 | 截图 | |---|---| | 安装 Snort | `01_install.png` | | 接口配置 | `02_interface_config.png` | | HOME_NET 配置 | `03_homenet_config.png` | | 混杂模式 | `04_promiscuous_mode.png` | | /etc/snort 目录 | `05_snort_dir.png` | | snort.conf HOME_NET | `06_snortconf_homenet.png` | | 包含 local.rules | `07_localrules_include.png` | | 启用的规则类别 | `08_rule_categories.png` | | 配置自检 | `09_selftest.png` | | 打开 local.rules | `10_open_localrules.png` | | 编写的自定义规则 | `11_custom_rules.png` | | Snorpy 规则构建器 | `12_snorpy.png` | | Snort 运行 + 来自 Metasploitable 的 ping | `13_snort_running.png` | | 触发 ICMP 告警 | `14_icmp_alerts.png` | ## 参考文献 - [Snort 官方文档](https://www.snort.org/documents) - [Snort 规则编写指南](https://docs.snort.org/rules/) - [Snorpy 2.0 Web 规则创建器](http://snorpy.cyb3rs3c.net/) - [Metasploitable 2 设置](https://docs.rapid7.com/metasploit/metasploitable-2/)
标签:ELK Stack, 流量监控, 网络安全, 防御绕过, 隐私保护, 靶场环境