Files
opsxsql/backend/app/services/audit_rule_seeds.py
T
logan 58eb78c987 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 通过
2026-05-23 16:46:13 +08:00

638 lines
21 KiB
Python

"""Preset audit rule seed data for MySQL, PostgreSQL, Redis, and MongoDB."""
from typing import List, Dict, Any
# ── MySQL 预设规则 ──────────────────────────────────────────────
MYSQL_SEED_RULES: List[Dict[str, Any]] = [
{
"name": "DDLMultiToCommit",
"description": "DDL 允许单个工单提交多条DDL",
"rule_type": "DDL",
"severity": "info",
"db_type": "mysql",
"pattern": None,
"value": None,
"message": "DDL 允许单个工单提交多条DDL语句",
},
{
"name": "DDLAllowMultiAlter",
"description": "DDL 允许多alter",
"rule_type": "DDL",
"severity": "info",
"db_type": "mysql",
"pattern": None,
"value": None,
"message": "DDL 允许在单条ALTER TABLE中使用多个修改操作",
},
{
"name": "DDLAllowColumnType",
"description": "允许字段类型转换",
"rule_type": "DDL",
"severity": "warning",
"db_type": "mysql",
"pattern": None,
"value": None,
"message": "允许字段类型转换,请确认数据兼容性",
},
{
"name": "DDLAllowChangeColumnPosition",
"description": "允许 AFTER/FIRST 修改列位置",
"rule_type": "DDL",
"severity": "info",
"db_type": "mysql",
"pattern": None,
"value": None,
"message": "允许使用 AFTER/FIRST 修改列位置",
},
{
"name": "DDLEnableDropTable",
"description": "允许删表操作",
"rule_type": "DDL",
"severity": "warning",
"db_type": "mysql",
"pattern": None,
"value": None,
"message": "允许执行 DROP TABLE 操作,请确认已备份",
},
{
"name": "DDLEnablePrimaryKey",
"description": "检查表必须包含主键",
"rule_type": "DDL",
"severity": "error",
"db_type": "mysql",
"pattern": None,
"value": None,
"message": "建表必须指定主键",
},
{
"name": "DDLCheckTableComment",
"description": "强制表注释",
"rule_type": "DDL",
"severity": "warning",
"db_type": "mysql",
"pattern": None,
"value": None,
"message": "建表时必须添加表注释(COMMENT)",
},
{
"name": "DMLAllowInsertNull",
"description": "允许 Insert Null 值",
"rule_type": "DML",
"severity": "info",
"db_type": "mysql",
"pattern": None,
"value": None,
"message": "允许 INSERT 语句中包含 NULL 值",
},
{
"name": "DMLWhere",
"description": "强制 DML 语句包含 WHERE 条件",
"rule_type": "DML",
"severity": "error",
"db_type": "mysql",
"pattern": None,
"value": None,
"message": "UPDATE/DELETE 语句必须包含 WHERE 条件",
},
{
"name": "DDLMaxKeyParts",
"description": "单索引字段上限",
"rule_type": "DDL",
"severity": "warning",
"db_type": "mysql",
"pattern": None,
"value": "8",
"message": "单索引包含的字段数不得超过8个",
},
{
"name": "DDLMaxKey",
"description": "单表索引上限",
"rule_type": "DDL",
"severity": "warning",
"db_type": "mysql",
"pattern": None,
"value": "12",
"message": "单表索引数量不得超过12个",
},
{
"name": "MaxDDLAffectRows",
"description": "DDL 最大影响行数",
"rule_type": "DDL",
"severity": "warning",
"db_type": "mysql",
"pattern": None,
"value": "0",
"message": "DDL 最大影响行数为0(不限制)",
},
{
"name": "DDLMaxCharLength",
"description": "CHAR 类型最大长度",
"rule_type": "DDL",
"severity": "warning",
"db_type": "mysql",
"pattern": None,
"value": "10",
"message": "CHAR 类型长度不得超过10,超出请使用 VARCHAR",
},
{
"name": "MaxTableNameLen",
"description": "表名长度限制",
"rule_type": "DDL",
"severity": "warning",
"db_type": "mysql",
"pattern": None,
"value": "45",
"message": "表名长度不得超过45个字符",
},
{
"name": "DMLMaxInsertRows",
"description": "INSERT 最大行数限制",
"rule_type": "DML",
"severity": "warning",
"db_type": "mysql",
"pattern": None,
"value": "500",
"message": "单次 INSERT 最多插入500行",
},
]
# ── PostgreSQL 预设规则 ─────────────────────────────────────────
POSTGRES_SEED_RULES: List[Dict[str, Any]] = [
{
"name": "PGDDLMultiToCommit",
"description": "PostgreSQL DDL 允许单个工单提交多条DDL",
"rule_type": "DDL",
"severity": "info",
"db_type": "postgres",
"pattern": None,
"value": None,
"message": "DDL 允许单个工单提交多条DDL语句",
},
{
"name": "PGDDLAllowColumnType",
"description": "PostgreSQL 允许字段类型转换",
"rule_type": "DDL",
"severity": "warning",
"db_type": "postgres",
"pattern": None,
"value": None,
"message": "允许字段类型转换,请确认数据兼容性",
},
{
"name": "PGDDLEnablePrimaryKey",
"description": "PostgreSQL 检查表必须包含主键",
"rule_type": "DDL",
"severity": "error",
"db_type": "postgres",
"pattern": None,
"value": None,
"message": "建表必须指定主键",
},
{
"name": "PGDDLEnableDropTable",
"description": "PostgreSQL 允许删表操作",
"rule_type": "DDL",
"severity": "warning",
"db_type": "postgres",
"pattern": None,
"value": None,
"message": "允许执行 DROP TABLE 操作,请确认已备份",
},
{
"name": "PGDDLCheckTableComment",
"description": "PostgreSQL 强制表注释",
"rule_type": "DDL",
"severity": "warning",
"db_type": "postgres",
"pattern": None,
"value": None,
"message": "建表时必须添加表注释(COMMENT ON TABLE)",
},
{
"name": "PGDMLWhere",
"description": "PostgreSQL 强制 DML 包含 WHERE 条件",
"rule_type": "DML",
"severity": "error",
"db_type": "postgres",
"pattern": None,
"value": None,
"message": "UPDATE/DELETE 语句必须包含 WHERE 条件",
},
{
"name": "PGDMLAllowInsertNull",
"description": "PostgreSQL 允许 Insert Null 值",
"rule_type": "DML",
"severity": "info",
"db_type": "postgres",
"pattern": None,
"value": None,
"message": "允许 INSERT 语句中包含 NULL 值",
},
{
"name": "PGDDLMaxKeyParts",
"description": "PostgreSQL 单索引字段上限",
"rule_type": "DDL",
"severity": "warning",
"db_type": "postgres",
"pattern": None,
"value": "8",
"message": "单索引包含的字段数不得超过8个",
},
{
"name": "PGDDLMaxKey",
"description": "PostgreSQL 单表索引上限",
"rule_type": "DDL",
"severity": "warning",
"db_type": "postgres",
"pattern": None,
"value": "12",
"message": "单表索引数量不得超过12个",
},
{
"name": "PGMaxTableNameLen",
"description": "PostgreSQL 表名长度限制",
"rule_type": "DDL",
"severity": "warning",
"db_type": "postgres",
"pattern": None,
"value": "63",
"message": "表名长度不得超过63个字符",
},
{
"name": "PGDMLMaxInsertRows",
"description": "PostgreSQL INSERT 最大行数限制",
"rule_type": "DML",
"severity": "warning",
"db_type": "postgres",
"pattern": None,
"value": "500",
"message": "单次 INSERT 最多插入500行",
},
]
# ── 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]] = [
{
"name": "RedisAllowFlushDB",
"description": "Redis 允许 FLUSHDB 操作",
"rule_type": "DML",
"severity": "warning",
"db_type": "redis",
"pattern": None,
"value": None,
"message": "允许执行 FLUSHDB 操作,将清空当前数据库",
},
{
"name": "RedisMaxKeyLen",
"description": "Redis Key 最大长度限制",
"rule_type": "DDL",
"severity": "warning",
"db_type": "redis",
"pattern": None,
"value": "256",
"message": "Key 长度不得超过256个字符",
},
{
"name": "RedisRequireTTL",
"description": "Redis 写入操作必须设置 TTL",
"rule_type": "DML",
"severity": "error",
"db_type": "redis",
"pattern": None,
"value": None,
"message": "写入 Key 时必须设置过期时间(TTL)",
},
{
"name": "RedisDefaultTTL",
"description": "Redis 默认 TTL 值(秒)",
"rule_type": "DML",
"severity": "info",
"db_type": "redis",
"pattern": None,
"value": "3600",
"message": "默认 TTL 为3600秒(1小时)",
},
]
# 映射: db_type → 种子规则列表
SEED_RULES_MAP = {
"mysql": MYSQL_SEED_RULES,
"postgres": POSTGRES_SEED_RULES,
"redis": REDIS_SEED_RULES,
"mongodb": MONGODB_SEED_RULES,
}