必须立即修改root默认密码并禁用空密码登录:先用mysqld_safe –skip-grant-tables启动,再执行alter user或update更新密码,flush privileges生效,确保plugin为mysql_native_password,删除匿名用户、test库及远程root账号,限制root仅localhost登录,创建专用管理账号并授最小权限,启用ssl、绑定内网ip、开启错误日志与binlog,严格配置secure_file_priv和local_infile。

修改 root 默认密码并禁用空密码登录
MySQL 5.7+ 安装后默认会生成一个临时 root 密码,位于 /var/log/mysqld.log(linux)或错误日志中;若跳过此步直接用空密码登录,等于裸奔。必须第一时间重置:
- 启动 MySQL 并跳过权限检查:
mysqld_safe --skip-grant-tables & - 连接后执行:
UPDATE mysql.user SET authentication_string=PASSWORD('YourStrongPass123') WHERE User='root';(MySQL 5.7)或ALTER USER 'root'@'localhost' IDENTifIED BY 'YourStrongPass123';(8.0+) - 运行
FLUSH PRIVILEGES;生效,然后重启正常服务 - 确认
plugin字段不是auth_socket(ubuntu 常见),否则密码无效:查select User, Host, plugin FROM mysql.user;,必要时改回mysql_native_password
删除匿名用户和测试数据库
安装脚本常遗留安全隐患:匿名用户(''@'localhost')、test 库、通配符主机('root'@'%')。这些是暴力扫描和提权的首选入口。
- 删匿名用户:
DROP USER ''@'localhost'; - 删测试库:
DROP database IF EXISTS test;,并删其权限记录:delete FROM mysql.db WHERE Db='test' OR Db='test_%'; - 检查远程 root:
SELECT User, Host FROM mysql.user WHERE User='root' AND Host!='localhost';,非必要一律DROP USER - 执行
FLUSH PRIVILEGES;后,用新账号重新登录验证
限制 root 登录来源并创建专用管理账号
允许 root 从任意 IP 登录('root'@'%')等于把锁孔焊死却把钥匙挂在门把手上。生产环境必须收窄访问范围。
- 只保留
'root'@'localhost',如需远程管理,新建低权限账号:CREATE USER 'admin'@'192.168.1.%' IDENTIFIED BY 'StrongPass456'; - 授最小必要权限:
GRANT SELECT, INSERT, UPDATE ON myapp.* TO 'admin'@'192.168.1.%';,避免GRANT ALL - 启用强制 SSL(若业务允许):
ALTER USER 'admin'@'192.168.1.%' require SSL; - 确认 bind-address 在
my.cnf中设为127.0.0.1或内网 IP,而非0.0.0.0
启用日志审计与定期检查配置
没日志 = 没证据。MySQL 自带的通用查询日志和慢日志不开启审计,但错误日志、二进制日志(binlog)和系统变量状态能暴露异常行为。
- 在
my.cnf中启用关键日志:log_Error = /var/log/mysql/error.log,general_log = OFF(调试外禁止开),log_bin = ON(便于追踪变更) - 检查敏感变量:
SHOW VARIABLES LIKE 'secure_file_priv';应为具体路径(如/var/lib/mysql-files/),不能是NULL或空,否则LOAD DATA INFILE可读任意文件 - 禁用本地文件导入(除非绝对需要):
SET GLOBAL local_infile = OFF;,并在启动参数加--local-infile=0 - 定期运行
mysql_secure_installation(仅限 5.7 及以前),它会自动执行上述多数操作,但 8.0+ 需手动补全
真正容易被忽略的是 secure_file_priv 和 local_infile 的组合风险——攻击者一旦拿到 SQL 注入点,这两项配置不当就可能直接读取服务器上的 /etc/passwd 或 Web 配置文件。