Abdulbaset/snortforge

GitHub: Abdulbaset/snortforge

一款可视化的 Snort 3 规则构建、校验、转换与测试工具,帮助安全团队无需手写语法即可高效生成和管理入侵检测规则。

Stars: 1 | Forks: 0

# SnortForge **新一代特征签名合成器** — *检测。锻造。防御。* 一款专为网络安全工程师、SOC 分析师和事件响应人员打造的快速、可视化 Web 层工具,用于构建、验证、转换和测试 Snort 3 规则,无需手写语法。它消除了语法错误,并缩短了实时事件发生时的规则部署时间。 SnortForge 是一款桌面级**内部**工具,可在本地或 Docker 中运行。它不面向公网,且 v1 版本不包含身份验证。 ## ⚠ 校验范围 — 阅读说明 SnortForge 仅执行**预检**:格式正确的 IP/CIDR、有效的端口范围、可编译的正则表达式(仅限语法,而非 Snort PCRE2 语义)以及 SID 范围。通过这些检查的规则仅是**格式正确**的,*并未*经过 Snort 引擎校验。UI 中会对此进行明确标注。 **唯一真正的校验器是 Snort 引擎本身。** 要真正校验导出的 `.rules` 文件,请通过 Snort 运行它: ``` snort -c /path/to/snort.lua -R snortforge_1000001.rules -T ``` SnortForge 绝不会声称执行其实际并未进行的引擎级校验。 ## 功能 - **规则构建器** — 可视化的 Snort 3 header + content 构建器。支持带有逐行 `nocase` / `fast_pattern`、位置子选项(`offset`, `depth`, `distance`, `within`)以及 sticky-buffer 选择器的可重复内容行。高级选项涵盖 `flow`, `dsize`, `ttl`, `flags`, `itype`/`icode`, `classtype` 和 `reference`。引擎会将每个 sticky buffer 输出在独立行上,位于其作用的 content *之前*,并且仅在活动 buffer 更改时才输出(无重复的 buffer 行)。 - **校验与护栏** — 采用 Pydantic v2 模型,并为格式错误的 IP、反转/越界的端口、损坏的正则表达式提供内联字段错误提示,以及针对保留范围 SID 的警告(`sid < 1000000`)。 - **MITRE ATT&CK 映射** — 多选当前的企业级技术,并折叠进规则的 `metadata:` 块中。(T1043 已弃用且未进行预置。) - **Snort 2 → Snort 3 转换器** — 对 content + 修饰符进行有序分组,并正确放置 sticky-buffer;在输入错误时返回清晰的错误字符串。 - **PCAP 合成** — 使用 Scapy 构造的单个数据包(TCP、UDP 或 ICMP echo,支持 UTF-8 或十六进制 payload),可下载为 `.pcap` 文件供 Wireshark 检查。 - **实验室助手** — 将构建的规则转化为完整的实验工作流:提供 `local.rules` 下载、`snort.lua` 的 HOME_NET/ips 代码片段、`snort -T` 校验命令、带有重放命令的合成触发 pcap,以及带有匹配流量生成器的实时 IDS 模式运行命令。 - **模板与解释模式** — 提供与实验对齐的入门规则(ICMP ping、HTTP GET 到 /admin、SSH 尝试、DNS 查询、超大 payload)以及一个按模块教授的选项类别分组的逐行规则解释器。 - **团队库** — 保存/搜索/加载规则。默认使用 SQLite,在生产环境中只需更改一次连接字符串即可切换为 PostgreSQL。 - **浅色/深色主题** — 通过侧边栏的切换开关即可切换整个 UI;**默认为浅色主题**。字体排版方面,UI 文本使用 Inter,标题、标签和代码使用 JetBrains Mono。 ## 如何使用 应用默认打开五个标签页:**规则构建器**、**Snort 2 → 3 转换器**、**PCAP 合成**、**实验室助手**和**团队库**。 使用左侧边栏中的 **⚙ 显示**控件可在浅色和深色模式之间切换(应用默认以浅色模式打开)。 ### 规则构建器 — 构建 Snort 3 规则 1. **设置 header。** 选择动作(由于 `drop`/`reject` 会阻断流量,因此会将其标记为琥珀色)、协议和方向(`->` 单向,`<>` 双向)。填写源/目的 IP 和端口。此处支持单个值、CIDR (`192.168.1.0/24`)、列表 (`80,443`)、范围 (`1024:65535`)、`any` 以及 Snort 变量 (`$HOME_NET`, `$HTTP_PORTS`)。错误的值会直接在字段下方显示红色错误。 2. **添加 content 匹配。** 每一行对应一个 `content:` 匹配。输入字符串,可选择 **sticky buffer**(例如 `http_uri`)来指定查找的*位置*,并勾选 `nocase` / `fast_pattern`。使用 **➕ 添加 Content 匹配** 增加更多行,点击行末的 **✖** 可将其移除(系统会保留最后一行)。 3. **可选的 PCRE。** 输入正则表达式(例如 `/admin/i`)。它会进行实时的测试编译;在修复编译错误之前,将阻止规则生成。 4. **映射 MITRE 技术。** 从多选框中选择;它们将被折叠进规则的 `metadata:` 块中。 5. **设置 SID 和 rev。** 请使用 `>= 1000000` 的 SID(自定义范围)。如果 SID 低于此值,系统会显示琥珀色警告,但不会阻止操作。 6. **使用输出结果。** 组装好的规则会实时渲染在代码块中。点击代码块的复制图标进行复制,或点击 **⬇ 下载 .rules**。 7. **保存(可选)。** 展开 **💾 保存到团队库**,设置标题/作者/备注,然后点击 **保存规则** 将其存储到库中。 ### Snort 2 → 3 转换器 — 迁移旧版规则 将 Snort 2 规则粘贴到文本框中并点击 **转换**。转换器会将每个 `content:` 及其尾部的修饰符进行分组,将 buffer 修饰符(`http_uri` 等)提升到 content 上方各自的 sticky-buffer 行中,并按顺序保留其余部分(`msg`, `flow`, `sid`, `rev`, …)。如果输入有误,将返回清晰的错误提示,而不是输出转换了一半的规则。点击 **⬇ 下载 .rules** 下载结果。 ### PCAP 合成 — 构造测试数据包 选择 TCP/UDP,设置源/目的 IP 和端口,并输入 payload(切换 **Payload 为十六进制** 可输入原始字节,例如 `41424344`)。变量/`any` 将回退到合理的默认值。点击 **生成 .pcap**,然后点击 **⬇ 下载 .pcap** 并在 Wireshark 中打开它,以确认构造的数据包和 payload 字节。此过程不会发送任何实时流量。 ### 团队库 — 查找和复用规则 将搜索框留空即可列出所有内容,或按 **SID**、**标题** 或 **MITRE 标签** 进行过滤。展开任意规则可查看其文本,将其下载为 `.rules`,或点击 **加载到构建器**。编辑已保存的规则会自动增加其 `rev`。 ### 典型工作流 在 **规则构建器** 中构建规则 → 在 **PCAP 合成** 中构造匹配的数据包 → 使用该 `.pcap` 针对导出的 `.rules` 运行 `snort` 以确认其是否触发 → **保存到团队库** 以便团队复用。 ## 本地运行 (Python 3.11+) ``` python -m venv .venv && source .venv/bin/activate # Windows: .venv\Scripts\activate pip install -r requirements.txt streamlit run app.py ``` 打开 http://localhost:8501。 ## 在 Docker 中运行(推荐) ``` docker build -t snortforge . docker run -d -p 8501:8501 snortforge ``` 打开 http://localhost:8501。对于 PCAP 合成,下载 `.pcap` 文件并确认其能在 Wireshark 中打开,且包含构造的数据包和 payload 字节。 **不需要** `--cap-add=NET_ADMIN`:SnortForge 仅构造并写入 pcap 文件,它不会发送或嗅探实时流量。只有在将来添加了实时捕获功能时才需要添加该参数。 ## 在线部署 — Streamlit Community Cloud(私有) SnortForge **没有内置身份验证**(v1 是一个内部工具)。请将其部署为**私有**应用,以便只有您加入白名单的用户才能访问。Community Cloud 不会使用 `Dockerfile`;它会根据 `requirements.txt` 和 `packages.txt` 进行安装(已包含 Scapy 所需的 `libpcap`/`tcpdump`)。 1. **推送到私有 GitHub 仓库。** 从 `D:\SnortForge\SnortForge` 目录执行: git init git add . git commit -m "SnortForge v1" git branch -M main git remote add origin https://github.com//snortforge.git git push -u origin main 包含的 `.gitignore` 会将 `secrets.toml`、`*.db` 和缓存排除在 git 之外。 2. **配置免费的 Postgres**(Neon 或 Supabase)。复制其连接字符串。如果不进行此操作,应用将回退到 SQLite,而 SQLite 在 Community Cloud 上是**临时性**的,每次重新部署都会重置。 3. **创建应用**,访问 https://share.streamlit.io → "New app" → 选择您的仓库,分支 `main`,主文件 `app.py`。 4. **添加密钥。** 在应用设置 → **Secrets** 中,粘贴(参见 `.streamlit/secrets.toml.example`): SNORTFORGE_DB_URL = "postgresql://USER:PASSWORD@HOST:5432/DBNAME?sslmode=require" `app.py` 会将此密钥桥接到环境中,因此存储层会自动选择 Postgres。 5. **锁定访问权限。** 在应用设置 → **Sharing** 中,保持其私有状态并添加查看者的电子邮件。白名单用户可通过 Google 或一次性电子邮件链接登录;其他任何人都无法打开该应用。 ### 要求登录(推荐,特别是对于公开仓库) 公开仓库意味着从其部署的 Community Cloud 应用是**公开可见**的,而 SnortForge 本身没有身份验证。为了对其进行限制,应用支持 Streamlit 原生的 OpenID Connect 登录(`st.login`)。当密钥中存在 `[auth]` 块时,`app.py` 会在渲染任何内容之前要求登录;如果没有,应用将保持开放状态(本地/开发/测试环境)。 1. 在 OIDC 提供商(Google、Microsoft Entra、Auth0、Okta 等)处注册 OAuth 客户端。将重定向 URI 设置为 `https://YOUR-APP.streamlit.app/oauth2callback`。 2. 将 `[auth]` 块添加到您的 Streamlit 密钥中(参见 `.streamlit/secrets.toml.example`): [auth] redirect_uri = "https://YOUR-APP.streamlit.app/oauth2callback" cookie_secret = "GENERATE_A_LONG_RANDOM_STRING" client_id = "YOUR_OAUTH_CLIENT_ID" client_secret = "YOUR_OAUTH_CLIENT_SECRET" server_metadata_url = "https://accounts.google.com/.well-known/openid-configuration" `requirements.txt` 中的 `Authlib` 是实现此功能所必需的。 3. 重新部署。用户现在将看到登录界面;只有经过身份验证的用户才能访问该应用。由于 `st.login` 仅进行身份验证而本身不维护白名单,请进一步在提供商处限制*哪些*账户可以访问(例如限制为您的 Google Workspace 域)。 ### 替代方案:Railway / Render(Docker + 托管 Postgres) 如果您更喜欢使用实际的 Docker 镜像和托管数据库运行,Railway 或 Render 都可以部署此仓库的 `Dockerfile`,并配置一个 Postgres 供您连接到 `SNORTFORGE_DB_URL`。无论哪种方式,请在前面加上身份验证层(Cloudflare Access 或 `st.login`),因为应用本身没有内置身份验证。 ## 存储后端 UI 仅与 `storage.repository.get_repository()` 通信。默认情况下,这是一个位于 `data/library.db` 的 SQLite 文件。要在生产环境中使用 PostgreSQL,请设置: ``` export SNORTFORGE_DB_URL="postgresql://user:pass@host:5432/snortforge" ``` 无需更改 UI 代码 — 相同的 schema 和 repository API 即可同时服务于两者。 ### 使用 Docker Compose 测试 Postgres 后端 `docker-compose.yml` 会启动应用以及一个 PostgreSQL 容器。凭据来自本地 `.env` 文件(未提交到 git),`SNORTFORGE_DB_URL` 会根据这些凭据自动组装。只需复制一次示例文件,然后运行: ``` cp .env.example .env # Windows: copy .env.example .env docker compose up --build ``` 打开 http://localhost:8501。此时 library 标签页将读写 Postgres。数据将持久化存储在 `snortforge_pgdata` 卷中。如需清除数据,请运行:`docker compose down -v`。 要恢复使用 SQLite,请改为运行普通镜像(`docker run -p 8501:8501 snortforge`)。 ## 测试 ``` pip install -r requirements-dev.txt pytest ``` 测试套件覆盖了规则引擎(、多 content、buffer 排序与去重、变量 + CIDR header)、校验器(格式错误的 IP、反向端口范围、小于 1,000,000 的 SID、损坏的正则表达式、已弃用的 MITRE)、转换器(buffer 放置、共享 buffer 去重、选项保留、垃圾输入)、pcap 引擎(包含 payload 字节、十六进制模式、默认替换)以及团队库 repository(保存、按 SID/标题/标签搜索、加载、编辑时提升版本号)。 ## v1 暂不包含的功能(未来工作) 身份验证、多用户账户、实时数据包捕获、直接与 Snort 引擎集成以及规则性能分析。这些功能经考量后暂未开发。 ## 致谢 **由 Abdulbaset Al-Saidy 开发。** *作者与开发者:Abdulbaset Al-Saidy*
标签:Kubernetes, Mutation, Python, Snort规则生成, 可视化, 无后门, 测试用例, 请求拦截, 逆向工具