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, 流量监控, 网络安全, 防御绕过, 隐私保护, 靶场环境