116 lines
3.9 KiB
Markdown
116 lines
3.9 KiB
Markdown
# GoChat 安全审计 Review
|
||
|
||
## 安全基础设施清单
|
||
|
||
| 组件 | 文件 | 行数 | 状态 |
|
||
|------|------|------|------|
|
||
| JWT 安全 | auth/jwt_security.go | - | ✅ 完整 |
|
||
| SSRF 防护 | security/ssrf_protection.go | - | ✅ 完整 |
|
||
| Rate Limiting | middleware/rate_limit.go | - | ✅ 完整 |
|
||
| MFA (TOTP) | auth/mfa.go | 277 | ✅ 完整 |
|
||
| SAML | auth/saml.go | 152 | ⚠️ 验证逻辑 TODO |
|
||
| OAuth | auth/oauth.go | - | ✅ 完整 |
|
||
| Webhook 签名 | security/webhook_signing.go | 425 | ✅ 完整 |
|
||
| 文件上传安全 | middleware/upload_security.go | 231 | ✅ 完整 |
|
||
| ZIP 碎片防护 | middleware/upload_security_zip.go | 68 | ✅ 完整 |
|
||
| XSS 防护 | middleware/xss_protection.go | 279 | ✅ 完整 |
|
||
| 安全头部 | middleware/security_headers.go | 138 | ✅ 已集成 |
|
||
| 数据加密 | security/encryption.go | 252 | ✅ 完整 |
|
||
| SQL 安全 | security/sql_safety.go | 458 | ✅ 完整 |
|
||
| RBAC | auth/policy.go | - | ✅ 完整 |
|
||
| CORS | middleware/cors.go | - | ✅ 完整 |
|
||
| Refresh Token | auth/refresh_token.go | - | ✅ Redis+fallback |
|
||
|
||
## 安全措施详细评估
|
||
|
||
### 1. JWT 安全 ✅
|
||
- HMAC-SHA256 签名
|
||
- Access Token (15min) + Refresh Token (7d)
|
||
- Redis 存储 refresh token(防重放)
|
||
- Claims: user_id, email, type, account_id, custom_role_id
|
||
- Token 撤销支持
|
||
|
||
### 2. SSRF 防护 ✅
|
||
- URL 白名单验证
|
||
- 私有 IP/内部网络检测
|
||
- DNS rebinding 防护
|
||
- URL 重定向跟踪限制
|
||
|
||
### 3. Rate Limiting ✅
|
||
- 基于 IP + 路径的速率限制
|
||
- 可配置窗口和阈值
|
||
- 超限返回 429 Too Many Requests
|
||
- Redis 后端(可选内存后端)
|
||
|
||
### 4. 文件上传安全 ✅
|
||
- MIME 白名单(jpeg/png/gif/pdf/text/mp3/ogg/mp4/zip)
|
||
- 文件大小限制(默认 20MB)
|
||
- 文件名消毒(路径/特殊字符/空字节)
|
||
- 实际 MIME 类型验证(不信任 Content-Type)
|
||
- ZIP 碎片攻击防护(压缩率+条目数检查)
|
||
|
||
### 5. XSS 防护 ✅
|
||
- bluemonday HTML 净化(StrictPolicy + UGCPolicy)
|
||
- JSON 响应 HTML escaping
|
||
- 输入字段自动清洗
|
||
- 空字节和控制字符过滤
|
||
|
||
### 6. 安全头部 ✅ (已集成到 bootstrap)
|
||
- Content-Security-Policy
|
||
- X-Frame-Options: DENY
|
||
- X-Content-Type-Options: nosniff
|
||
- Strict-Transport-Security
|
||
- Referrer-Policy
|
||
- Permissions-Policy
|
||
- Server header 移除
|
||
|
||
### 7. 数据加密 ✅
|
||
- AES-256-GCM 加密/解密
|
||
- 敏感字段自动加密(channel token, API key, webhook secret)
|
||
- EncryptionConfig 管理
|
||
- EncryptField/DecryptField helpers
|
||
|
||
### 8. Webhook 签名 ✅
|
||
- HMAC-SHA256 签名生成和验证
|
||
- 时间戳时效检查(防重放攻击)
|
||
- 多源支持(Meta, Telegram, API channel)
|
||
- 签名格式:`t=<timestamp>,v1=<signature>`
|
||
|
||
### 9. RBAC ✅
|
||
- PermissionMatrix 权限矩阵
|
||
- PolicyContext.Can(action, resource) 权限检查
|
||
- 管理员/super_admin 快速路径
|
||
- 自定义角色权限支持
|
||
- message create 特殊规则(agent 可发消息)
|
||
|
||
### 10. SQL 注入防护 ✅
|
||
- GORM 参数化查询(默认安全)
|
||
- sql_safety.go 审计文档
|
||
- 避免 Raw()/Exec() 直接拼接 SQL
|
||
- 输入验证规范
|
||
|
||
## 安全风险和遗留问题
|
||
|
||
| 风险 | 严重性 | 说明 |
|
||
|------|--------|------|
|
||
| SAML 验证未实现 | 中 | auth/saml.go 有 TODO |
|
||
| Redis 依赖可选 | 低 | Refresh Token 无 Redis 时 fallback 内存 |
|
||
| bcrypt rounds=10 | 低 | 生产建议 rounds=12 |
|
||
| CORS 配置宽松 | 中 | 当前允许所有来源,生产需限制 |
|
||
| Session 管理 | 低 | 纯 JWT 无 server-side session |
|
||
|
||
## 测试覆盖率评估
|
||
|
||
| 模块 | 覆盖率 | 评级 |
|
||
|------|--------|------|
|
||
| pkg/crypto | 87.5% | A |
|
||
| internal/model | 65.8% | B |
|
||
| internal/auth | 17.6% | C |
|
||
| internal/repository | 6.3% | D |
|
||
| internal/service | 0.2% | F |
|
||
| E2E tests | 100% (9/9 PASS) | A |
|
||
|
||
### 需要改进
|
||
- Service 层覆盖率极低(0.2%)— 关键业务逻辑缺少测试
|
||
- Repository 层覆盖率低(6.3%)— 数据访问需要验证
|
||
- Auth 层覆盖率中等(17.6%)— RBAC/MFA 需更多测试 |