修改 root 默认密码并禁用空密码登录
MySQL 5.7+ 安装后若未显式设置密码,
root@localhost可能处于无密码或临时密码状态(临时密码在
/var/log/mysqld.log中),这直接构成高危入口。必须立即重置并拒绝空密码认证。 先用临时密码登录:
mysql -u root -p,输入日志中找到的临时密码 执行:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'YourStrongPass123!';刷新权限:
FLUSH PRIVILEGES;确认空密码用户已清除:
SELECT user,host,authentication_string FROM mysql.user WHERE authentication_string = '' OR authentication_string IS NULL;,若有结果需手动
DROP USER或
SET PASSWORD
删除默认匿名用户与 test 数据库
MySQL 初始化时可能创建
''@'localhost'这类匿名用户,且保留
test数据库——两者均无实际用途,却常被扫描工具利用为攻击跳板。 删匿名用户:
DROP USER ''@'localhost';删 test 库(若存在):
DROP DATABASE IF EXISTS test;移除 test 相关权限记录:
DELETE FROM mysql.db WHERE Db LIKE 'test%' OR Db LIKE '\_test%'; FLUSH PRIVILEGES;验证:
SELECT user,host FROM mysql.user;应仅剩明确授权的用户;
SHOW DATABASES;不应含
test
限制 root 远程访问并创建最小权限应用账号
生产环境
root@localhost必须禁止从任意主机连接(即禁用
root@'%'),所有业务操作应通过专用账号完成,且该账号只拥有对应数据库的必要权限(如仅
SELECT,INSERT,UPDATE)。 检查远程 root:
SELECT host,user FROM mysql.user WHERE user='root' AND host!='localhost';,如有则
DROP USER 'root'@'xxx';新建应用账号(示例):
CREATE USER 'app_user'@'10.20.30.%' IDENTIFIED WITH mysql_native_password BY 'AppPass456!';授最小权限:
GRANT SELECT,INSERT,UPDATE ON myapp_db.* TO 'app_user'@'10.20.30.%'; FLUSH PRIVILEGES;避免使用
GRANT ... ON *.*或
WITH GRANT OPTION,除非有强审计需求
启用强制密码策略与连接加密
默认 MySQL 允许弱密码且明文传输认证信息,必须通过配置层加固。关键参数需写入
/etc/my.cnf的
[mysqld]段并重启服务。 启用密码复杂度:
validate_password.policy=STRONG validate_password.length=12 validate_password.mixed_case_count=1 validate_password.number_count=1 validate_password.special_char_count=1强制 TLS 连接(要求客户端支持):
require_secure_transport=ON ssl_mode=REQUIRED ssl_cert=/var/lib/mysql/server-cert.pem ssl_key=/var/lib/mysql/server-key.pem禁用本地文件导入(防恶意读取):
local_infile=OFF(同时需在客户端连接时加
--local-infile=0) 重启后验证:
SHOW VARIABLES LIKE 'require_secure_transport';应为
ON;
STATUS;中
SSL:行应显示
Cipher in use
实际部署中,
ssl_cert和
ssl_key文件必须由可信 CA 签发或自建私有 CA 生成,不能使用 MySQL 自带的测试证书;
validate_password插件需提前确认已安装(
SHOW PLUGINS;查
validate_password状态),否则配置会静默失效。
