MySQL 5.7+ 安装后须立即重置root密码、禁用空密码登录、删除匿名用户和test库、限制root远程访问、创建最小权限应用账号、启用密码策略与TLS加密。
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
MySQL 初始化时可能创建 ''@'localhost' 这类匿名用户,且保留 test 数据库——两者均无实际用途,却常被扫描工具利用为攻击跳板。
DROP USER ''@'localhost';
DROP DATABASE IF EXISTS 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@localhost 必须禁止从任意主机连接(即禁用 root@'%'),所有业务操作应通过专用账号完成,且该账号只拥有对应数据库的必要权限(如仅 SELECT,INSERT,UPDATE)。
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
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 状态),否则配置会静默失效。