harshraj1695/ThreatLens

GitHub: harshraj1695/ThreatLens

基于 Snort3 的实时入侵检测仪表盘,解析告警并以 Web 可视化方式呈现可疑活动。

Stars: 0 | Forks: 0

# Snort3 IDS 仪表盘 一个基于 AFPacket 的 Snort3 实时入侵检测仪表盘。解析 Snort 告警日志,并在 Web UI 中实时显示攻击分类、源 IP 跟踪和严重性过滤。 ## ![dashboard](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/6b2b0c4182212023.png) ![dashboard2](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/43a8f7cf34212033.png) ## 项目结构 ``` snort_project/ ├── app/ │ ├── alerts.py # Snort alert parsing and categorization │ ├── config.py # Paths and environment-driven settings │ ├── rules.py # Rule validation and rule-file writes │ ├── state.py # In-memory dashboard aggregates │ ├── web.py # HTTP server, SSE stream, static/template serving │ ├── static/ │ │ ├── css/dashboard.css # Dashboard styles │ │ └── js/dashboard.js # Dashboard client logic │ └── templates/index.html # Dashboard markup ├── scripts/ │ └── setup_and_run.sh # Installs runtime packages and starts Snort + dashboard ├── server.py # Thin entrypoint for starting the app └── README.md ``` ## 先决条件 - Snort3 已安装在 `/usr/local/snort/bin/snort` - Snort 配置文件位于 `/usr/local/snort/etc/snort/snort.lua` - 本地规则文件位于 `/usr/local/snort/etc/snort/rules/local.rules` - Python 3(仅使用标准库,无需 pip 安装) - 日志目录:`/var/log/snort/` ## 安装设置 ### 1. 确保日志目录存在 ``` sudo mkdir -p /var/log/snort ``` ### 2. 可选的运行时配置 仪表盘现在支持通过环境变量进行配置,而非硬编码路径: ``` export SNORT_ALERT_FILE=/var/log/snort/alert_fast.txt export SNORT_INTERFACE=eth0 export SNORT_DASHBOARD_HOST=0.0.0.0 export SNORT_DASHBOARD_PORT=8888 ``` ## 运行 ### 一键启动 如果你希望有一个脚本同时准备本地运行时环境并启动 Snort 和仪表盘: ``` sudo bash scripts/setup_and_run.sh ``` 它会执行以下操作: - 在支持的情况下安装小型运行时包,如 `python3`、`curl` 和 `lsof` - 检查 Snort 二进制文件和配置文件是否存在 - 创建 `/var/log/snort` 目录 - 默认在 `eth0` 上使用 AFPacket 启动 Snort - 在端口 `8888` 上启动仪表盘服务 你可以通过环境变量覆盖默认设置: ``` sudo SNORT_INTERFACE=eth0 SNORT_DASHBOARD_PORT=8890 bash scripts/setup_and_run.sh ``` 你需要**同时运行两个终端**。 ### 终端 1 — 启动 Snort3 ``` sudo /usr/local/snort/bin/snort \ --daq afpacket \ -i eth0 \ -c /usr/local/snort/etc/snort/snort.lua \ -l /var/log/snort \ -A alert_fast \ --lua "alert_fast = { file = true }" ``` 预期输出: ``` afpacket DAQ configured to passive. Commencing packet processing ++ [0] eth0 ``` ### 终端 2 — 启动仪表盘服务 ``` sudo python3 ~/snort_project/server.py ``` 预期输出: ``` [snort-dashboard] Watching /var/log/snort/alert_fast.txt [snort-dashboard] Loaded X existing alerts [snort-dashboard] Dashboard running at http://localhost:8888 ``` 如果使用 `sudo` 导出了自定义环境变量,请确保它们被保留: ``` sudo --preserve-env=SNORT_ALERT_FILE,SNORT_INTERFACE,SNORT_DASHBOARD_HOST,SNORT_DASHBOARD_PORT python3 ~/snort_project/server.py ``` ### 终端 3 — 打开仪表盘 在浏览器中打开: ``` http://localhost:8888 ``` ## 生成测试流量 ``` # 触发 ICMP 规则 ping -c 5 8.8.8.8 # 触发 HTTP 规则 curl http://example.com # 查看原始告警 sudo tail -f /var/log/snort/alert_fast.txt ``` ## 本地规则 规则文件路径:`/usr/local/snort/etc/snort/rules/local.rules` ``` alert icmp any any -> any any (msg:"ICMP Ping Detected"; sid:1000001; rev:1;) alert tcp any any -> any 22 (msg:"SSH Connection Attempt"; sid:1000002; rev:1;) alert tcp any any -> any 80 (msg:"HTTP Traffic Detected"; sid:1000003; rev:1;) ``` 要添加新规则,请追加到该文件并重启 Snort。无需重启仪表盘。 ## 仪表盘功能 | 功能 | 描述 | |---|---| | 实时告警流 | 新告警通过 SSE 即时显示(无需刷新页面) | | 严重性过滤 | 按严重程度过滤:危急 / 高 / 中 / 低 | | 分类过滤 | 自动分类告警(侦察、Web 攻击、漏洞利用、DoS 等) | | 搜索 | 按源 IP 地址或消息关键词过滤 | | 源 IP 排行 | 显示最活跃攻击主机的柱状图 | | 攻击类型分类 | 按攻击类型统计分布 | | 每分钟告警数 | 展示流量随时间变化的趋势线 | | 协议分布 | ICMP / TCP / UDP 比例 | | 实时指示器 | 绿色圆点表示 SSE 连接状态 | ## API 接口 服务器提供以下接口(可用于脚本编写或集成): | 接口 | 描述 | |---|---| | `GET /` | 提供仪表盘界面 | | `GET /api/alerts` | 最近 100 条告警(JSON 格式) | | `GET /api/stats` | 聚合统计信息(Top IP、分类、严重性计数) | | `GET /api/stream` | SSE 流 — 实时推送新告警 | 示例: ``` curl http://localhost:8888/api/alerts | python3 -m json.tool curl http://localhost:8888/api/stats | python3 -m json.tool ``` ## 告警严重性映射 Snort 优先级字段与仪表盘严重性对应关系如下: | Snort 优先级 | 仪表盘严重性 | |---|---| | 1 | 危急 | | 2 | 高 | | 3 | 中 | | 4+ | 低 | ## 故障排查 **`alert_fast.txt` 未创建** Snort 在首次触发告警后才会创建该文件。可通过执行 `ping -c 3 8.8.8.8` 触发一条告警。 **浏览器显示“此页面无法找到”** 请从该项目目录运行服务,以便正确提供 `app/templates/` 和 `app/static/` 中的模板和静态资源。 **访问告警文件权限被拒绝** 由于告警文件归 root 所有,请始终使用 `sudo` 运行服务。 **仪表盘显示“等待告警”** SSE 连接正常,但尚未触发任何告警。可通过 `ping` 或 `curl` 生成流量。 **端口 8888 已被占用** ``` sudo lsof -i :8888 sudo kill ```
标签:AF_PACKET, Dashboard, HTTP服务器, IP追踪, PB级数据处理, Python, SSE, 仪表盘, 安全可视化, 安全运维, 实时日志分析, 开源安全工具, 攻击分类, 无后门, 网络威胁检测, 规则命中, 逆向工具, 逆向工程平台