fix: 审核引擎优化 + 执行结果结构化展示
后端审核规则修复: - Redis SEC-001: SET/DEL等常规命令不再误报AUTH要求,改为仅对管理级命令WARNING - Redis SEC-003: 降级为INFO,排除已由CMD-001拦截的FLUSHDB/FLUSHALL - Redis key提取: 排除CONFIG/ACL等管理命令,不再把子命令参数误认为key名 - MySQL SEC-006: 新增GRANT ALL/REVOKE ALL全局权限拦截 - MySQL SEC-007: 新增LOAD DATA/LOAD XML拦截 - MySQL SEC-008: 新增SLEEP()/BENCHMARK()时间盲注拦截 - MySQL SEC-009: 新增INTO OUTFILE/DUMPFILE文件写入拦截 前端执行结果结构化: - TicketDetailPage执行结果从原始JSON改为结构化展示 - 解析JSON展示: 状态徽章+影响行数+耗时+验证状态 - Errors/Warnings逐条渲染: 红色错误框+黄色警告框+具体消息 - 删除废弃的executeStats/renderExecuteStats 其他: 审核规则6分组/慢查询移除/查询数据重命名/AuditLogs修复 测试: 1040 passed, TSC零错误
This commit is contained in:
1 parent
9f56e866f2
commit
4ac2528f8e
19 files changed
+1202
-325
No files matched your search
@@ -98,6 +98,17 @@ def _extract_key_from_command(command: str, args: List[str]) -> Optional[str]:
|
||||
if command in second_key_commands and len(args) >= 1:
|
||||
return args[0]
|
||||
|
||||
# 管理命令/无 key 命令:不应提取 key
|
||||
no_key_commands = {
|
||||
"CONFIG", "ACL", "AUTH", "INFO", "PING", "FLUSHDB", "FLUSHALL",
|
||||
"DBSIZE", "BGSAVE", "BGREWRITEAOF", "SAVE", "LASTSAVE",
|
||||
"SHUTDOWN", "SLAVEOF", "REPLICAOF", "SLOWLOG", "MONITOR",
|
||||
"DEBUG", "OBJECT", "CLIENT", "CLUSTER", "SENTINEL",
|
||||
"MODULE", "COMMAND", "MEMORY", "LATENCY", "WAIT",
|
||||
}
|
||||
if command in no_key_commands:
|
||||
return None
|
||||
|
||||
# 默认:第一个参数是 key
|
||||
return args[0]
|
||||
|
||||
@@ -1610,35 +1621,28 @@ def check_redis_perf_008(sql_clean: str, sql_upper: str, report: AuditReportV2,
|
||||
|
||||
@register_rule(AuditRuleV2(
|
||||
code="REDIS-SEC-001",
|
||||
name="必须认证才能执行命令",
|
||||
name="敏感管理命令需要二次确认",
|
||||
category=RuleCategory.SECURITY,
|
||||
severity=Severity.ERROR,
|
||||
severity=Severity.WARNING,
|
||||
db_type="redis",
|
||||
description="非只读命令必须执行 AUTH 认证后才能执行",
|
||||
config={"require_auth": True, "allowed_cmds_without_auth": ["PING", "AUTH", "ECHO", "QUIT", "HELLO"]},
|
||||
message_template="命令 '{cmd}' 需要认证后才能执行,请先执行 AUTH password 进行认证",
|
||||
description="CONFIG/ACL/SHUTDOWN 等管理级命令属于高危操作,建议限制执行",
|
||||
config={"admin_cmds": ["CONFIG", "ACL", "SHUTDOWN", "DEBUG", "MODULE", "REPLICAOF", "SLAVEOF", "SAVE", "BGSAVE", "BGREWRITEAOF"]},
|
||||
message_template="命令 '{cmd}' 属于 Redis 管理级操作,请确认业务必要性后再执行",
|
||||
))
|
||||
def check_redis_sec_001(sql_clean: str, sql_upper: str, report: AuditReportV2, rule: AuditRuleV2) -> None:
|
||||
"""必须认证检查。
|
||||
"""管理级命令检查。
|
||||
|
||||
提示执行敏感命令前需要 AUTH 认证。
|
||||
仅对 CONFIG/ACL/SHUTDOWN 等管理级命令产生警告,
|
||||
常规数据操作命令(SET/DEL/HSET 等)不触发——
|
||||
平台已通过实例配置管理认证,无需额外提示 AUTH。
|
||||
"""
|
||||
command, args = _parse_redis_command(sql_clean)
|
||||
if not command:
|
||||
return
|
||||
cmd = command.upper()
|
||||
|
||||
allowed = rule.config.get("allowed_cmds_without_auth", ["PING", "AUTH", "ECHO", "QUIT", "HELLO"])
|
||||
if cmd in allowed:
|
||||
return
|
||||
|
||||
# 只对写入和敏感命令要求认证
|
||||
sensitive_cmds = {
|
||||
"SET", "DEL", "FLUSHDB", "FLUSHALL", "CONFIG", "ACL", "RENAME",
|
||||
"MIGRATE", "RESTORE", "SHUTDOWN", "DEBUG", "MODULE", "REPLICAOF",
|
||||
"SLAVEOF", "SAVE", "BGSAVE", "BGREWRITEAOF",
|
||||
}
|
||||
if cmd in sensitive_cmds:
|
||||
admin_cmds = rule.config.get("admin_cmds", [])
|
||||
if cmd in admin_cmds:
|
||||
report.findings.append(AuditFindingV2(
|
||||
rule_code=rule.code,
|
||||
rule_name=rule.name,
|
||||
@@ -1696,25 +1700,27 @@ def check_redis_sec_002(sql_clean: str, sql_upper: str, report: AuditReportV2, r
|
||||
|
||||
@register_rule(AuditRuleV2(
|
||||
code="REDIS-SEC-003",
|
||||
name="危险命令必须被重命名",
|
||||
name="危险命令重命名建议",
|
||||
category=RuleCategory.SECURITY,
|
||||
severity=Severity.WARNING,
|
||||
severity=Severity.INFO,
|
||||
db_type="redis",
|
||||
description="建议将危险命令(FLUSHDB/FLUSHALL/CONFIG/DEBUG)通过 rename-command 重命名",
|
||||
config={"dangerous_commands": ["FLUSHDB", "FLUSHALL", "CONFIG", "DEBUG", "SHUTDOWN"]},
|
||||
message_template="危险命令 '{cmd}' 应通过 rename-command 在配置中重命名,防止误操作或恶意执行",
|
||||
description="建议将 FLUSHDB/FLUSHALL/DEBUG/SHUTDOWN 通过 rename-command 重命名",
|
||||
config={"dangerous_commands": ["DEBUG", "SHUTDOWN"]},
|
||||
message_template="建议将 '{cmd}' 通过 rename-command 重命名,防止误操作",
|
||||
))
|
||||
def check_redis_sec_003(sql_clean: str, sql_upper: str, report: AuditReportV2, rule: AuditRuleV2) -> None:
|
||||
"""危险命令重命名检查。
|
||||
"""危险命令重命名建议。
|
||||
|
||||
当检测到危险命令使用时,提示应在配置中重命名。
|
||||
FLUSHDB/FLUSHALL 已由 CMD-001 硬拦截,此处仅对 DEBUG/SHUTDOWN
|
||||
等管理命令给出 rename-command 配置建议,避免与 CMD-001 重复。
|
||||
"""
|
||||
command, args = _parse_redis_command(sql_clean)
|
||||
if not command:
|
||||
return
|
||||
cmd = command.upper()
|
||||
|
||||
dangerous = rule.config.get("dangerous_commands", ["FLUSHDB", "FLUSHALL", "CONFIG", "DEBUG", "SHUTDOWN"])
|
||||
# 排除已由 CMD-001 拦截的 FLUSHDB/FLUSHALL/CONFIG
|
||||
dangerous = rule.config.get("dangerous_commands", ["DEBUG", "SHUTDOWN"])
|
||||
if cmd in dangerous:
|
||||
report.findings.append(AuditFindingV2(
|
||||
rule_code=rule.code,
|
||||
|
||||
Reference in new issue
Block a user