feat: Phase1安全基线 — 风险等级+审核超时+执行进度+通知脱敏+高危确认+维护窗口 (1119测试)

新增功能:
- ticket_sql_items模型: 逐条SQL执行记录(状态/耗时/影响行数)
- risk_evaluator.py: 4级风险评估(low/medium/high/critical), 支持MySQL/PG/Redis/Mongo
- Ticket模型: 新增risk_level + workflow_id字段
- 审核引擎签名改造: audit(sql, db_type, instance_id=None) 支持EXPLAIN预检
- 审核超时保护: 10s超时跳过审核, 防止工单创建阻塞
- 工单创建自动风险计算 + 审批流匹配(instance.workflow_id优先)
- SQL items查询API: GET /{ticket_id}/sql-items 含进度统计
- 执行器集成: 执行完成后自动更新SQL items逐条状态
- 通知脱敏: password/secret/token自动掩码, SQL预览截断100字符
- 高危操作强制二次确认: high/critical级别需confirmed=true
- 维护窗口控制: system_settings配置执行时间窗口(支持跨午夜)
- 45个新测试: 风险评估24+通知脱敏5+维护窗口2+SQL分类11+配置2
This commit is contained in:
logan committed 2026-05-25 10:25:42 +08:00
1 parent 030f3f2339
commit 7be0bf1a7c
9 files changed
+809 -16

No files matched your search

+16 -2
View File
@@ -116,6 +116,7 @@ class AuditReportV2:
sql: str
findings: List[AuditFindingV2] = field(default_factory=list)
db_type: str = "mysql"
extra_info: Dict[str, Any] = field(default_factory=dict)
@property
def passed(self) -> bool:
@@ -1633,7 +1634,9 @@ class SQLAuditEngineV2:
return rules
return [(r, f) for r, f in rules if r.db_type in ("all", db_type)]
async def audit(self, sql: str, db_type: str = "mysql") -> AuditReportV2:
async def audit(
self, sql: str, db_type: str = "mysql", instance_id: Optional[int] = None
) -> AuditReportV2:
"""执行 SQL 审核。
根据 SQL 语句类型,匹配对应的审核规则进行检查。
@@ -1641,6 +1644,7 @@ class SQLAuditEngineV2:
Args:
sql: 待审核的 SQL 语句
db_type: 目标数据库类型 (mysql/postgres/redis)
instance_id: 目标实例 ID(用于 EXPLAIN 预检、上下文感知规则等)
Returns:
AuditReportV2 审核报告
@@ -1649,14 +1653,24 @@ class SQLAuditEngineV2:
sql_upper = sql_clean.upper()
report = AuditReportV2(sql=sql_clean, db_type=db_type)
report.extra_info["instance_id"] = instance_id
# 加载规则
rules = await self._load_rules(db_type)
# 构建上下文(用于上下文感知规则)
context: Dict[str, Any] = {"instance_id": instance_id, "db_session": self.db_session}
# 执行每条规则的检查
for rule, check_func in rules:
try:
check_func(sql_clean, sql_upper, report, rule)
check_func(sql_clean, sql_upper, report, rule, context=context)
except TypeError:
# 兼容旧签名 (sql, sql_upper, report, rule)
try:
check_func(sql_clean, sql_upper, report, rule)
except Exception:
continue
except Exception:
# 规则检查失败不影响整体审核
continue