merge: SQL平台代码v1 优化包合并 — 193条审核规则 + 16页面UI优化
后端新增 (Step 1): - mysql_audit_rules.py: 63条 MySQL审核规则 (DDL 36 + DML 9 + 命名 5 + 性能 5 + 安全 5) - redis_audit_rules.py: 43条 Redis审核规则 (KEY管理 10 + 命令安全 12 + 数据结构 8 + 性能 8 + 安全 5) - mongodb_audit_rules.py: 42条 MongoDB审核规则 (集合管理 + 查询安全 + 聚合管道 + 写入安全 + 性能) - postgres_audit_rules.py: 45条 PostgreSQL审核规则 (DDL 18 + DML 8 + DQL 6 + 安全 6 + 性能 7) 后端合并 (Step 2): - audit_engine_v2.py: 新增4个DB规则模块import (100+→200+规则) - audit_rule_seeds.py: 新增30条MongoDB种子规则 + 别名映射 - audit_rule.py: 新增数据库类型别名 (postgresql→postgres, pg→postgres, mongo→mongodb) 前端优化 (Step 4) — 16页面全覆盖: - InstancePage, WorkflowPage, TicketsPage, TicketCreatePage, TicketDetailPage - UsersPage, SlowQueryPage, DataDictionaryPage, Dashboard - InstanceGroupPage, AuditLogsPage, QueriesPage, AuditRulesPage, RolesPage - useAuth.tsx, SqlEditor.tsx 后端测试 895/895 通过, 前端 tsc --noEmit 通过
This commit is contained in:
1 parent
e1ba8b3327
commit
58eb78c987
24 files changed
+16333
-2225
No files matched your search
@@ -31,7 +31,10 @@ async def list_audit_rules(
|
||||
if severity:
|
||||
stmt = stmt.where(AuditRule.severity == severity)
|
||||
if db_type:
|
||||
stmt = stmt.where((AuditRule.db_type == db_type) | (AuditRule.db_type == "all"))
|
||||
# 支持类型别名: postgresql -> postgres, mongo -> mongodb
|
||||
db_type_aliases = {"postgresql": "postgres", "pg": "postgres", "mongo": "mongodb"}
|
||||
resolved = db_type_aliases.get(db_type.lower(), db_type.lower())
|
||||
stmt = stmt.where((AuditRule.db_type == resolved) | (AuditRule.db_type == db_type) | (AuditRule.db_type == "all"))
|
||||
if is_enabled is not None:
|
||||
stmt = stmt.where(AuditRule.is_enabled == is_enabled)
|
||||
|
||||
@@ -80,8 +83,23 @@ async def seed_audit_rules(
|
||||
db: AsyncSession = Depends(get_db),
|
||||
current_user: User = Depends(require_role("admin")),
|
||||
):
|
||||
"""批量初始化预设审核规则种子数据。"""
|
||||
"""批量初始化预设审核规则种子数据。
|
||||
|
||||
支持4种数据库类型:
|
||||
- mysql: MySQL 专用规则 (60+ 条)
|
||||
- postgres: PostgreSQL 专用规则 (45+ 条)
|
||||
- redis: Redis 专用规则 (43+ 条)
|
||||
- mongodb: MongoDB 专用规则 (42+ 条)
|
||||
"""
|
||||
db_type_lower = db_type.lower()
|
||||
# 别名映射
|
||||
db_type_aliases = {
|
||||
"postgresql": "postgres",
|
||||
"pg": "postgres",
|
||||
"mongo": "mongodb",
|
||||
}
|
||||
db_type_lower = db_type_aliases.get(db_type_lower, db_type_lower)
|
||||
|
||||
if db_type_lower not in SEED_RULES_MAP:
|
||||
raise HTTPException(
|
||||
status_code=400,
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
"""SQL 审核引擎 V2 — 可配置规则引擎,支持 100+ 审核规则。
|
||||
"""SQL 审核引擎 V2 — 可配置规则引擎,支持 200+ 审核规则。
|
||||
|
||||
对标 Yearning/Archery/Bytebase 的审核能力,支持:
|
||||
- DDL 规则 (建表规范、索引规范、字段规范)
|
||||
@@ -7,6 +7,10 @@
|
||||
- 命名规范 (表名/字段名/索引名规范)
|
||||
- 性能规则 (全表扫描、索引使用、大 IN 子句)
|
||||
- 安全规则 (敏感字段、SQL 注入风险、密码硬编码)
|
||||
- MySQL 专用规则 (62+ 条,覆盖 MySQL 特有语法)
|
||||
- PostgreSQL 专用规则 (45+ 条,覆盖 PG 特有语法)
|
||||
- Redis 专用规则 (43+ 条,覆盖 Redis 命令和数据结构)
|
||||
- MongoDB 专用规则 (42+ 条,覆盖 MongoDB 查询和聚合)
|
||||
|
||||
使用方式:
|
||||
engine = SQLAuditEngineV2(db_session)
|
||||
@@ -1681,3 +1685,15 @@ class SQLAuditEngineV2:
|
||||
def invalidate_cache(self) -> None:
|
||||
"""清除规则缓存,下次审核重新加载。"""
|
||||
self._rules_cache = None
|
||||
|
||||
|
||||
# ── 延迟导入各数据库专用规则(副作用:注册到 _RULE_REGISTRY)────
|
||||
# 放在文件末尾以避免循环导入(规则模块需要 import register_rule 等)
|
||||
# MySQL 规则 (62+ 条)
|
||||
from app.services.mysql_audit_rules import * # noqa: F401,F403
|
||||
# PostgreSQL 规则 (45+ 条)
|
||||
from app.services.postgres_audit_rules import * # noqa: F401,F403
|
||||
# Redis 规则 (43+ 条)
|
||||
from app.services.redis_audit_rules import * # noqa: F401,F403
|
||||
# MongoDB 规则 (42+ 条)
|
||||
from app.services.mongodb_audit_rules import * # noqa: F401,F403
|
||||
@@ -1,4 +1,4 @@
|
||||
"""Preset audit rule seed data for MySQL, PostgreSQL, and Redis."""
|
||||
"""Preset audit rule seed data for MySQL, PostgreSQL, Redis, and MongoDB."""
|
||||
|
||||
from typing import List, Dict, Any
|
||||
|
||||
@@ -270,6 +270,320 @@ POSTGRES_SEED_RULES: List[Dict[str, Any]] = [
|
||||
},
|
||||
]
|
||||
|
||||
# ── MongoDB 预设规则 ────────────────────────────────────────────
|
||||
MONGODB_SEED_RULES: List[Dict[str, Any]] = [
|
||||
{
|
||||
"name": "MongoDB集合命名规范(snake_case)",
|
||||
"description": "MongoDB 集合名应使用小写下划线命名(snake_case)",
|
||||
"rule_type": "DDL",
|
||||
"severity": "warning",
|
||||
"db_type": "mongodb",
|
||||
"pattern": r"^[a-z][a-z0-9_]*$",
|
||||
"value": None,
|
||||
"message": "集合名不符合 snake_case 命名规范,应使用小写下划线格式",
|
||||
},
|
||||
{
|
||||
"name": "MongoDB集合名最大长度限制",
|
||||
"description": "MongoDB 集合名最大长度为 64 字节",
|
||||
"rule_type": "DDL",
|
||||
"severity": "warning",
|
||||
"db_type": "mongodb",
|
||||
"pattern": None,
|
||||
"value": "64",
|
||||
"message": "集合名长度超过64字节,请缩短集合名",
|
||||
},
|
||||
{
|
||||
"name": "MongoDB禁止删除集合",
|
||||
"description": "生产环境禁止执行删除集合操作",
|
||||
"rule_type": "DDL",
|
||||
"severity": "error",
|
||||
"db_type": "mongodb",
|
||||
"pattern": None,
|
||||
"value": None,
|
||||
"message": "禁止执行删除集合操作,数据将永久丢失",
|
||||
},
|
||||
{
|
||||
"name": "MongoDB禁止删除数据库",
|
||||
"description": "禁止执行 dropDatabase 操作",
|
||||
"rule_type": "DDL",
|
||||
"severity": "error",
|
||||
"db_type": "mongodb",
|
||||
"pattern": None,
|
||||
"value": None,
|
||||
"message": "禁止执行 dropDatabase 操作,将删除整个数据库",
|
||||
},
|
||||
{
|
||||
"name": "MongoDB禁止删除索引",
|
||||
"description": "禁止执行删除索引操作",
|
||||
"rule_type": "DDL",
|
||||
"severity": "error",
|
||||
"db_type": "mongodb",
|
||||
"pattern": None,
|
||||
"value": None,
|
||||
"message": "禁止执行删除索引操作,可能导致查询性能急剧下降",
|
||||
},
|
||||
{
|
||||
"name": "MongoDB推荐Schema Validator",
|
||||
"description": "创建集合时建议使用 JSON Schema Validator",
|
||||
"rule_type": "DDL",
|
||||
"severity": "info",
|
||||
"db_type": "mongodb",
|
||||
"pattern": None,
|
||||
"value": None,
|
||||
"message": "建议为集合添加 JSON Schema Validator 以约束文档结构",
|
||||
},
|
||||
{
|
||||
"name": "MongoDB查询必须带filter",
|
||||
"description": "find/delete/update 操作必须包含 filter 条件",
|
||||
"rule_type": "DQL",
|
||||
"severity": "error",
|
||||
"db_type": "mongodb",
|
||||
"pattern": None,
|
||||
"value": None,
|
||||
"message": "查询/更新/删除操作缺少 filter 条件,将操作全集合数据",
|
||||
},
|
||||
{
|
||||
"name": "MongoDB推荐指定projection",
|
||||
"description": "查询推荐指定 projection 限制返回字段",
|
||||
"rule_type": "DQL",
|
||||
"severity": "info",
|
||||
"db_type": "mongodb",
|
||||
"pattern": None,
|
||||
"value": None,
|
||||
"message": "查询未指定 projection,建议添加 projection 限制返回字段",
|
||||
},
|
||||
{
|
||||
"name": "MongoDB禁止$where/$function",
|
||||
"description": "禁止使用 $where 和 $function 执行 JavaScript",
|
||||
"rule_type": "DQL",
|
||||
"severity": "error",
|
||||
"db_type": "mongodb",
|
||||
"pattern": None,
|
||||
"value": None,
|
||||
"message": "禁止使用 $where/$function 执行 JavaScript,存在严重安全风险",
|
||||
},
|
||||
{
|
||||
"name": "MongoDB禁止前缀模糊匹配",
|
||||
"description": "禁止正则表达式前缀模糊匹配,无法有效使用索引",
|
||||
"rule_type": "DQL",
|
||||
"severity": "warning",
|
||||
"db_type": "mongodb",
|
||||
"pattern": r'/\^|"\$regex"\s*:\s*"\^',
|
||||
"value": None,
|
||||
"message": "前缀模糊匹配无法有效使用索引,建议调整查询策略",
|
||||
},
|
||||
{
|
||||
"name": "MongoDB查询返回结果上限",
|
||||
"description": "查询返回结果建议不超过 10000 条",
|
||||
"rule_type": "DQL",
|
||||
"severity": "warning",
|
||||
"db_type": "mongodb",
|
||||
"pattern": None,
|
||||
"value": "10000",
|
||||
"message": "查询未设置 limit 或 limit 超过 10000 条,建议分页查询",
|
||||
},
|
||||
{
|
||||
"name": "MongoDB禁止聚合$out/$merge",
|
||||
"description": "聚合管道禁止 $out/$merge 写操作",
|
||||
"rule_type": "DQL",
|
||||
"severity": "error",
|
||||
"db_type": "mongodb",
|
||||
"pattern": r'"\$(out|merge)"',
|
||||
"value": None,
|
||||
"message": "禁止在聚合管道中使用 $out/$merge 阶段,可能覆盖现有集合",
|
||||
},
|
||||
{
|
||||
"name": "MongoDB聚合管道阶段数上限",
|
||||
"description": "聚合管道阶段数建议不超过 20 个",
|
||||
"rule_type": "DQL",
|
||||
"severity": "warning",
|
||||
"db_type": "mongodb",
|
||||
"pattern": None,
|
||||
"value": "20",
|
||||
"message": "聚合管道阶段数超过20个,请优化查询结构",
|
||||
},
|
||||
{
|
||||
"name": "MongoDB$unwind大数据量警告",
|
||||
"description": "$unwind 展开数组可能导致文档数量急剧膨胀",
|
||||
"rule_type": "DQL",
|
||||
"severity": "warning",
|
||||
"db_type": "mongodb",
|
||||
"pattern": r'"\$unwind"',
|
||||
"value": None,
|
||||
"message": "$unwind 可能急剧增加文档数量,请确认数组字段元素数量",
|
||||
},
|
||||
{
|
||||
"name": "MongoDB批量写入上限",
|
||||
"description": "批量写入建议不超过 1000 条",
|
||||
"rule_type": "DML",
|
||||
"severity": "warning",
|
||||
"db_type": "mongodb",
|
||||
"pattern": None,
|
||||
"value": "1000",
|
||||
"message": "批量写入超过1000条,请分批写入",
|
||||
},
|
||||
{
|
||||
"name": "MongoDBupdateMany必须带条件",
|
||||
"description": "updateMany 必须包含 filter 条件",
|
||||
"rule_type": "DML",
|
||||
"severity": "error",
|
||||
"db_type": "mongodb",
|
||||
"pattern": None,
|
||||
"value": None,
|
||||
"message": "updateMany 操作缺少 filter 条件,将更新全集合文档",
|
||||
},
|
||||
{
|
||||
"name": "MongoDBdeleteMany必须带条件",
|
||||
"description": "deleteMany 必须包含 filter 条件",
|
||||
"rule_type": "DML",
|
||||
"severity": "error",
|
||||
"db_type": "mongodb",
|
||||
"pattern": None,
|
||||
"value": None,
|
||||
"message": "deleteMany 操作缺少 filter 条件,将删除全集合文档",
|
||||
},
|
||||
{
|
||||
"name": "MongoDB禁止unset关键字段",
|
||||
"description": "禁止 $unset 关键字段(_id, create_time等)",
|
||||
"rule_type": "DML",
|
||||
"severity": "error",
|
||||
"db_type": "mongodb",
|
||||
"pattern": None,
|
||||
"value": None,
|
||||
"message": "禁止使用 $unset 删除关键字段,可能导致数据完整性问题",
|
||||
},
|
||||
{
|
||||
"name": "MongoDB禁止重命名集合",
|
||||
"description": "禁止执行 renameCollection 操作",
|
||||
"rule_type": "DML",
|
||||
"severity": "error",
|
||||
"db_type": "mongodb",
|
||||
"pattern": None,
|
||||
"value": None,
|
||||
"message": "禁止重命名集合,可能导致应用连接失败",
|
||||
},
|
||||
{
|
||||
"name": "MongoDB禁止绕过文档验证",
|
||||
"description": "禁止 bypassDocumentValidation: true",
|
||||
"rule_type": "DML",
|
||||
"severity": "error",
|
||||
"db_type": "mongodb",
|
||||
"pattern": None,
|
||||
"value": None,
|
||||
"message": "禁止设置 bypassDocumentValidation 绕过 Schema 验证",
|
||||
},
|
||||
{
|
||||
"name": "MongoDB单文档大小限制",
|
||||
"description": "单文档大小建议不超过 10MB 警告阈值",
|
||||
"rule_type": "DML",
|
||||
"severity": "warning",
|
||||
"db_type": "mongodb",
|
||||
"pattern": None,
|
||||
"value": "10485760",
|
||||
"message": "文档大小超过10MB警告阈值,建议拆分或精简文档",
|
||||
},
|
||||
{
|
||||
"name": "MongoDB禁止嵌套深度超过5层",
|
||||
"description": "文档嵌套深度建议不超过 5 层",
|
||||
"rule_type": "DML",
|
||||
"severity": "warning",
|
||||
"db_type": "mongodb",
|
||||
"pattern": None,
|
||||
"value": "5",
|
||||
"message": "文档嵌套深度超过5层,建议优化文档结构",
|
||||
},
|
||||
{
|
||||
"name": "MongoDB禁止db.eval()",
|
||||
"description": "禁止 db.eval() 执行 JavaScript",
|
||||
"rule_type": "security",
|
||||
"severity": "error",
|
||||
"db_type": "mongodb",
|
||||
"pattern": r'\bdb\.eval\s*\(',
|
||||
"value": None,
|
||||
"message": "禁止 db.eval() 执行 JavaScript,存在严重安全风险",
|
||||
},
|
||||
{
|
||||
"name": "MongoDB禁止操作系统集合",
|
||||
"description": "禁止操作系统集合",
|
||||
"rule_type": "security",
|
||||
"severity": "error",
|
||||
"db_type": "mongodb",
|
||||
"pattern": None,
|
||||
"value": None,
|
||||
"message": "禁止操作系统集合,存在安全风险",
|
||||
},
|
||||
{
|
||||
"name": "MongoDB禁止MapReduce",
|
||||
"description": "禁止使用 mapReduce,使用聚合管道替代",
|
||||
"rule_type": "security",
|
||||
"severity": "error",
|
||||
"db_type": "mongodb",
|
||||
"pattern": r'\bmapReduce\b',
|
||||
"value": None,
|
||||
"message": "禁止 mapReduce,请使用聚合管道替代",
|
||||
},
|
||||
{
|
||||
"name": "MongoDB防止$cmd注入",
|
||||
"description": "禁止直接操作 $cmd 集合",
|
||||
"rule_type": "security",
|
||||
"severity": "error",
|
||||
"db_type": "mongodb",
|
||||
"pattern": None,
|
||||
"value": None,
|
||||
"message": "禁止直接操作 $cmd 集合,存在注入攻击风险",
|
||||
},
|
||||
{
|
||||
"name": "MongoDB敏感操作审计日志",
|
||||
"description": "删除、更新等敏感操作应记录审计日志",
|
||||
"rule_type": "security",
|
||||
"severity": "info",
|
||||
"db_type": "mongodb",
|
||||
"pattern": None,
|
||||
"value": None,
|
||||
"message": "敏感操作应确保已记录审计日志,便于安全追踪",
|
||||
},
|
||||
{
|
||||
"name": "MongoDB缺少索引查询警告",
|
||||
"description": "查询条件字段应创建索引",
|
||||
"rule_type": "performance",
|
||||
"severity": "warning",
|
||||
"db_type": "mongodb",
|
||||
"pattern": None,
|
||||
"value": None,
|
||||
"message": "查询条件字段缺少索引可能导致全集合扫描",
|
||||
},
|
||||
{
|
||||
"name": "MongoDB全集合扫描警告",
|
||||
"description": "缺少 filter 条件将导致全集合扫描",
|
||||
"rule_type": "performance",
|
||||
"severity": "warning",
|
||||
"db_type": "mongodb",
|
||||
"pattern": None,
|
||||
"value": None,
|
||||
"message": "查询缺少过滤条件,将导致全集合扫描",
|
||||
},
|
||||
{
|
||||
"name": "MongoDB复合索引字段顺序建议",
|
||||
"description": "复合索引字段顺序应遵循 ESR 规则",
|
||||
"rule_type": "performance",
|
||||
"severity": "info",
|
||||
"db_type": "mongodb",
|
||||
"pattern": None,
|
||||
"value": None,
|
||||
"message": "建议遵循 ESR 规则设计复合索引: 等值 > 排序 > 范围",
|
||||
},
|
||||
{
|
||||
"name": "MongoDB分片键选择建议",
|
||||
"description": "分片集合应选择高基数字段作为分片键",
|
||||
"rule_type": "performance",
|
||||
"severity": "info",
|
||||
"db_type": "mongodb",
|
||||
"pattern": None,
|
||||
"value": None,
|
||||
"message": "建议选择高基数均匀分布字段作为分片键",
|
||||
},
|
||||
]
|
||||
|
||||
# ── Redis 预设规则 ──────────────────────────────────────────────
|
||||
REDIS_SEED_RULES: List[Dict[str, Any]] = [
|
||||
{
|
||||
@@ -319,4 +633,5 @@ SEED_RULES_MAP = {
|
||||
"mysql": MYSQL_SEED_RULES,
|
||||
"postgres": POSTGRES_SEED_RULES,
|
||||
"redis": REDIS_SEED_RULES,
|
||||
"mongodb": MONGODB_SEED_RULES,
|
||||
}
|
||||
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
Reference in new issue
Block a user