MySQL 装完第一件事:安全初始化
发布时间:2026-02-14 22:04       
更新时间:2026-02-15 14:37
刚装完的 MySQL 是一份出厂设置:root 可能没有密码、匿名账号还在、test 库对所有人开放。数据导进去之前,先把 mysql_secure_installation 跑一遍,五分钟,省掉后面的大隐患。
## 一、跑起来
```
mysql_secure_installation
```
交互式向导,一路按提示确认。太弱的密码会被要求重设,照着提示来就行。每一项在问什么,下面逐条说清楚。这些默认项在老版本里更宽松,版本越老,越要把向导完整跑一遍。
## 二、每一项在问什么
密码强度组件:问要不要启用密码复杂度策略,对外服务建议启用,内网测试库可以不启用。
设置 root 密码:必做,密码强度按上面的策略来。
移除匿名用户:匿名账号允许不登录直接连接,选移除。个别发行版装完本来就没有匿名账号,向导直接跳过这一步,属正常现象。
禁止 root 远程登录:选是。root 只保留本机使用,远程需求用普通账号解决。
删除 test 库:test 库默认人人可写,删掉并收回权限。
## 三、验证结果
```
mysql -uroot -p -e "SELECT user,host FROM mysql.user;"
```
检查两点:列表里没有用户名为空的账号;root 的 host 是 localhost 或 127.0.0.1,而不是 %。顺手跑一遍 SHOW GRANTS FOR 'root'@'localhost',确认没有多余的全库授权。
## 四、初始化之后再补两件事
给应用建专用账号,只授它用到的库和操作:
```
CREATE USER 'app'@'localhost' IDENTIFIED BY '强密码';
GRANT SELECT,INSERT,UPDATE,DELETE ON appdb.* TO 'app'@'localhost';
```
应用不用 root 连库,就算应用被入侵,损失也被限制在这一个库的这几类操作里。账号建好用 SHOW GRANTS FOR 'app'@'localhost' 复核一遍授权范围,每一行权限都该叫得出用途。另一件事是确认监听和防火墙:bind-address 保持 127.0.0.1,云服务器上再检查安全组,3306 端口不要对公网开放。确实要临时开放给某个公网地址做管理,用完立刻收回,长期的例外都会变成常驻的后门。应用配置里的数据库连接信息,文件权限同样收紧到运行用户可读。
安全初始化漏掉的机器,等于把端口开放给全网扫描器。装完就跑,跑完再导数据,顺序别反。