跳转至

案例:安全审计,发现 4 个 SUPER 权限账号和远程 root

场景背景

  • 时间:2026-06-18 上午(季度合规检查)
  • 角色:安全工程师,负责数据库权限合规审计
  • 背景:公司刚通过等保 2.0 初评,数据库权限管理是扣分项
  • 目标:用 dbskiter 全盘扫描安全风险,输出合规报告

生活化比喻:数据库账号就像公司门禁卡。SUPER 权限是"万能钥匙",远程 root 是"把老板钥匙挂在门口"。安全审计就是检查谁拿了万能钥匙、谁把钥匙带出了公司。


执行步骤

1. 一键安全审计(1 分钟)

dbskiter --database=jump security audit

输出摘要

安全审计结果:
==============================
[通过] 空用户名检查:0 个
[通过] 无密码用户检查:0 个
[通过] 匿名用户检查:0 个
[通过] test 数据库检查:0 个
[通过] SSL 连接检查:已启用

[警告] SUPER 权限用户:4 个
[警告] 远程 root 访问:1 个
[INFO] 大字段分布:10 个字段 / 6 张表

2. 详细权限审计(2 分钟)

dbskiter --database=jump security permissions

详细输出

权限审计详情:

用户: root@%
  权限: ALL PRIVILEGES, SUPER, GRANT OPTION
  风险等级: CRITICAL
  说明: 允许从任意 IP 远程连接,拥有最高权限

用户: app_admin@10.0.%.%
  权限: SUPER, RELOAD, PROCESS
  风险等级: HIGH
  说明: 应用账号拥有 SUPER 权限,超出最小权限原则

用户: backup_user@localhost
  权限: SUPER, REPLICATION CLIENT
  风险等级: MEDIUM
  说明: 备份账号需要 SUPER 做一致性备份,但建议限制为 REPLICATION SLAVE

用户: monitor@10.0.0.10
  权限: SUPER, PROCESS
  风险等级: HIGH
  说明: 监控账号需要 PROCESS 查线程,但 SUPER 可修改配置,风险过高

3. 弱密码扫描(1 分钟)

dbskiter --database=jump security weak-passwords

结果

弱密码扫描:
[通过] 未发现弱密码用户
[通过] 未发现空密码用户
[INFO] 密码策略检查:
  - validate_password.policy: MEDIUM
  - validate_password.length: 8
  - 建议:升级到 STRONG,长度 >= 12

4. 敏感数据扫描(2 分钟)

dbskiter --database=jump security sensitive-data

发现结果

敏感数据扫描:

[高] 表: users
  字段: phone (手机号) → 样本: 138****1234
  字段: id_card (身份证号) → 样本: 310***********1234
  建议: 建议加密或脱敏存储

[高] 表: orders
  字段: receiver_phone (收货手机号) → 样本: 139****5678
  建议: 建议脱敏或单独加密存储

[中] 表: payment_logs
  字段: card_last4 (银行卡后四位) → 样本: ****6789
  说明: 已脱敏,符合规范

[中] 表: logs
  字段: content (日志内容) → 可能包含敏感信息
  建议: 增加日志脱敏规则,过滤手机号、身份证

总计:4 张表含敏感数据,2 张需整改

5. SQL 注入风险检测(2 分钟)

dbskiter --database=jump security sql-injection "
SELECT * FROM users WHERE username = '${username}' AND password = '${password}'
"

检测结果

[CRITICAL] 发现 SQL 注入风险:
  类型:字符串拼接注入
  位置:WHERE username = '${username}'
  风险:攻击者可输入 ' OR '1'='1 绕过认证

  修复建议:
  1. 使用参数化查询(PreparedStatement)
  2. 输入校验:只允许字母数字下划线
  3. 最小权限:应用账号禁止 DROP/DELETE

整改方案与实施

优先级 1:远程 root(当天修复)

-- 步骤 1:删除远程 root 用户(危险!先确认有本地 root 或其他管理员)
DROP USER 'root'@'%';

-- 步骤 2:确保本地 root 存在
SELECT user, host FROM mysql.user WHERE user = 'root';
-- 预期结果:应有 'root'@'localhost',无 'root'@'%'

-- 步骤 3:新建管理员账号(仅限特定 IP)
CREATE USER 'dba'@'10.0.0.100' IDENTIFIED BY 'StrongP@ssw0rd!2026';
GRANT ALL PRIVILEGES ON jump.* TO 'dba'@'10.0.0.100';
FLUSH PRIVILEGES;

优先级 2:SUPER 权限回收(本周内)

