如何将MySQL数据库设置密码的格式修改成复杂且难以破解的形式?
- 内容介绍
- 文章标签
- 相关推荐
在当今网络安全形势下数据库密码往往成为攻击者的首要目标。若密码过于简单,攻击者可以通过字典攻击、暴力甚至彩虹表轻易获取访问权限。进而导致数据泄露、业务中断甚至金钱损失。
1️⃣ 先了解痛点:为什么要改成复杂难?
常见的弱点包括:
- 长度不足
- 仅使用数字或字母
- 与使用者名相同或包含使用者名逆序
- 使用常见词典词汇
这些都让密码极易被猜测。按理说,强制执行复杂度规则能有效阻止上述攻击。
2️⃣ 开启 MySQL 的 validate_password 插件
从 MySQL 5.7 开始。默认提供了 validate_password 插件,用于检查并强制执行密码复杂度。
安装插件
INSTALL PLUGIN validate_password SONAME 'validate_password.so';SHOW VARIABLES LIKE 'validate_%';
查看当前设置
+-------------------------------------------+-------+
| Variable_name | Value |
+-------------------------------------------+-------+
| validate_password_check_user_name | OFF |
| validate_password_dictionary_file | |
| validate_password_length | 4 |
| validate_password_mixed_case_count | 1 |
| validate_password_number_count | 1 |
| validate_password_policy | MEDIUM|
| validate_password_special_char_count | 1 |
+-------------------------------------------+-------+
7 rows in set
3️⃣ 配置密码复杂度策略
a) 全局参数调整
SET GLOBAL validate_password_policy = 'MEDIUM';-- LOW / MEDIUM / STRONG
SET GLOBAL validate_password_length = 12;SET GLOBAL validate_password_mixed_case_count = 4;SET GLOBAL validate_password_number_count = 4;SET GLOBAL validate_password_special_char_count = 4;话说回来,-- 若需要禁止包含使用者名。可开启以下参数:
SET GLOBAL validate_password_check_user_name = ON;怎么说呢,-- 禁用字典检查
SET GLOBAL validate_password_dictionary_file = '';
b) 重启 MySQL 服务以使配置持久化:
sudo systemctl restart mysql # 或 mysqld,根据发行版而定
4️⃣ 创建或修改使用者密码
a) 登录 MySQL 并创建新使用者:
mysql -u root -p
CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'Str0ngP@ssw0rd!',GRANT ALL PRIVILEGES ON database_name.* TO 'newuser'@'localhost';FLUSH PRIVILEGES;EXIT,
b) 修改已有使用者的密码:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyP@ssw0rd!2024',FLUSH PRIVILEGES;END,
如果尝试设置太弱的密码,例如 `'12345678'` 或 `'root1234'`。程序会返回错误:
ERROR 1819 : Your password does not satisfy current policy requirements
这正说明政策已生效。
5️⃣ 授权新使用者访问特定数据库示例
GRANT SELECT。INSERT,UPDATE ON database_name.* TO 'newuser'@'localhost';其实,FLUSH PRIVILEGES;
只授予必要权限能减少风险,即使凭证泄漏也不会导致全库访问。
6️⃣ 安全提示 & 常见问题处理
- 远程访问注意事项: 如果你想从远程主机连接,请将 `localhost` 替换为对应 IP 或域名。并确保防火墙已开放 MySQL 默认端口 `3306` .
- 避免将明文密码写入脚本: 使用环境变量或安全存储服务来注入密码,而非硬编码。
- 定期更换密码: 至少每 90 天更新一次以降低被盗风险。
- Bcrypt 示例:
- `$2y$10$abc123$` 表示:Bcrypt、成本因子 10、盐值 `abc123`、加密后字符串。
& 接下来行动 🚀
A. 立即确认插件已安装并启用 B. C. 为所有关键账户重新设置符合策略的强密码 D. 开启日志审计监控,及时发现异常登录尝试 E. 定期审核权限与配置变更记录
*以上操作基于本地连接 MySQL;不过,如需远程,请把 `localhost` 替换为对应 IP/域名。并确认网络安全策略允许此连接。*
在当今网络安全形势下数据库密码往往成为攻击者的首要目标。若密码过于简单,攻击者可以通过字典攻击、暴力甚至彩虹表轻易获取访问权限。进而导致数据泄露、业务中断甚至金钱损失。
1️⃣ 先了解痛点:为什么要改成复杂难?
常见的弱点包括:
- 长度不足
- 仅使用数字或字母
- 与使用者名相同或包含使用者名逆序
- 使用常见词典词汇
这些都让密码极易被猜测。按理说,强制执行复杂度规则能有效阻止上述攻击。
2️⃣ 开启 MySQL 的 validate_password 插件
从 MySQL 5.7 开始。默认提供了 validate_password 插件,用于检查并强制执行密码复杂度。
安装插件
INSTALL PLUGIN validate_password SONAME 'validate_password.so';SHOW VARIABLES LIKE 'validate_%';
查看当前设置
+-------------------------------------------+-------+
| Variable_name | Value |
+-------------------------------------------+-------+
| validate_password_check_user_name | OFF |
| validate_password_dictionary_file | |
| validate_password_length | 4 |
| validate_password_mixed_case_count | 1 |
| validate_password_number_count | 1 |
| validate_password_policy | MEDIUM|
| validate_password_special_char_count | 1 |
+-------------------------------------------+-------+
7 rows in set
3️⃣ 配置密码复杂度策略
a) 全局参数调整
SET GLOBAL validate_password_policy = 'MEDIUM';-- LOW / MEDIUM / STRONG
SET GLOBAL validate_password_length = 12;SET GLOBAL validate_password_mixed_case_count = 4;SET GLOBAL validate_password_number_count = 4;SET GLOBAL validate_password_special_char_count = 4;话说回来,-- 若需要禁止包含使用者名。可开启以下参数:
SET GLOBAL validate_password_check_user_name = ON;怎么说呢,-- 禁用字典检查
SET GLOBAL validate_password_dictionary_file = '';
b) 重启 MySQL 服务以使配置持久化:
sudo systemctl restart mysql # 或 mysqld,根据发行版而定
4️⃣ 创建或修改使用者密码
a) 登录 MySQL 并创建新使用者:
mysql -u root -p
CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'Str0ngP@ssw0rd!',GRANT ALL PRIVILEGES ON database_name.* TO 'newuser'@'localhost';FLUSH PRIVILEGES;EXIT,
b) 修改已有使用者的密码:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyP@ssw0rd!2024',FLUSH PRIVILEGES;END,
如果尝试设置太弱的密码,例如 `'12345678'` 或 `'root1234'`。程序会返回错误:
ERROR 1819 : Your password does not satisfy current policy requirements
这正说明政策已生效。
5️⃣ 授权新使用者访问特定数据库示例
GRANT SELECT。INSERT,UPDATE ON database_name.* TO 'newuser'@'localhost';其实,FLUSH PRIVILEGES;
只授予必要权限能减少风险,即使凭证泄漏也不会导致全库访问。
6️⃣ 安全提示 & 常见问题处理
- 远程访问注意事项: 如果你想从远程主机连接,请将 `localhost` 替换为对应 IP 或域名。并确保防火墙已开放 MySQL 默认端口 `3306` .
- 避免将明文密码写入脚本: 使用环境变量或安全存储服务来注入密码,而非硬编码。
- 定期更换密码: 至少每 90 天更新一次以降低被盗风险。
- Bcrypt 示例:
- `$2y$10$abc123$` 表示:Bcrypt、成本因子 10、盐值 `abc123`、加密后字符串。
& 接下来行动 🚀
A. 立即确认插件已安装并启用 B. C. 为所有关键账户重新设置符合策略的强密码 D. 开启日志审计监控,及时发现异常登录尝试 E. 定期审核权限与配置变更记录
*以上操作基于本地连接 MySQL;不过,如需远程,请把 `localhost` 替换为对应 IP/域名。并确认网络安全策略允许此连接。*

