gururajseethur/SentinelMesh_Zero-Trust-CTI-Gateway
GitHub: gururajseethur/SentinelMesh_Zero-Trust-CTI-Gateway
零信任威胁情报平台,实现边缘策略执行和数据验证。
Stars: 0 | Forks: 0
# SentinelMesh
→ tisp-proxy
6. tisp-proxy fetches public key from JWKS endpoint
7. jwt.verify(): algorithm=RS256, iss, aud, exp all enforced
8. On pass: proxy injects upstream API key and forwards request
9. On fail (tampered / expired / wrong issuer): 401, request dropped
10. Refresh timer fires at 55s — proactive token renewal before exp
```
## 安全模型
### 零信任执行
- **强制启动验证** — 如果缺少`KEYCLOAK_URL`、`KEYCLOAK_REALM`或`KEYCLOAK_CLIENT_ID`,代理将调用`process.exit(1)`。没有回退模式,没有可选验证,没有降级状态。
- **无条件JWT验证** — 每个对`/proxy/*`的请求都会调用`await verifyJWT(token)`。该调用没有条件守卫;不能跳过。
- **算法锁定** — `algorithms: ['RS256']`是明确的。HS256(对称的,没有私钥就无法伪造)在库级别被拒绝。
- **全面声明执行** — 验证`iss`、`aud`和`exp`。来自正确发行者的过期令牌失败。来自恶意发行者的有效令牌失败。
- **JWKS故障时关闭** — 如果JWKS端点不可达,每个请求都会返回401。没有请求到达上游密钥库。
### 多层防御
| 层 | 控制 |
|---|---|
| 网络 | 端口3001未发布到主机NIC;仅内部Docker DNS |
| TLS边缘 | Nginx终止HTTPS;服务在内部网络上通信 |
| 认证 | Keycloak OIDC、PKCE S256、`login-required`在加载时 |
| 授权 | RBAC:领域角色+客户端角色合并,按路由保护器 |
| API密钥隔离 | 代理环境中的服务凭证;永远不会在浏览器捆绑包或`VITE_*`变量中 |
| 速率限制 | 在任何路由处理程序之前,每15分钟每IP 100个请求 |
| 内容安全策略 | `script-src 'self'`、`frame-ancestors 'none'`、脚本上没有`unsafe-inline` |
### 验证攻击面(在CI中自动化)
| 攻击 | 结果 |
|---|---|
| 过期JWT | 401 — `jwt expired` |
| 错误发行者 | 401 — `jwt issuer invalid` |
| 修改RS256签名 | 401 — `invalid signature` |
| HS256算法替换 | 401 — `Malformed JWT: missing kid header` |
| 空的/ null /未定义的令牌 | 401 — `Missing bearer token` |
| 结构上无效的字符串 | 401 — `Malformed JWT` |
| JWKS端点不可达 | 401 — `Unable to retrieve signing key` |
## 存储库结构
```
tisp-nexus/
├── tisp-command-center/ # React SPA (dashboard + auth)
│ ├── src/auth/ # Keycloak adapter, AuthContext, ProtectedRoute
│ ├── src/components/ # Per-service nodes, Sidebar, Overview
│ ├── src/lib/ # platformAPI (sim + live modes), adversarial tests
│ └── src/state/ # PlatformContext (polling, exponential backoff)
│
├── tisp-proxy/ # Node.js API key vault
│ ├── src/server.js # Express, rate limiter, mandatory JWT enforcement
│ ├── src/verify-jwt.js # JWKS-backed RS256 verifier factory
│ └── src/verify-jwt.test.js # 7 self-contained cryptographic security tests
│
├── tisp-infra/ # Docker Compose stack
│ ├── docker-compose.yml # Base: all services, proxy not host-exposed
│ ├── docker-compose.prod.yml # Prod overlay: Nginx TLS, port reset
│ ├── docker-compose.dev.yml # Dev overlay: 127.0.0.1:3001 only
│ └── nginx/ # Reverse proxy config with CSP
│
├── tisp-tools/ # Node.js CTI utilities (zero runtime dependencies)
│ └── src/ # IOC normalizer, STIX 2.1 bundler, pattern detector
│
├── docs/ # Architecture docs, runbooks, compliance checklists
└── submission/ # Deliverables, screenshots, reports
```
## 技术栈
| 组件 | 技术 |
|---|---|
| 前端 | React 19、Vite 8、Tailwind CSS 4、React Router 7、Recharts、Framer Motion |
| 认证 | Keycloak 24、keycloak-js、OIDC / PKCE S256 |
| API密钥库 | Node.js 22、Express 4、jwks-rsa、jsonwebtoken |
| CTI平台 | MISP最新版、OpenCTI 6、TheHive 5 |
| 自动化 | n8n(自托管) |
| 可观察性 | Grafana、Elasticsearch + Kibana |
| 基础设施 | Docker Compose、Nginx、PostgreSQL、MinIO、RabbitMQ |
| CI | GitHub Actions — lint、build、25个单元测试、Playwright端到端测试 |
## 设置
### 先决条件
- Docker Desktop ≥ 4.28与Compose v2
- Node.js 22+
- 16 GB RAM(全栈)/ 8 GB(仪表板演示仅限)
### 仪表板演示(无需Docker)
```
cd tisp-command-center
npm ci
npm run dev
```
在模拟模式下打开于`http://localhost:5173` — 所有数据都是合成的,不需要外部服务。演示了完整的UI、RBAC门控路由和带有模拟Keycloak状态的认证流程。
### 使用真实认证运行
仪表板有两种模式:
| 模式 | 工作原理 | 何时使用 |
|---|---|---|
| **模拟** | 认证上下文是模拟的。所有API数据都是合成的。不需要Keycloak。 | 演示、评分、本地开发 |
| **实时(OIDC)** | Keycloak PKCE S256登录流程。JWT由代理通过JWKS按请求验证。 | 全栈、生产 |
**要启用真实Keycloak认证,请在启动仪表板之前设置以下变量**:
```
# tisp-command-center/.env.local
VITE_KEYCLOAK_URL=http://localhost:8080
VITE_KEYCLOAK_REALM=tisp
VITE_KEYCLOAK_CLIENT_ID=tisp-dashboard
VITE_API_BASE_URL=http://localhost:3001
```
以及启动代理之前:
```
# tisp-proxy 环境(或 tisp-infra/.env)
KEYCLOAK_URL=http://keycloak:8080
KEYCLOAK_REALM=tisp
KEYCLOAK_CLIENT_ID=tisp-dashboard
MISP_URL=https://misp:443
MISP_API_KEY=
OPENCTI_URL=http://opencti:4000
OPENCTI_TOKEN=
THEHIVE_URL=http://thehive:9000
THEHIVE_API_KEY=
```
如果缺少`KEYCLOAK_URL`、`KEYCLOAK_REALM`或`KEYCLOAK_CLIENT_ID`,代理将拒绝启动(`process.exit(1)`)——没有不安全的回退。
在模拟模式下,仪表板UI中的`LabWarningBanner`会明确显示模式。侧边栏在用户页脚中显示“模拟模式”。真实模式显示已认证用户的名字和Keycloak角色。
### 全栈
```
cd tisp-infra
cp .env.example .env
# 替换占位符密钥 — 查看 .env.example
docker compose --env-file .env up -d
```
### 运行安全测试
自包含 — 不需要实时Keycloak或网络访问:
```
cd tisp-proxy
npm ci && npm test
```
### 在本地运行所有CI检查
```
cd tisp-command-center && npm run lint && npm run build && npm test
cd ../tisp-proxy && npm test
cd ../tisp-tools && npm test
```
## 已知限制
实验室构建的有意范围决策:
| 限制 | 生产路径 |
|---|---|
| Nginx中的`proxy_ssl_verify off` — 上游服务使用自签名证书 | 私有CA;挂载CA捆绑包;设置`proxy_ssl_trusted_certificate` |
| 单实例Keycloak — SPOF | 外部PostgreSQL集群+ KC会话复制 |
| 进程内速率限制 — 重置重启,不在副本之间共享 | Redis支持的速率限制(`rate-limit-redis`) |
| 没有令牌撤销检查 — 代理只信任`exp` | 在敏感操作上使用Keycloak令牌内省端点 |
| Keycloak中可用但未强制执行策略的多因素认证 | 需要OTP的所有领域用户的认证流程 |
## 合规性映射
| 标准 | 实现 |
|---|---|
| GDPR数据最小化 | 在`tisp-tools/src/anonymize.mjs`中对IOC进行匿名化 |
| ISO 27001 A.9 — 访问控制 | Keycloak RBAC与最小权限角色分配 |
| NIST CSF保护/检测 | Keycloak会话审计+ Grafana仪表板 |
| STIX 2.1 / TAXII | `tisp-tools/src/stix-bundler.mjs`生成符合规范的捆绑包 |
完整文档:`docs/`和`submission/deliverables/`。
## CI管道
| 作业 | 检查 |
|---|---|
| `dashboard` | lint、build、25个单元测试、Playwright端到端测试 |
| `security` | 7个加密JWT安全测试(自包含,无需KC) |
| `tools` | CTI实用程序正确性 — IOC标准化、STIX输出形状 |
| `infra` | `docker compose config`用于基本和prod覆盖 |
## 作业覆盖范围
请参阅`docs/PROJECT_COMPLETION_MATRIX.md`,以查看Spinnaker项目任务直接映射到存储库工件。
提交成果(DOCX、证据截图、测试报告)位于`submission/`。
标签:API安全, CIDR查询, GNU通用公共许可证, JSONLines, JSON输出, JWT验证, Keycloak, meg, MITM代理, Node.js, OIDC认证, OpenCTI, React, STIX 2.1, Streamlit, Syscalls, TheHive, Vite, 信息安全, 威胁情报, 威胁情报共享, 安全合规, 安全架构, 安全演示, 安全网关, 安全蓝图, 安全认证, 安全项目, 开发者工具, 政策执行, 数据可信度, 网络代理, 网络安全, 自定义脚本, 角色访问控制, 访问控制, 请求拦截, 边缘安全, 隐私保护, 零信任