CIS MySQL Benchmark 是暴露面收敛的检查框架,而非配置清单;它以攻击视角验证禁用空密码、SSL启用等硬性指标,但常因忽略匿名用户清理、系统权限配置、版本兼容性及需手动执行的账户与日志管控项而实效不足。

直接说结论:CIS MySQL Benchmark 不是“配置清单”,而是暴露面收敛的检查框架。你照着第5.1节改 bind-address,却没删 ''@'localhost' 匿名用户,等于门锁好了,窗大开着。
为什么 CIS 基线检查总过不了?
CIS MySQL Benchmark(v1.7+ 适配 5.7/8.0)本质是一套“攻击视角”的验证逻辑:它不关心你密码多复杂,只验证是否禁用了空密码登录;不看你有没有开 SSL,只查 have_ssl 是否为 YES 且 require_secure_transport 是否启用。很多团队卡在“检查项通过但实际仍高危”,核心原因是:
- 把 CIS 当成配置模板复制粘贴,忽略上下文依赖(比如
validate_password插件未安装时设置validate_password.length会静默失败) - 只改 MySQL 配置,没同步清理系统层残留(如
/etc/my.cnf权限为 644,MySQL 进程属主是 root) - 忽略版本差异:CIS v1.7 对 MySQL 8.0 要求
default_authentication_plugin=caching_sha2_password,但老项目 JDBC 驱动不兼容,硬切会导致连接中断
必须手动执行的三类 CIS 检查项
这些项无法靠配置文件一劳永逸,每次部署/升级后都得人工确认:
1. 匿名与测试账户清理
解析 MySQL 8.0 的 DDL 脚本,并将表结构导出为 Excel 格式。适用于用户需将 MySQL 的 `CREATE TABLE` 语句转换为结构化的 Excel 文件场景,导出内容包含字段名、数据类型、长度及精度等信息。支持多张表的批量处理,每张表对应 Excel 中的一个独立工作表。适用于数据库文档编写、数据字典生成及模式分析等任务。
- 执行
SELECT user, host FROM mysql.user WHERE user = '';,结果非空则立即DROP USER ''@'localhost', ''@'%'; - 执行
SHOW DATABASES LIKE 'test';,存在则DROP DATABASE test;并删除对应权限:DELETE FROM mysql.db WHERE Db = 'test' OR Db = 'test\_%'; - 注意:MySQL 8.0+ 的
DROP USER不再支持通配符主机,必须精确匹配host字段值
2. root 账户访问控制
- 禁止
root远程登录不是删掉'root'@'%'就完事——先查SELECT user, host FROM mysql.user WHERE user = 'root';,确保只剩'root'@'localhost'和'root'@'127.0.0.1' - 若业务需远程管理,用独立账号替代:
CREATE USER 'dba_admin'@'10.10.20.%' IDENTIFIED BY 'StrongPwd#2026'; GRANT SELECT, INSERT, UPDATE, DELETE, PROCESS ON *.* TO 'dba_admin'@'10.10.20.%';(PROCESS仅用于监控,禁用SUPER)
3. 日志与审计开关验证
- CIS 要求开启错误日志、通用查询日志(
general_log=ON)、慢查询日志(slow_query_log=ON),但生产环境通用日志默认应关闭——这里要妥协:至少保证log_error指向受控路径(如/var/log/mysql/error.log),且文件权限为640,属主为mysql:mysql - 审计插件(如
audit_log)非开源版内置,CIS 允许用general_log+ 外部日志收集器替代,但必须验证SELECT @@general_log_file;输出路径不在 web 可访问目录下
容易被忽略的 Linux 系统层加固点
CIS MySQL Benchmark 第1章明确要求操作系统配合,但多数人只盯 MySQL 内部:
-
/var/lib/mysql目录权限必须为700,属主mysql:mysql;若用 LVM 或 NFS 存储,需额外验证挂载参数含noexec,nosuid,nodev -
/etc/my.cnf配置文件权限必须 ≤600,否则 CIS 工具直接报FAILED;特别注意 Docker 环境中挂载的配置文件,宿主机权限常被忽略 - MySQL 进程不能以
root运行:检查ps -eo user,comm | grep mysqld,输出首列为mysql才合规;若为root,需在my.cnf中显式配置user=mysql并重启
真正难的不是执行 CIS 条款,而是理解每条背后的攻击链路。比如要求 local_infile=OFF,不只是防恶意 LOAD DATA INFILE,更是阻断利用 SELECT ... INTO OUTFILE 配合 UDF 提权的组合技。别让加固变成 checklist 完成式,留个心眼:你关掉的每个功能,黑客正盯着怎么绕过。

















