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:
1 parent
030f3f2339
commit
7be0bf1a7c
9 files changed
+809
-16
No files matched your search
@@ -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
|
||||
|
||||
Reference in new issue
Block a user