"""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, }