mysql安全加固需坚持最小权限原则:为必要用户分配最小权限,禁用匿名账户和test库,启用密码强度策略,绑定内网ip并限制网络访问。

只给必要用户分配最小权限
MySQL 默认的 root 用户常被滥用,尤其在开发环境直接用 root@'%' 允许远程登录,等于把锁打开扔在门口。必须为每个应用或人员创建独立账号,并严格限制主机范围和权限类型。
- 禁止使用通配符主机:
CREATE USER 'appuser'@'%' IDENTifIED BY 'pwd';→ 改为CREATE USER 'appuser'@'192.168.10.5' IDENTIFIED BY 'pwd'; - 不授予
GRANT OPTION,除非明确需要授权能力 - 用
REVOKE ALL PRIVILEGES ON *.* FROM 'user'@'host';清空默认权限,再逐条添加,例如:GRANT select, INSERT ON mydb.orders TO 'appuser'@'192.168.10.5'; - 避免给生产账号
FILE、PROCESS、SUPER等高危权限,它们可能被用于读取服务器文件或绕过权限检查
禁用匿名用户和测试数据库
MySQL 安装后常残留 ''@'localhost'(空用户名)和 test 数据库,这是攻击者常用的入口点。这些不是“默认安全”,而是默认风险。
- 运行
DROP USER ''@'localhost';和DROP USER ''@'hostname';删除所有空用户名账户 - 执行
DROP database IF EXISTS test;,并确认mysql.db表中无test%权限记录 - 检查
SELECT User, Host FROM mysql.user;,确保无非预期的Host值(如%、192.168.%过宽匹配)
强制密码策略与定期轮换
弱密码是绝大多数非授权访问的起点。MySQL 5.7+ 内置了 validate_password 插件,但默认不启用,且策略等级常被设为低(LOW),形同虚设。
- 启用插件:
INSTALL PLUGIN validate_password SONAME 'validate_password.so'; - 设置强度:执行
SET GLOBAL validate_password.policy = MEDIUM;(要求至少 8 位、大小写字母、数字、特殊字符各一) - 禁止重用:设
validate_password.history = 5,防止用户循环改回旧密码 - 生产环境应配合外部密钥管理工具(如 HashiCorp Vault)实现密码自动轮换,而非人工定期修改
网络层隔离 + 绑定地址控制
MySQL 不是 Web 服务,不该暴露在公网或大内网段。哪怕有强密码和权限控制,开放 3306 端口仍会引来暴力扫描和漏洞利用(如 CVE-2012-2122)。
- 修改
my.cnf中的bind-address:从0.0.0.0改为具体内网 IP(如192.168.10.10)或127.0.0.1(仅本地) - 操作系统级防火墙必须限制:只放行可信应用服务器 IP 访问
3306,拒绝其他所有来源 - 若需远程管理,走跳板机或 ssh 隧道,而非直接开 MySQL 端口
- 注意:docker 容器中
bind-address = 0.0.0.0是常见疏忽,务必覆盖为127.0.0.1并通过-p显式映射端口
真正难的不是加几条命令,而是每次新增应用、迁移数据库、交接权限时,是否还坚持检查 mysql.user 表、是否真删掉了测试库、是否让运维同事也看到那条 bind-address 配置。加固不是一次性动作,是权限变更的每一步都得过一遍 checklist。