leivyfrostbispo1999-commits/sentinela
GitHub: leivyfrostbispo1999-commits/sentinela
一个教学与演示用途的 mini-SIEM,通过 Kafka、Redis 和 YAML 规则实现事件驱动的安全检测与实时告警展示。
Stars: 1 | Forks: 0
# Sentinela SOC 5.6
Sentinela SOC 5.6 是一个教育/专业性质的 mini-SIEM,其架构灵感来源于真实的 SOC 环境。
该项目演示了完整的安全 pipeline:事件的生成与收集、通过 Kafka 的摄入、基于 YAML 规则的检测、结合 Redis 状态存储的时序关联、Threat Intelligence、PostgreSQL 持久化、基于 token/JWT 的认证、Prometheus 指标以及实时的 SOC dashboard。
它并不旨在替代 Splunk、Elastic、QRadar、Wazuh 或其他企业级平台。其目标是展示技术成熟度、代码组织能力、默认安全设计以及可扩展能力。
## 5.6 版本更新内容
- Redis 作为 `rule_engine` 的状态存储,并自动回退到内存模式。
- JWT HMAC-SHA256 认证,同时保持与 `X-SENTINELA-TOKEN` 的兼容性。
- `/auth/token` Endpoint,用于使用旧版 token 签发演示用 JWT。
- 使用 `pytest` 对评分、检测、认证和 `simulated_block` 进行测试。
- 使用 `pytest` 和 `py_compile` 的 GitHub Actions。
- Redis 服务已添加到 Docker Compose 中。
- 教育配置 Profile `kafka-lab`,包含额外的 Kafka broker,且不会破坏单 broker 模式。
- 事件演示模式,包含 `Simular Ataque` 按钮和 `Incident Timeline`。
- 更新 README 以反映 5.6 版本及其技术决策。
## 架构
```
simulator / log_collector
|
v
Kafka topic: raw_logs
|
v
rule_engine
|
+--> Redis state store
| fallback: in-memory state
|
v
Kafka topic: security_alerts
|
v
alert_sink
|
v
PostgreSQL
|
v
dashboard_api
|
v
dashboard_web
```
## 核心功能
- 基于 Kafka 的事件驱动架构。
- 通过 `raw_logs` 摄入原始事件。
- 通过 `security_alerts` 发布丰富化后的告警。
- 可配置的 YAML 检测规则。
- 按照IP、服务、端口和事件类型进行多维度的时序关联。
- 基于 Redis 的关联状态,具备安全的内存回退机制。
- 本地和模拟的外部 Threat Intelligence。
- 基于事件类型、敏感端口、频率、序列和 IOC 匹配的风险评分。
- 使用 `simulated_block` 进行安全的自动化响应。
- PostgreSQL 持久化,具备向后兼容的 schema 演进。
- 具备旧版 token 和 JWT 认证的 REST API。
- 兼容 Prometheus 的 `/metrics` Endpoint。
- 包含过滤器、搜索、排名、分析、攻击地图和 Drill-down 功能的 SOC dashboard。
- 具备受控事件模拟和可视化事件时间线的演示模式。
- 包含测试和 Python 编译检查的 CI pipeline。
## 服务
| 服务 | 角色 |
| --- | --- |
| `kafka` | 默认使用的单 broker,用于本地事件流传输。 |
| `redis` | 规则引擎关联窗口的状态存储。 |
| `db` | 用于告警历史的 PostgreSQL 数据库。 |
| `log_collector` | 向 Kafka 生成基准日志事件。 |
| `simulator` | 生成正常流量、突发流量、IOC 和攻击序列。 |
| `rule_engine` | 应用规则、关联、Threat Intelligence 和风险评分。 |
| `alert_sink` | 消费丰富化后的告警并将其持久化到 PostgreSQL 中。 |
| `dashboard_api` | 暴露健康检查、认证、告警和指标 Endpoint。 |
| `dashboard_web` | 由 Nginx 提供服务的静态 SOC dashboard。 |
## 环境要求
- Docker
- Docker Compose
- 用于本地测试的 Python 3.11+
## 本地运行
```
docker compose up -d --build
```
检查容器:
```
docker ps
```
读取最近的日志:
```
docker compose logs --tail=120
```
打开 dashboard:
```
http://localhost:8080
```
## 接口端点
API 基础 URL:
```
http://localhost:5000
```
| 接口端点 | 描述 | 认证 |
| --- | --- | --- |
| `GET /health` | API 和数据库健康检查。 | 无 |
| `POST /auth/token` | 使用旧版 token 签发演示用 JWT。 | 旧版 token |
| `POST /demo/simulate-attack` | 注册受控的演示事件。 | 是 |
| `GET /alertas?range=5m` | 所选时间范围内的告警。 | 是 |
| `GET /alertas?range=1h` | 所选时间范围内的告警。 | 是 |
| `GET /metrics` | 兼容 Prometheus 的指标。 | 是 |
支持的告警时间范围:
- `5m`
- `15m`
- `1h`
- `24h`
## 身份验证
受保护的 Endpoint 接受旧版演示 token:
```
X-SENTINELA-TOKEN: sentinela-demo-token
```
它们也接受 Bearer 认证:
```
Authorization: Bearer sentinela-demo-token
```
或者由 `/auth/token` 签发的 JWT:
```
Invoke-RestMethod `
-Method Post `
-Uri "http://localhost:5000/auth/token" `
-Headers @{ "X-SENTINELA-TOKEN" = "sentinela-demo-token" }
```
相关的环境变量:
```
SENTINELA_API_TOKEN=sentinela-demo-token
SENTINELA_JWT_SECRET=sentinela-demo-jwt-secret
SENTINELA_JWT_TTL_SECONDS=3600
```
为了保持本地演示的兼容性,Dashboard 继续使用旧版 token 头。
## 演示模式
Sentinela SOC 5.6 包含一个直观的事件演示模式,专为演示和面试官审查而设计。
使用方法:
```
docker compose up -d --build
```
打开:
```
http://localhost:8080
```
点击:
```
Simular Ataque
```
Dashboard 将会:
- 高亮显示 `INCIDENTE CRÍTICO EM ANDAMENTO` (正在进行的关键事件)。
- 更新主要卡片。
- 在全局地图上显示动态攻击线。
- 渲染 `Incident Timeline`。
- 展示各个阶段,例如接收到事件、识别可疑 IP、暴力破解检测、YAML 规则匹配、Threat Intelligence 匹配以及 `simulated_block`。
按钮调用的 API Endpoint 为:
```
POST /demo/simulate-attack
```
它与其他受保护的 Endpoint 需要相同的身份验证,并在 PostgreSQL 中记录演示告警。它不会执行防火墙规则、`iptables` 或任何真实的拦截操作。响应动作仅表示为:
```
simulated_block=true
```
## 事件时间线 UX
点击 `Simular Ataque` (模拟攻击) 后,Dashboard 会显示一个具有 SOC 风格的调查时间线,包含七个相连的阶段。该视图突出显示了攻击者、检测序列、规则关联以及安全的响应决策。
`Primary Attacker` (主要攻击者) 卡片总结了:
- 主要攻击者 IP。
- 初始向量。
- 最高严重级别。
- SOC 响应状态。
`Incident Summary` (事件摘要) 为演示、视频和面试提供了简短的叙述。它说明系统检测到了一次受控攻击,关联规则将事件提升至 `CRITICAL` (严重) 级别,并且系统注册了 `simulated_block`,而未进行真实的拦截。
此功能是用于教育和演示的。它旨在展示检测、关联和响应逻辑,同时保持环境的安全。
## Redis 状态存储
规则引擎使用 Redis 按 IP 存储关联窗口:
```
REDIS_URL=redis://redis:6379/0
REDIS_STATE_ENABLED=true
CORRELATION_WINDOW_SECONDS=300
```
如果 Redis 不可用,规则引擎会记录故障并回退到内存状态。这使得演示具有弹性的同时,也展示了预期的生产部署方向。
## 噪声削减与 SOC 关联
Sentinela SOC 5.6 在不删除历史保留记录的情况下,降低了告警 pipeline 中的噪声。
工作原理:
- 具有相同 `ip`、`event_type`、`status`、`port` 和 `threat_category` 的重复告警会被合并。
- 在配置的窗口内多次发出的告警将按 IP 和状态进行速率限制。
- 相关事件在可能的情况下会按 IP 聚合为一个单独的合并告警。
- 告警保留 `first_seen`、`last_seen`、`occurrence_count`、`ports`、`services`、`event_types` 和 `aggregated` 字段。
- Redis 在可用时存储关联状态;如果 Redis 离线,内存回退机制可确保演示继续工作。
重要区别:
- 原始事件仍然是 SIEM 历史记录的一部分。
- 合并后的告警是 Dashboard 使用的视图,旨在加快 SOC 分流速度。
- 演示模式可以通过 `mode=demo` 进行隔离,以便展示内容不会与历史噪声混淆。
## 检测规则
规则配置于:
```
services/rule_engine/rules.yaml
```
支持的字段:
- `name`
- `enabled`
- `priority`
- `description`
- `conditions`
- `threshold`
- `window_seconds`
- `min_risk`
- `risk`
- `status`
- `tags`
规则引擎会忽略被禁用的规则,优先应用高优先级的匹配项,并在 YAML 文件无效时使用安全的回退规则集。
## 模拟拦截
真实的拦截功能仍处于禁用状态:
```
ENABLE_BLOCK=false
```
不会执行任何防火墙、`iptables` 或主机级别的拦截操作。高风险事件会被标记为:
```
simulated_block=true
```
这使得项目在用于演示和作品集审查时保持安全,同时又保留了 SOC 响应的概念。
## 可观测性
API 暴露了 Prometheus 格式的指标:
```
http://localhost:5000/metrics
```
指标包括:
- `sentinela_events_total`
- `sentinela_critical_events_total`
- `sentinela_ioc_events_total`
- `sentinela_events_by_type_total`
参考配置:
```
infra/prometheus/prometheus.yml
```
## Kafka 多 Broker 实验室
为了在本地演示中保持简单和可靠,默认模式仍然使用单个 Kafka broker。
5.6 版本添加了一个教育性质的 Compose Profile:
```
docker compose --profile kafka-lab up -d --build
```
这会启动一个额外的 Kafka broker 服务,用于架构讨论和实验。正常的演示流程并不需要它,也不会改变默认的单 broker 行为。
## 运行测试
安装测试依赖:
```
py -m pip install pytest
py -m pip install -r services/rule_engine/requirements.txt
py -m pip install -r services/dashboard_api/requirements.txt
```
运行:
```
py -m pytest -q
```
编译服务文件:
```
py -m py_compile services\log_collector\main.py services\rule_engine\main.py services\alert-sink\main.py services\dashboard_api\main.py services\simulator\main.py
```
## CI
GitHub Actions 工作流:
```
.github/workflows/ci.yml
```
Pipeline 运行:
- 依赖安装
- Python 编译检查
- `pytest`
## 技术栈
- Python
- Flask
- Kafka
- Redis
- PostgreSQL
- Docker Compose
- Nginx
- HTML, CSS 和 JavaScript
- Chart.js
- Prometheus client 库
- 基于 YAML 的规则
- GitHub Actions
- Pytest
## 技术决策历史
- **4.0:** 可视化 SOC dashboard、攻击地图、本地 Threat Intelligence 和模拟拦截。
- **5.0:** YAML 规则、时间范围、Prometheus 指标和更丰富的分析。
- **5.5:** 生产成熟度改进,包括 API token 认证、文档、可观测性和仓库清理。
- **5.6:** Redis 状态存储、JWT 兼容性、pytest 覆盖率、CI 工作流以及教育性质的 Kafka 多 broker 配置 Profile。
- **5.6 演示模式:** 带有可视化时间线的受控事件模拟;不执行真实的拦截操作。
## 仓库结构
```
services/
alert-sink/
dashboard_api/
dashboard_web/
log_collector/
rule_engine/
simulator/
docs/
infra/
scripts/
tests/
.github/
docker-compose.yml
README.md
.gitignore
```
## 诚实的局限性
- Kafka 在默认情况下仍然作为单 broker 运行。
- 额外的 Kafka broker 是出于教育目的,并非完整的生产集群。
- Redis 提高了关联状态的成熟度,但要实现完整的分布式流处理,还需要更强的分区/状态保证。
- 外部 Threat Intelligence 是为了作品集的安全使用而模拟的。
- JWT 经过刻意简化,适用于演示,而非一个完整的身份平台。
- 没有 RBAC、多租户或生产级别的身份提供商。
- 尚未引入 schema registry 或正式的死信队列。
## 下一步计划
- 添加 schema 验证和死信主题。
- 添加按 IP 或租户的 Kafka 分区策略。
- 添加 Alembic 或其他版本化的迁移工具。
- 为 Kafka lag、Redis 健康状况和处理延迟添加服务级别指标。
- 添加 Grafana Dashboard。
- 添加使用 Docker Compose 的集成测试。
标签:Docker, Docker Compose, GitHub Actions, HTTP/HTTPS抓包, JWT认证, Kafka, PostgreSQL, Python, Redis, SonarQube插件, Splunk替代, URL发现, YAML规则, 事件关联, 事件驱动架构, 云计算, 威胁情报, 安全仪表盘, 安全信息与事件管理, 安全检测, 安全模拟, 安全运营中心, 安全防御评估, 开发者工具, 开源SIEM, 开源框架, 微服务架构, 态势感知, 持续集成, 搜索引擎查询, 搜索引擎爬取, 数据可视化, 无后门, 无线安全, 日志采集, 测试用例, 版权保护, 网络安全, 网络安全教学, 网络映射, 自动化响应, 自动笔记, 自定义请求头, 规则引擎, 逆向工具, 隐私保护