修改 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 配置文件。
