针对MySQL弱密码的安全加固,需要从密码策略、访问控制、权限管理和日常运维四个层面系统性地进行。这不是单一操作,而是一套完整的配置方案,目标是构建一个“进不来、拿不走、改不了”的安全防护体系。
MySQL数据库弱密码情况下,存在以下高风险安全隐患:
- 用户密码为空(空口令);
- 用户密码为弱口令(如
123456、test等); - 用户密码与用户名相同。
- 老式的native加密机制
- 默认账户与测试库未清理
- 传输通道未加密
这些使得数据库极易遭受暴力破解、撞库攻击或权限越权利用,严重威胁业务数据的安全性与完整性。需要采取一套系统性的加固方案。最简单的入手方式是使用官方安全脚本,再配合密码插件、加密配置等步骤,逐一封堵每个风险点。
1.检查所有数据库账户
关于“弱口令”和“用户名与密码相同”的检测,MySQL 自身并未内置相关功能,需要借助外部工具或自定义脚本来实现。
# 检查空密码账户
SELECT user, host FROM mysql.user WHERE authentication_string = '' OR LENGTH(authentication_string) = 0;
# 查看是否启用了密码验证插件
SHOW VARIABLES LIKE 'validate_password%';
2.清理高风险账户
删除或加固空密码账户
# 或直接删除不必要的账户
DROP USER '用户'@'host';
# 删除匿名用户(如果存在)
DROP USER '用户'@'localhost';
DROP USER '用户'@'%';
# 为空密码账户设置强密码(替换'user'@'host'为实际账户)
ALTER USER 'user'@'host' IDENTIFIED BY 'P@ssw0123rd!2026';
#刷新策略:
FLUSH PRIVILEGES;
3.限制root账户远程登录
# 删除允许远程登录的root账户(保留root@localhost)
DELETE FROM mysql.user
WHERE user = 'root' AND host NOT IN ('localhost', '127.0.0.1', '::1');
4.安装并配置默认验证插件
# 安装插件(MySQL 5.7)
INSTALL PLUGIN validate_password SONAME 'validate_password.so';
安装组件(MySQL 8.0)
INSTALL COMPONENT 'file://component_validate_password';
# 确认插件/组件状态
SHOW VARIABLES LIKE 'validate_password%';
| 变量名 | 默认值 | 说明 |
|---|---|---|
| validate_password.policy | MEDIUM | 策略等级:0=LOW, 1=MEDIUM, 2=STRONG |
| validate_password.length | 12 | 密码最小长度 |
| validate_password.mixed_case_count | 1 | 至少需要的大小写字母数量(各1个) |
| validate_password.number_count | 1 | 至少需要数字数量 |
| validate_password.special_char_count | 1 | 至少需要特殊字符数量 |
| validate_password.check_user_name | ON | 是否禁止密码包含用户名 |
配置密码策略参数
| 等级 | 值 | 检查内容 |
|---|---|---|
| LOW | 0 | 仅检查密码长度 |
| MEDIUM | 1 | 长度 + 数字 + 大小写字母 + 特殊字符 |
| STRONG | 2 | MEDIUM + 字典文件检查(禁止常见单词) |
# 设置密码策略级别:MEDIUM 或 STRONG
SET GLOBAL validate_password.policy = 'MEDIUM';
# 设置密码最小长度(建议12位以上)
SET GLOBAL validate_password.length = 12;
# 禁止密码与用户名相同
SET GLOBAL validate_password.check_user_name = 'ON';
# 设置数字、大小写字母、特殊字符的最小数量
SET GLOBAL validate_password.number_count = 1;
SET GLOBAL validate_password.mixed_case_count = 1;
SET GLOBAL validate_password.special_char_count = 1;
my.ncf配置参数持久化:
[mysqld]
# 密码验证插件配置
plugin-load-add=validate_password.so
validate_password_policy=MEDIUM
validate_password_length=12
validate_password_number_count=1
validate_password_mixed_case_count=1
validate_password_special_char_count=1
validate_password_check_user_name=ON
5.配置密码过期策略
在密码过期状态下,只能执行修改密码的命令,其他所有操作(SELECT、INSERT、UPDATE、SHOW等)都会被拒绝。
# 设置全局密码过期时间(90天)
SET GLOBAL default_password_lifetime = 90;
# 为特定用户设置密码过期
ALTER USER 'app_user'@'localhost' PASSWORD EXPIRE INTERVAL 90 DAY;
# 立即强制用户修改密码
ALTER USER 'app_user'@'localhost' PASSWORD EXPIRE;
# 持久化配置(my.cnf)
[mysqld]
default_password_lifetime = 90
6.检查加固清单
| 检查项 | 验证方法 |
|---|---|
| 无空密码账户 | SELECT user,host FROM mysql.user WHERE authentication_string=’’ |
| 密码策略已启用 | SHOW VARIABLES LIKE ‘validate_password%’ 返回非空 |
| 禁止密码与用户名相同 | validate_password_check_user_name=ON |
| 密码最小长度≥12 | validate_password_length ≥ 12 |
| test数据库已删除 | SHOW DATABASES 无test库 |
| 匿名用户已删除 | SELECT user,host FROM mysql.user WHERE user=’’ 空集 |
7.官方指导脚本
mysql8.0开始提供脚本可以按照官方的指导,进行安全加固
运行安全脚本:执行 mysql_secure_installation 交互脚本。它会引导你完成以下关键设置:设置root密码、移除匿名用户、禁止root用户远程登录、删除test数据库。这是最简单有效的第一步。
总结
安全是一个持续的过程,而非一次性配置。可以启动审计日志,持续观察,稳固数据库的安全防线。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




