MySQL安全性需从访问控制、数据保护、运行环境、审计监控四层面系统加固:严格权限管控、启用TLS与静态加密、限制运行权限、开启审计日志并持续验证。

MySQL 安全性不能只靠一个密码或防火墙,而是需要从访问控制、数据保护、运行环境、审计监控四个层面系统加固。
严格管控数据库访问权限
避免使用 root 远程登录,为每个应用创建最小权限专用账号。比如业务系统只需读写指定库的几张表,就不要授予 SUPER 或 FILE 权限;删除匿名用户和测试库;禁用旧版认证插件(如 mysql_native_password 优先于 caching_sha2_password 的场景需评估兼容性,但新部署建议启用更强认证)。
- 执行 DROP USER ''@'localhost'; 清理空用户名账户
- 用 CREATE USER 'app01'@'192.168.10.%' IDENTIFIED BY '强密码' REQUIRE SSL; 限定IP+强制加密连接
- 用 GRANT SELECT,INSERT ON mydb.orders TO 'app01'@'192.168.10.%'; 精确授权,不用 GRANT ALL
启用传输与存储层加密
默认 MySQL 通信明文传输,中间人可截获账号密码和敏感数据。必须启用 TLS 加密客户端连接,并对静态敏感字段(如身份证、手机号)做应用层加密或使用 MySQL 8.0+ 的 Data-at-Rest Encryption(需配置 innodb_encrypt_tables=ON 和 keyring 插件)。
- 生成合法证书后,在 my.cnf 中配置:ssl-ca=/etc/mysql/ca.pem ssl-cert=/etc/mysql/server.pem ssl-key=/etc/mysql/server-key.pem
- 检查是否生效:SHOW VARIABLES LIKE '%ssl%'; 和 STATUS; 查看当前连接是否为 SSL
- 对已有表开启加密:ALTER TABLE user_info ENCRYPTION='Y';(需先启用 keyring)
加固 MySQL 运行环境
数据库进程不应以 root 运行,数据目录权限要严格限制;关闭危险功能如 LOCAL INFILE(防文件读取攻击)、LOAD DATA INFILE(除非明确需要);禁用符号链接(symbolic-links=0),防止绕过路径限制。
- 启动时指定非特权用户:mysqld --user=mysql --datadir=/var/lib/mysql
- my.cnf 中添加:local_infile=OFF secure_file_priv=/tmp/ symbolic-links=0
- 确保 /var/lib/mysql 目录属主为 mysql 用户,权限为 750,禁止其他用户进入
开启日志审计与异常监控
MySQL 自带 general_log 和 slow_query_log 不适合长期开启(性能开销大),推荐启用 audit_log 插件(企业版)或使用社区版替代方案如 MariaDB 的 server_audit,记录登录、权限变更、DML/DCL 操作。配合外部 SIEM 工具分析高频失败登录、非常规时间操作等风险行为。
- 安装 audit_log:INSTALL PLUGIN audit_log SONAME 'audit_log.so';
- 配置输出格式与路径:audit_log_format=JSON audit_log_policy=ALL audit_log_file=/var/log/mysql/audit.json
- 定期用脚本解析 audit.json,告警 root 用户夜间登录、连续5次失败后的新成功会话等
安全不是一次性配置,而是持续验证的过程。每次版本升级、新应用接入、权限调整后,都应回顾账号权限清单、检查 TLS 状态、确认 audit_log 是否正常写入。不复杂但容易忽略。










