Abhishek-yadav04/Obsidian-Sentinel-WAF
GitHub: Abhishek-yadav04/Obsidian-Sentinel-WAF
Obsidian Sentinel WAF是一款基于Go语言的企业级Web应用防火墙,提供全面的安全防护。
Stars: 0 | Forks: 0
# OBSIDIAN Sentinel WAF
### 企业版 • v2.2.4
具备高级安全功能的企业级Web应用防火墙
基于 Coraza v3 引擎 | 实时保护 | 零信任架构 | GeoIP 阻止 | 高级分析
功能 •
快速入门 •
架构 •
API •
部署 •
安全
## 概述
**Obsidian Sentinel** 是一款企业级Web应用防火墙,提供全面保护,抵御高级网络威胁。它结合了经过实战检验的 Coraza WAF 引擎和先进的 企业级功能,包括 GeoIP 阻止、高级速率限制、威胁情报、Webhook 告警和复杂的分析。
## 为什么选择 Obsidian?
- **零信任安全**
实现了 HMAC-SHA256 JWT 认证、基于角色的访问控制 (RBAC)、CSRF 保护以及加密令牌验证。
- **高性能架构**
采用并发安全组件、优化内存分配和 256 级联速率限制引擎,以实现低延迟请求处理。
- **实时监控与可见性**
提供由 WebSocket 驱动的实时仪表板,包括实时分析、攻击遥测和威胁可视化。
- **高级威胁情报**
与 Spamhaus、Emerging Threats、FireHOL 和自定义情报源集成,检测和阻止 2000 多个已知威胁。
- **GeoIP 访问控制**
通过 MaxMind GeoIP 集成支持基于国家的过滤和风险感知请求评估。
- **企业级告警系统**
包括 Slack、Microsoft Teams、Discord 和 PagerDuty 的 Webhook 集成,具有可配置的基于严重性的告警路由。
- **全面的分析与审计**
具备 PostgreSQL 支持的审计日志、安全事件跟踪、合规性可见性和管理报告功能。
- **现代管理界面**
响应式 Bootstrap 5 仪表板,支持暗色主题和跨设备兼容性,用于运营管理。
- **单二进制部署**
作为自包含的二进制文件提供,可选支持 Redis 和 PostgreSQL 以实现企业级部署。
## 功能
### 核心安全功能
| 功能 | 描述 |
|---------|-------------|
| **59+ 高级 WAF 规则** | 防护 XSS、SQLi、RCE、LFI、RFI、SSRF、XXE、SSTI、LDAP 注入 |
| **JWT 认证** | 可配置过期和刷新的 HMAC-SHA256 签名令牌 |
| **高级 RBAC** | 基于角色的访问控制 (Admin、Analyst、Viewer) 具有细粒度权限 |
| **256 级联速率限制** | 高性能滑动窗口,支持 Redis 集群 |
| **多源威胁情报** | 来自 Spamhaus、Emerging Threats、Firehol (2000+ 威胁) 的实时保护 |
| **GeoIP 阻止** | 基于 MaxMind 数据库和风险评分的基于国家的保护 |
| **CSRF 保护** | 基于令牌的跨站请求伪造预防 |
| **安全头部** | CSP、HSTS、X-Frame-Options、X-Content-Type-Options |
### 企业级功能
| 功能 | 描述 |
|---------|-------------|
| **PostgreSQL 集成** | 企业级数据持久性和分析 |
| **Redis 集群** | 分布式速率限制和会话管理 |
| **HIBP 密码检查** | 使用 Have I Been Pwned 进行实时密码泄露验证 |
| **响应体 DLP** | HTTP 响应中敏感信息的防数据泄露 |
| **GraphQL 安全分析器** | 可配置限制的高级 GraphQL 查询分析 |
| **缓存统计仪表板** | 实时缓存性能指标和管理 |
| **速率限制重置控制** | 速率限制管理的管理控制 |
| **玻璃形态 UI** | 具有玻璃形态效果和增强用户体验的现代仪表板 |
| **密码强度计** | 带有视觉反馈的实时密码验证 |
| **Webhook 告警** | 实时通知 Slack、Teams、Discord、PagerDuty |
| **管理报告** | 带有图表和威胁分析的 PDF/Excel 报告 |
| **全面的审计** | 完整的安全事件跟踪,使用 PostgreSQL 存储 |
| **WebSocket 实时** | 无轮询开销的实时仪表板更新 |
| **高级分析** | 请求模式、地理分布、威胁相关性 |
| **多租户支持** | 管理员、安全分析师和只读查看器角色 |
| **健康与指标** | 兼容 Prometheus 的指标和 Kubernetes 准备就绪的健康检查 |
| **请求 ID 跟踪** | 事件响应的端到端请求跟踪 |
### 受保护攻击类别
- 跨站脚本 (XSS)
- SQL 注入 (SQLi)
- 远程代码执行 (RCE)
- 本地文件包含 (LFI)
- 远程文件包含 (RFI)
- 服务器端请求伪造 (SSRF)
- XML 外部实体 (XXE)
- 模板注入 (SSTI)
- LDAP 注入
- 会话固定
- Java/反序列化攻击
## 快速入门
### 先决条件
- Go 1.23+(或 TinyGo 用于 WASM 构建)
- Windows、Linux 或 macOS
- **可选企业级功能:**
- PostgreSQL 12+(用于高级分析和审计日志)
- Redis 6+(用于分布式速率限制和集群)
- MaxMind GeoIP2 数据库(用于基于国家的阻止)
### 构建 & 运行
```
# 克隆仓库
git clone https://github.com/Abhishek-yadav04/Obsidian.git
cd obsidian
# 安装依赖
go mod tidy
# 选项 1:直接使用 Go 运行(推荐用于开发)
go run ./cmd/obsidian
# 选项 2:构建并运行可执行文件
cd cmd/obsidian
go build -o obsidian.exe .
./obsidian.exe
# 使用自定义端口运行
go run ./cmd/obsidian -port 8082
# 以开发模式运行并启用调试日志
go run ./cmd/obsidian -port 8082 -dev
# 使用 PostgreSQL 和 Redis(企业模式)运行
export DATABASE_URL="postgres://user:pass@localhost/obsidian"
export REDIS_URL="redis://localhost:6379"
export OBSIDIAN_JWT_SECRET="your-very-secure-jwt-secret-here-at-least-32-chars"
go run ./cmd/obsidian -port 8082
```
### 访问仪表板
打开浏览器,导航到:**http://localhost:8082**
**默认凭据(立即在生产环境中更改):**
| 角色 | 用户名 | 密码 |
|------|----------|----------|
| Admin | `admin` | `ObsidianAdmin#2024` |
| Analyst | `analyst` | `ObsidianAnalyst#2024` |
| Viewer | `viewer` | `ObsidianViewer#2024` |
**角色权限:**
- **Admin**:完全访问(规则、威胁、用户、审计日志、设置)
- **Analyst**:只读安全数据 + 报告导出
- **Viewer**:只读仪表板和日志
## 架构
```
┌─────────────────────────────────────────────────────────────────┐
│ Client Request │
└─────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ Security Headers Middleware │
│ (CSP, X-Frame-Options, X-Content-Type-Options) │
└─────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ Rate Limiter Middleware │
│ (Sliding Window, Per-IP Tracking) │
└─────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ Threat Intelligence Check │
│ (Spamhaus DROP, Emerging Threats, Custom Lists) │
└─────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ Coraza WAF Engine │
│ (55+ ModSecurity Rules) │
└─────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ Application Router │
│ (API Handlers, Static Files) │
└─────────────────────────────────────────────────────────────────┘
```
### 项目结构
```
obsidian/
├── cmd/obsidian/ # Main application entry point
│ ├── main.go # Server initialization and routing
│ └── ui/ # Embedded frontend assets
│ ├── index.html # Main dashboard (dark theme)
│ ├── login.html # Authentication page
│ ├── js/app.js # Frontend application logic
│ ├── css/styles.css # Enterprise dark theme styling
│ └── assets/ # Static assets (logo, icons)
├── internal/app/ # Core application packages
│ ├── alerts/ # Webhook alert management
│ ├── auth/ # JWT authentication & RBAC
│ ├── geoip/ # Geographic IP blocking service
│ ├── logging/ # Structured logging (Zap)
│ ├── metrics/ # Prometheus-compatible metrics
│ ├── ratelimit/ # 256-shard rate limiter
│ ├── report/ # PDF/Excel report generation
│ ├── security/ # Security middleware & headers
│ ├── store/ # Data persistence (PostgreSQL/memory)
│ ├── threatintel/ # Threat intelligence feeds
│ └── tracing/ # Request ID tracing
├── migrations/ # Database migration scripts
│ ├── 000001_initial_schema.up.sql
│ └── 000001_initial_schema.down.sql
├── configs/ # Configuration files
│ └── config.yaml # Default configuration
└── testing/ # Test suites and benchmarks
├── e2e/ # End-to-end integration tests
├── performance/ # Load testing scenarios
└── testdata/ # Test fixtures and data
```
## 配置
### 环境变量
| 变量 | 描述 | 默认 | 必需 |
|----------|-------------|---------|----------|
| `OBSIDIAN_JWT_SECRET` | JWT 签名密钥(最小 32 个字符) | 随机(开发环境) | **是(生产环境)** |
| `OBSIDIAN_ENV` | 环境(开发/生产) | development | 否 |
| `OBSIDIAN_ALLOWED_ORIGINS` | 以逗号分隔的 WebSocket 原始地址 | localhost:8082 | 否 |
| `DATABASE_URL` | PostgreSQL 连接字符串 | None | **是** |
| `REDIS_URL` | Redis 连接字符串 | None | 否 |
| `GEOIP_DATABASE_PATH` | MaxMind GeoIP2 数据库的路径 | None | 否 |
| `SUPABASE_URL` | Supabase 项目 URL(用于 OAuth) | None | 否(用于 OAuth) |
| `SUPABASE_KEY` | Supabase 匿名/公开密钥 | None | 否(用于 OAuth) |
| `LOG_LEVEL` | 日志级别(debug、info、warn、error) | info | 否 |
| `LOG_FORMAT` | 日志格式(json、console) | json | 否 |
| `OBSIDIAN_CRS_ENABLED` | 启用 OWASP CRS 加载 | false | 否 |
| `OBSIDIAN_CRS_PATH` | CRS 根目录的文件系统路径 | None | 否 |
| `OBSIDIAN_CRS_MODE` | CRS 引擎模式(DetectionOnly/On) | DetectionOnly | 否 |
| `OBSIDIAN_CRS_FAIL_OPEN` | 如果 CRS 加载失败则继续启动 | false | 否 |
| `OBSIDIAN_WAF_CUSTOM_RULES` | Obsidian 自定义规则文件的路径 | rules/obsidian-custom.conf | 否 |
### OWASP CRS(外部规则集)
Obsidian 在运行时加载 OWASP CRS 作为外部规则集。CRS 文件不包含在此存储库中。要启用 CRS,将官方 CRS 文件放置在磁盘上,并将 `OBSIDIAN_CRS_PATH` 指向包含 `crs-setup.conf` 和 `rules/` 目录的 CRS 根目录。
### 命令行标志
```
./obsidian.exe [options]
Options:
-port int Port to run the server on (default 8082)
-dev Run in development mode (relaxed security)
-log-level Override LOG_LEVEL env var
-log-format Override LOG_FORMAT env var
```
### 样本 .env 文件
```
# ⚠️ 永远不要将此文件提交到版本控制
# 复制到 .env 并根据您的环境进行自定义
# JWT 认证(生产环境必需 - 至少 32 个字符)
OBSIDIAN_JWT_SECRET=your-super-secure-random-secret-minimum-32-chars
# 环境
OBSIDIAN_ENV=production
# PostgreSQL 数据库(必需)
DATABASE_URL=postgresql://obsidian:secure_password@localhost:5432/obsidian?sslmode=require
# Redis 缓存(可选 - 启用分布式速率限制)
REDIS_URL=redis://localhost:6379/0
# 对于 TLS:REDIS_URL=rediss://user:pass@host:port/0
# 通过 Supabase 进行 OAuth(可选 - 启用 Google/GitHub 登录)
SUPABASE_URL=https://your-project.supabase.co
SUPABASE_KEY=your-anon-public-key
# WebSocket 原点(为您的主域自定义)
OBSIDIAN_ALLOWED_ORIGINS=https://your-domain.com
# GeoIP 数据库(可选)
GEOIP_DATABASE_PATH=/opt/maxmind/GeoLite2-Country.mmdb
# 日志
LOG_LEVEL=info
LOG_FORMAT=json
# OWASP CRS(外部规则集)
OBSIDIAN_CRS_ENABLED=false
OBSIDIAN_CRS_PATH=/opt/owasp-crs
OBSIDIAN_CRS_MODE=DetectionOnly
OBSIDIAN_CRS_FAIL_OPEN=false
OBSIDIAN_WAF_CUSTOM_RULES=rules/obsidian-custom.conf
```
### 生产部署清单
- [ ] 设置 `OBSIDIAN_JWT_SECRET`(32 个以上随机字符)
- [ ] 设置 `OBSIDIAN_ENV=production`
- [ ] 配置 PostgreSQL 使用 SSL (`sslmode=require`)
- [ ] 立即更改所有默认用户密码
- [ ] 配置适当的 `OBSIDIAN_ALLOWED_ORIGINS`
- [ ] 设置 Redis 以实现分布式速率限制
- [ ] 如有需要,启用 GeoIP 阻止
- [ ] 配置反向代理(nginx/Caddy)使用 TLS
- [ ] 设置日志聚合
- [ ] 配置告警 Webhook
## API 参考
### 认证
#### POST /api/login
进行认证并接收 JWT 令牌。
**请求:**
```
{
"username": "admin",
"password": "password"
}
```
**响应:**
```
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"refresh_token": "...",
"user": {
"id": 1,
"username": "admin",
"role": "Admin"
},
"expires_in": 900
}
```
### 受保护端点(需要 Bearer 令牌)
#### 核心安全 API
| 端点 | 方法 | 描述 | 必需角色 |
|----------|--------|-------------|---------------|
| `/api/stats` | GET | 带地理数据的仪表板统计信息 | Viewer |
| `/api/logs` | GET | 带分页的安全事件日志 | Viewer |
| `/api/rules` | GET | WAF 规则列表(59 个规则) | Viewer |
| `/api/rules/create` | POST | 创建新的 WAF 规则 | Admin |
| `/api/rules/update` | PUT | 更新现有规则 | Admin |
| `/api/rules/delete` | DELETE | 根据 ID 删除规则 | Admin |
| `/api/threats` | GET | 威胁情报数据(2000 多个威胁) | Viewer |
| `/api/threats/block` | POST | 阻止 IP 地址 | Admin |
#### 企业分析 API
| 端点 | 方法 | 描述 | 必需角色 |
|----------|--------|-------------|---------------|
| `/api/metrics` | GET | 系统和安全指标 | Viewer |
| `/api/geoip/lookup` | GET | 任何 IP 的 GeoIP 查找 | Viewer |
| `/api/geoip/blocked` | GET/POST/DELETE | 管理阻止国家 | Admin |
| `/api/geoip/metrics` | GET | GeoIP 服务统计信息 | Viewer |
| `/api/ratelimit/blacklist` | POST/DELETE | 管理 IP 黑名单 | Admin |
| `/api/ratelimit/whitelist` | POST/DELETE | 管理IP白名单 | Admin |
#### 告警和集成 API
| 端点 | 方法 | 描述 | 必需角色 |
|----------|--------|-------------|---------------|
| `/api/alerts/webhooks` | GET/POST/DELETE | 管理Webhook集成 | Admin |
| `/api/alerts/webhooks/test` | POST | 测试 Webhook 配置 | Admin |
| `/api/export` | GET | 导出安全报告(PDF/Excel) | Analyst |
| `/api/admin/users` | GET | 用户管理 | Admin |
| `/api/admin/audit` | GET | 完整的审计日志 | Admin |
### 健康检查
#### GET /api/health
返回全面的系统健康状态。
"note": "请参阅此 README 中的 CI / 发布部分,了解如何构建发布以及如何从 GHCR 拉取官方 Docker 镜像。"
```
---
## CI / 发布
Releases are performed by the repository GitHub Actions workflows. Key points:
- The CI pipeline builds and tests the project, runs linting, security scans, and produces artifacts (platform binaries).
- A separate Docker job builds multi-arch images and pushes them to GitHub Container Registry (GHCR) under `ghcr.io/
/:`.
- The release job packages artifacts and creates a GitHub Release. The workflow also verifies the pushed Docker image by attempting to `docker pull` the released image during the release job.
- An SBOM (CycloneDX JSON) is generated and attached to the release artifacts.
How to pull the official release image from GHCR:
```bash
# 认证到 GHCR(使用具有适当权限的个人访问令牌)
echo "${GHCR_TOKEN}" | docker login ghcr.io -u --password-stdin
# 拉取给定标签的镜像(例如:v2.2.4)
docker pull ghcr.io//:v2.2.4
```
如果您遇到发布或 CI 的问题,请检查 `.github/workflows/ci.yml` 和 `.github/workflows/release.yml` 以获取构建期间执行的精确步骤。
{ "status": "healthy", "uptime": "2h30m15s", "version": "2.1.0", "edition": "Enterprise", "name": "Obsidian Sentinel WAF", "features": { "waf_engine": true, "threat_intelligence": true, "rate_limiting": true, "geoip_blocking": true, "webhook_alerts": true, "postgresql": true, "redis": true, "advanced_analytics": true }, "stats": { "total_requests": 15432, "blocked_requests": 127, "active_threats": 2041, "blocked_countries": 3 } }
```
---
## 安全
### JWT 令牌安全
- Tokens signed with HMAC-SHA256
- Configurable expiration (default: 15 minutes)
- Refresh token rotation
- Secrets stored in environment variables
- Constant-time signature comparison
- Role-based claims validation
### 高级速率限制
- 256-shard sliding window algorithm
- Redis-backed distributed limiting
- Per-IP and per-endpoint tracking
- Configurable limits:
- 200 requests/minute general
- 5 login attempts/minute
- Custom thresholds per endpoint
- Whitelist/blacklist IP management
- Geographic rate limiting
### 威胁情报来源
- **Spamhaus DROP/EDROP** - 800+ malicious networks
- **Emerging Threats** - 1000+ compromised IPs
- **Firehol Level 1** - 200+ high-confidence threats
- **Custom feeds** - User-defined blocklists
- **GeoIP risk scoring** - Country-based threat assessment
- **Real-time updates** - Feeds refreshed every 4 hours
### GeoIP 安全
- MaxMind GeoIP2 database integration
- Country-based blocking/allowing
- Risk score calculation
- VPN/Proxy/Tor detection
- Threat score based on geography
- Custom country rules with reasons
### 安全头
```
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block
Referrer-Policy: strict-origin-when-cross-origin
Content-Security-Policy: default-src 'self'; ...
```
---
## 部署
### Docker(推荐)
#### 简单部署
```dockerfile
FROM golang:1.22-alpine AS builder
WORKDIR /app
COPY . .
RUN cd cmd/obsidian && go build -o obsidian .
FROM alpine:latest
RUN apk --no-cache add ca-certificates tzdata
WORKDIR /app
COPY --from=builder /app/cmd/obsidian/obsidian .
EXPOSE 8082
CMD ["./obsidian", "-port", "8082"]
```
#### Docker Compose(存储库标准)
使用已签入的 `docker-compose.yml` 和以下其中一个环境模板:
- `.env.docker.example` 用于本地 postgres + redis 容器
- `.env.external.example` 用于托管/外部 DB + Redis
```
# 内部 postgres + redis
cp .env.docker.example .env.docker
docker compose --env-file .env.docker up -d --build
# 外部托管服务
cp .env.external.example .env.external
docker compose --env-file .env.external up -d --build
```
注意:
- 对于 Compose 网络连接,请使用服务名称(`postgres`、`redis`)在 URL 中,而不是 `localhost`。
- `.env` 用于本地 `go run` 工作流程;对于 Docker 发布/部署,请首选专用环境文件。
- `OBSIDIAN_JWT_SECRET` 是必需的,并且必须针对每个环境进行设置。
### Kubernetes
### Systemd 服务
```
[Unit]
Description=Obsidian Sentinel WAF
After=network.target
[Service]
Type=simple
User=obsidian
WorkingDirectory=/opt/obsidian
Environment=OBSIDIAN_JWT_SECRET=your-secret-here
ExecStart=/opt/obsidian/obsidian -port 8082
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
```
## 文档
| 文档 | 描述 |
|----------|-------------|
| [贡献指南](CONTRIBUTING.md) | 如何为项目做出贡献 |
| [安全策略](SECURITY.md) | 如何报告漏洞 |
| [许可](LICENSE) | Apache 2.0 许可证 |
## 测试
### 运行测试
```
go test ./... -v
```
### 运行覆盖率测试
```
go test ./... -cover -coverprofile=coverage.out
go tool cover -html=coverage.out
```
### 测试 WAF 规则
```
# 测试 XSS 阻断
curl -X GET "http://localhost:8082/api/test?input="
# 测试 SQL 注入阻断
curl -X GET "http://localhost:8082/api/test?id=1' OR '1'='1"
```
## 监控
### 指标端点
`GET /api/metrics` 返回全面的系统指标:
```
{
"total_requests": 25432,
"blocked_requests": 327,
"uptime_seconds": 172800,
"memory_alloc_mb": 65,
"memory_sys_mb": 128,
"goroutines": 23,
"rate_limiter": {
"active_visitors": 15,
"blacklist_count": 5,
"whitelist_count": 10,
"rate_limited_ips": 3,
"requests_per_minute": 200,
"shards": 256,
"total_allowed": 25105,
"total_blocked": 327
},
"threat_intel": {
"total_threats": 2041,
"feeds_active": 4,
"last_update": "2026-02-01T14:30:00Z",
"blocked_today": 127,
"high_risk_count": 1205
},
"geoip": {
"blocked_countries": 3,
"total_lookups": 15432,
"cache_hits": 12890,
"cache_misses": 2542
},
"webhooks": {
"active_webhooks": 2,
"alerts_sent_today": 15,
"alerts_failed": 1
}
}
```
### WebSocket 实时更新
连接到 `ws://localhost:8082/api/ws?token=` 以获取实时统计更新。
## 贡献
1. 分叉存储库
2. 创建您的功能分支(`git checkout -b feature/amazing-feature`)
3. 提交您的更改(`git commit -m 'Add amazing feature'`)
4. 推送到分支(`git push origin feature/amazing-feature`)
5. 提交拉取请求
请参阅 [CONTRIBUTING.md](CONTRIBUTING.md) 以获取详细指南。
## 许可证
本项目采用 Apache 2.0 许可证 - 请参阅 [LICENSE](LICENSE) 文件以获取详细信息。
## 致谢
Obsidian Sentinel WAF 是基于标签:Coraza, CSRF 保护, DNS解析, DNS通配符暴力破解, EVTX分析, GeoIP 阻断, Go 语言, JWT 认证, RBAC, Web 应用防火墙, 企业应用, 企业级安全, 加密令牌验证, 威胁情报, 安全响应, 安全策略, 安全防护, 实时分析, 并发架构, 开发者工具, 开源项目, 提示词设计, 搜索引擎查询, 日志审计, 测试用例, 网络安全, 自动化扫描, 隐私保护, 零信任架构