Ann-BT/SIDERIS
GitHub: Ann-BT/SIDERIS
SIDERIS 是一个自托管的行为 WAF 代理,通过实时分析访客行为生物特征来检测和拦截传统 WAF 无法发现的自动化威胁。
Stars: 1 | Forks: 0
███████╗██╗██████╗ ███████╗██████╗ ██╗███████╗ ██╔════╝██║██╔══██╗██╔════╝██╔══██╗██║██╔════╝ ███████╗██║██║ ██║█████╗ ██████╔╝██║███████╗ ╚════██║██║██║ ██║██╔══╝ ██╔══██╗██║╚════██║ ███████║██║██████╔╝███████╗██║ ██║██║███████║ ╚══════╝╚═╝╚═════╝ ╚══════╝╚═╝ ╚═╝╚═╝╚══════╝
SIDERIS
行为 WAF & 实时威胁检测代理
一个 sidecar 安全层,可拦截、分析并消除恶意流量—— 无需改动您应用程序的任何一行代码。
SIDERIS 是一款**自托管的 Web 应用防火墙和实时行为分析代理**,运行在您现有网站的前端。它无需对您的应用进行任何更改,可与任何技术栈配合使用 —— 无论是 WordPress、Laravel、Node.js、Django、纯静态 HTML,还是那个您在 2011 年弄出来、至今都不敢碰的祖传系统。 它的工作原理是驻留在用户和您的服务器之间,静默观察访问者的行为方式(不仅是他们请求了什么)。击键动态、鼠标移动轨迹、请求时序、浏览器指纹。当行为看起来像自动化程序时,SIDERIS 就会采取行动。当看起来像真人操作时,流量则会原封不动地通过。
### SIDERIS 解决的问题 您的应用此刻可能正在被扫描探测。撞库工具、内容爬虫、endpoint fuzzer —— 它们大多不会触发传统 WAF 的特征库,因为它们不使用已知的 payload。它们只是表现得跟真人不一样。SIDERIS 度量的正是这种差异。
| 威胁类型 | 传统 WAF | SIDERIS |
|:---|:---:|:---:|
| 已知攻击特征 (SQLi, XSS) | ✅ 拦截 | ✅ 拦截 |
| 行为异常 (bot, 爬虫) | ❌ 不可见 | ✅ 检测 |
| 撞库攻击 | ❌ 不可见 | ✅ 检测 |
| Headless 浏览器自动化 | ❌ 不可见 | ✅ 检测 |
| 合法的人类用户 | ✅ 放行 | ✅ 放行 |
### 零应用代码更改 SIDERIS 是一个 sidecar。您的应用保持原样运行。您只需将流量先导引通过 SIDERIS。这就是全部的集成步骤。 ``` Before SIDERIS: [Users] ─────────────────────────────── [Your App :8080] After SIDERIS: [Users] ── [SIDERIS :4000] ──────────── [Your App :8080] ↑ security happens here ```
| 技术栈 | 状态 |
|:---|:---:|
| WordPress / WooCommerce | ✅ 兼容 |
| Laravel / PHP | ✅ 兼容 |
| Node.js / Express | ✅ 兼容 |
| Django / Flask | ✅ 兼容 |
| Ruby on Rails | ✅ 兼容 |
| 静态 HTML / CDN origin | ✅ 兼容 |
| 任何使用 HTTP 通信的应用 | ✅ 兼容 |
SIDERIS 以三个 Docker 容器形式运行:用于维护实时状态的 `sideris-redis`,用于事件归档的 `sideris-postgres`,以及包含并发运行的核心微服务(代理、遥测数据接入、决策引擎和 SOC 面板)的 `sideris-app`。 ``` ┌─────────────────────────────────────────────────────────────────────┐ │ │ │ [ Visitor Browser ] │ │ │ │ │ ▼ :4000 ◄── the only port your users ever see │ │ ┌──────────────────────────────────────┐ │ │ │ SIDERIS WAF PROXY │ │ │ │ • Enforces blocks before forwarding │ │ │ │ • Injects agent.js into HTML │ │ │ │ • Drops confirmed threats at edge │ │ │ └──────────────┬───────────────────────┘ │ │ │ clean traffic only │ │ ▼ :8080 │ │ [ Your Web Application ] │ │ (untouched, unaware, unbothered) │ │ │ └─────────────────────────────────────────────────────────────────────┘ ┌──────────────────────────────┐ │ agent.js (in browser) │ Collects silently: │ │ • Keystroke timing intervals │ Injected into every page │ • Mouse movement vectors │ Zero visible UI changes │ • Browser fingerprint │ │ • Request cadence + patterns └──────────────┬───────────────┘ │ telemetry stream ▼ :5000 ┌──────────────────────────────┐ │ INGEST COLLECTOR │ │ Validates & routes events │ │ into Redis Streams │ └──────────────┬───────────────┘ │ ▼ ┌──────────────────────────────────────┐ │ SCORING ENGINE + GUARD │ │ │ │ Score = Impact │ │ × Confidence │ │ × Persistence │ │ │ │ Tier 1 ──► Monitor (Allow) │ │ Tier 2 ──► Rate Limit │ │ Tier 3 ──► CAPTCHA Challenge │ │ Tier 4 ──► Soft Block │ │ Tier 5 ──► Hard Block │ │ │ │ Live state ──► Redis │ │ Event archive ──► PostgreSQL │ └──────────────┬───────────────────────┘ │ ▼ :6001 (API) / :5173 (UI) ┌──────────────────────────────┐ │ SOC DASHBOARD │ │ Real-time session monitor │ │ Threat management console │ │ IP-allowlist gated access │ └──────────────────────────────┘ ```
### 评分模型 每个会话都会累积威胁分数,该分数会持续根据以下公式重新计算: $$\text{Score} = \text{Impact} \times \text{Confidence} \times \text{Persistence}$$ | 因素 | 衡量内容 | |:---|:---| | **Impact** | 检测到的行为严重程度 —— 探测关键 endpoint 与被动抓取内容的对比 | | **Confidence** | 确信这不是误报的程度,基于信号的一致性判定 | | **Persistence** | 可疑行为持续的时间和一致性 | 分数会随时间衰减。一个触发了速率限制但随后表现正常的访问者,其状态会恢复为干净 —— SIDERIS 不会永久记仇。
### MITRE ATT&CK 覆盖范围
| 技术 | ATT&CK ID | 检测信号 |
|:---|:---:|:---|
| 撞库攻击 | `T1110.004` | 请求节奏 + 表单填写时序异常 |
| 网页抓取 / 内容窃取 | `T1119` | 导航模式 + 请求量激增 |
| 漏洞扫描 | `T1595.002` | Endpoint 模糊测试特征 + 时序特征 |
| 浏览器指纹欺骗 | `T1592` | 浏览器环境不一致 |
| Headless 浏览器自动化 | `T1059.007` | 行为生物特征偏差 |
### 可扩展性与弹性
### 延迟开销 在单机 Docker 环境下针对本地目标 (OWASP Juice Shop) 进行测试:
| 请求状态 | 增加的延迟 | 备注 |
|:---|:---:|:---|
| 干净请求, session 在 Redis 中 | **~2–4ms** | 回访者的典型延迟 |
| 首次请求,冷 session | **~8–12ms** | 每个新访客仅需付出一次的代价 |
| 被封锁的 session | **< 1ms** | 在代理层直接丢弃,永远不会到达您的应用 |
### 内存占用
| 容器 | 空闲 RAM |
|:---|:---:|
| sideris-proxy | ~60 MB |
| sideris-ingest | ~50 MB |
| sideris-dashboard | ~80 MB |
| Redis | ~30 MB *(随 session 增长)* |
| PostgreSQL | ~90 MB |
| **总计** | **~310 MB** |
**1GB VPS** 足以应对中低流量。对于高流量部署环境,建议使用配置了 `Redis maxmemory` 的 **2GB 实例**。
**Session 容量:** 默认配置可处理约 10,000 个并发追踪 session,之后 Redis 的内存压力才会成为瓶颈。支持自定义调优 —— 详见[配置](#configuration)。
#### `01` SOC 面板 — 主视图
**前置条件:** Docker 和 Docker Compose。您的主机上无需安装任何其他内容。
| 01 | 克隆代码库 |
| 02 | 配置 —— 只需 30 秒 |
| 03 | 启动 |
### 运行内容 ``` sideris-app (Proxy) :4000 ◄ WAF — faces the internet sideris-app (Ingest) :5000 ◄ Telemetry receiver — keep internal sideris-app (SOC API) :6001 ◄ Dashboard API — keep internal sideris-app (SOC UI) :5173 ◄ Dashboard UI — keep internal sideris-redis internal only sideris-postgres internal only ``` 所有服务间流量均通过隔离的 Docker 网络运行。只有您明确暴露的端口才能从外部访问。
### 推荐的生产环境部署 ``` [Internet] │ ▼ :443 [Nginx / Cloudflare] ◄── handles TLS │ ▼ :4000 [SIDERIS] ◄── handles security logic │ ▼ :8080 [Your Application] ◄── untouched ``` 如需包含 HTTPS、高可用性和扩展的完整生产环境部署:**[部署指南](./DEPLOYMENT.md)**
不是 DDoS 缓解工具
SIDERIS 专为单个话的行为分析而设计,而非针对大流量洪水攻击。如果您每秒接收到数以百万计的请求,您需要在 SIDERIS 上游部署 CDN 级别的解决方案(如 Cloudflare, AWS Shield)—— 而不是用它来替代它们。
不是网络防火墙
SIDERIS 运行在 HTTP 应用层。它不检查原始 TCP/UDP 流量,不提供 IDS/IPS 功能,也不能替代
iptables / ufw 规则。
静态检测阈值 —— 非基于 ML
SIDERIS 使用预配置的静态规则和阈值,而不是动态的机器学习。这消除了预热延迟,使得评分引擎具有可预测性和可审计性,但也意味着您可能需要调整
.env 中的灵敏度,以匹配您应用的基础流量特征。
可能会出现误报
高级用户、辅助功能工具以及某些浏览器扩展可能会产生类似于自动化程序的行为信号。默认阈值已进行保守调优,但任何行为系统都不可能完美无缺。任何受影响的会话都可以在几秒钟内从主动防御注册表中解除。
行为遥测需要 JavaScript 支持
agent.js 需要在访客的浏览器中运行 JavaScript。禁用 JS 的会话将回退为仅分析请求模式。这涵盖了绝大多数真实流量,但会降低对禁用 JS 客户端的检测置信度。
所有配置都位于 `.env` 中。无需到处寻找配置文件。
| 变量 | 默认值 | 描述 |
|:---|:---|:---|
| `TARGET_URL` | `http://localhost:8080` | 您应用的内部地址。SIDERIS 会将干净流量转发至此。 |
| `PROXY_PORT` | `4000` | 面向公众的 WAF 端口。这是您的用户连接的端口。 |
| `INGEST_PORT` | `5000` | 遥测数据接收器。保持内部访问 —— 不要暴露在公网上。 |
| `DASHBOARD_PORT` | `6001` | SOC 面板 API。保持内部访问。 |
| `REDIS_URL` | `redis://redis:6379` | 实时会话状态。由 Docker 自动管理。 |
| `POSTGRES_URL` | `postgresql://sideris:...` | 事件归档。由 Docker 自动管理。 |
| `DASHBOARD_ALLOWED_IPS` | `127.0.0.1,::1` | 允许访问 SOC 面板的 IP。在此处添加您自己的 IP。 |
**常见配置:** ``` # 在 SOC dashboard 上允许你的 IP DASHBOARD_ALLOWED_IPS=127.0.0.1,::1,203.0.113.42 # 直接在 VPS 上接管端口 80 TARGET_URL=http://localhost:8080 PROXY_PORT=80 # 允许整个办公网络 DASHBOARD_ALLOWED_IPS=127.0.0.1,::1,192.168.1.0/24 ``` 如需了解评分阈值调优、会话 TTL 和高级选项:**[部署指南](./DEPLOYMENT.md)** ### 扩展参考指南 * **[运维与管理指南](./docs/ADMIN_GUIDE.md)** —— 管理活跃封禁、通过 CLI/Redis 解封用户、数据库维护和故障排除。 * **[自定义与规则调优指南](./docs/CUSTOMIZATION.md)** —— 关于评分公式、调整缓解阈值以及编写自定义 WAF 规则的详细信息。 * **[浏览器 Agent 参考](./docs/AGENT_DETAILS.md)** —— 客户端遥测规范、会话同步机制和 CSP 兼容性。
SIDERIS 会使我的网站变慢吗?
对于大多数网站:影响微乎其微。已建立会话的干净请求增加 ~2–4ms 延迟。冷会话查找(新访客)增加 ~8–12ms。被封锁的会话在 1ms 内即被丢弃,永远不会到达您的应用。完整数据请参阅 性能。
如果 Redis 或 PostgreSQL 宕机会怎样?
SIDERIS 配置为失败放行(fail open)。如果 Redis 遇到问题,WAF 代理会捕获错误、记录日志,并回退为直接将流量路由到您的应用程序,而不会阻止用户。您的网站将保持在线,但在数据库恢复之前,行为评分将暂停。
它会拦截我的合法用户吗?
偶尔有可能,特别是对于高级用户或辅助工具使用者。默认阈值是保守的。任何被拦截的会话都可以在几秒钟内从主动防御注册表中予以豁免,您也可以直接在
.env 中调整灵敏度。
它支持 HTTPS 吗?
SIDERIS 终结的是纯 HTTP 协议。在它前面配置 Nginx 或 Caddy 来处理 TLS,然后转发到 SIDERIS 的 4000 端口。这是标准的反向代理模式 —— 设置上没有任何特别之处。
agent.js 会收集个人数据吗?
它仅收集行为信号:击键的时间间隔、鼠标移动向量、请求模式。它不收集击键本身的内容、表单字段内容或任何个人可识别信息。您可以直接审查代码库中的
agent.js。
我可以在虚拟主机(共享托管)上运行它吗?
不行。SIDERIS 需要 Docker 环境。您需要一台 VPS 或独立服务器。
发现了 Bug?有功能建议?已经部署在实际网站上了?
[](https://github.com/Ann-BT/SIDERIS/issues)
[](mailto:anbt.personal@gmail.com)
**SIDERIS** 是开源项目,采用 MIT 许可证。
免费使用、修改和部署 —— 个人项目、商业网站,随便什么都可以。 该许可唯一不涵盖的情况是:如果动机极强的攻击者最终还是突破了防线,我们不承担任何责任。安全是一个过程。SIDERIS 只是其中的一层防线。
*出于对 Web 安全的真诚偏执以及与 Redis Streams 之间不太健康的依赖关系而打造。*
免费使用、修改和部署 —— 个人项目、商业网站,随便什么都可以。 该许可唯一不涵盖的情况是:如果动机极强的攻击者最终还是突破了防线,我们不承担任何责任。安全是一个过程。SIDERIS 只是其中的一层防线。
*出于对 Web 安全的真诚偏执以及与 Redis Streams 之间不太健康的依赖关系而打造。*
标签:AMSI绕过, AppImage, CISA项目, GNU通用公共许可证, IP 地址批量处理, MITM代理, Node.js, WAF, Web应用防火墙, 代理服务, 威胁检测, 安全防护, 搜索引擎查询, 测试用例, 自定义脚本, 请求拦截