-- 应用账号 app_admin:去掉 SUPER,保留必要权限
REVOKE SUPER ON *.* FROM 'app_admin'@'10.0.%.%';
GRANT SELECT, INSERT, UPDATE, DELETE ON jump.* TO 'app_admin'@'10.0.%.%';

-- 监控账号 monitor:去掉 SUPER,只保留 PROCESS
REVOKE SUPER ON *.* FROM 'monitor'@'10.0.0.10';
GRANT PROCESS ON *.* TO 'monitor'@'10.0.0.10';

-- 备份账号 backup_user:SUPER 改 REPLICATION SLAVE
REVOKE SUPER ON *.* FROM 'backup_user'@'localhost';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'backup_user'@'localhost';
GRANT SELECT ON jump.* TO 'backup_user'@'localhost';

FLUSH PRIVILEGES;

优先级 3:敏感数据加密(1 周内)

-- 方案:使用 MySQL 透明数据加密(TDE)或应用层加密
-- 示例:应用层加密 phone 字段(需修改业务代码)

-- 或:创建脱敏视图给分析人员
CREATE VIEW users_safe AS
SELECT 
    id,
    username,
    CONCAT(LEFT(phone, 3), '****', RIGHT(phone, 4)) AS phone,
    CONCAT(LEFT(id_card, 4), '**********', RIGHT(id_card, 4)) AS id_card
FROM users;

-- 限制分析师只能访问脱敏视图
GRANT SELECT ON jump.users_safe TO 'analyst'@'10.0.%.%';
REVOKE SELECT ON jump.users FROM 'analyst'@'10.0.%.%';

验证整改效果

# 重新审计,确认问题已修复
dbskiter --database=jump security audit

预期结果

[通过] SUPER 权限用户:0 个(原来是 4 个)
[通过] 远程 root 访问:0 个(原来是 1 个)
[通过] 弱密码:0 个
[通过] 匿名用户:0 个

剩余风险:
[INFO] 敏感数据:2 张表需加密(users, orders)→ 需业务配合,1 周内完成
[INFO] 密码策略:建议升级到 STRONG

合规报告模板

【数据库安全审计报告】2026 Q2

数据库:jump(MySQL 8.0.32)
审计时间:2026-06-18
审计工具:dbskiter security audit

一、整体评分
安全评分:82 / 100(良好)
已修复风险:2 项(远程 root、SUPER 权限滥用)
剩余风险:2 项(敏感数据未加密、密码策略中等)

二、发现与整改

| 序号 | 风险项 | 风险等级 | 整改前 | 整改后 | 状态 |
|------|--------|---------|--------|--------|------|
| 1 | 远程 root 访问 | CRITICAL | 1 个 | 0 个 | 已修复 |
| 2 | SUPER 权限用户 | HIGH | 4 个 | 0 个 | 已修复 |
| 3 | 敏感数据未加密 | HIGH | 2 张表 | - | 进行中 |
| 4 | 密码策略中等 | MEDIUM | MEDIUM | - | 计划中 |

三、合规结论
- 已满足等保 2.0 数据库访问控制基本要求
- 建议:补充数据加密和审计日志留存 6 个月

四、下一步计划
- 2026-06-25:完成 users、orders 表敏感字段加密
- 2026-07-01:升级密码策略为 STRONG
- 2026-07-15:启用 general log 做操作审计

复盘要点

1. 权限最小化原则

角色 需要权限 禁止权限
应用账号 SELECT, INSERT, UPDATE, DELETE SUPER, DROP, GRANT
监控账号 PROCESS, SELECT SUPER, DELETE, DROP
备份账号 SELECT, REPLICATION SLAVE SUPER, DELETE, DROP
DBA 账号 ALL(仅限特定 IP) -

2. 安全审计频率

频率 检查项 命令
每日 登录安全(暴力破解) security login-security
每周 权限变更审计 security audit-log
每月 全盘安全扫描 security audit
季度 敏感数据扫描 security sensitive-data
上线前 SQL 注入检测 security sql-injection

3. 常见误区

误区 正确做法
"root 方便,大家都用" root 仅限本地 DBA,应用和监控用独立账号
"SUPER 权限给备份没问题" 备份只需 REPLICATION SLAVE,不需要 SUPER
"密码复杂就行,不用定期换" 定期扫描弱密码,启用密码过期策略
"敏感数据加密影响性能" 只对高敏感字段加密,或用脱敏视图
"SQL 注入是开发的事,DBA 不管" DBA 应定期扫描存储过程和应用程序 SQL

延伸阅读