刚装完MySQL,第一件该干的事不是急着建库建表,而是跑一遍 mysql_secure_installation。这个脚本估计大家都见过,但说实话,很多新手跑的时候是纯“下一步机器”,每一步的英文提示到底在问什么、选了Y之后会发生什么、选N又会留下什么隐患,完全没概念。这篇就把这个脚本从执行过程到原理,从头到尾拆一遍,尽量让你跑完脚本之后,心里清楚MySQL到底被“拧紧”了哪些地方。
1. 刚装完的MySQL到底有多“裸”:为什么要先跑安全初始化
1.1 默认状态下的四个高危入口
用包管理器或官方仓库装完MySQL之后,服务能起来,但你如果直接看初始状态,会发现这东西基本等于门没锁:
- 可能存在匿名账号(
user=''),也就是说,本机任何用户不需要用户名密码,直接执行mysql就能连进数据库。这不是开玩笑,早期版本确实是这样。 - root账号访问控制很松。在某些安装方式下,root的密码为空,或者走的是本机
auth_socket认证,只要能ssh到服务器,你就是root。 - 自带一个对所有人开放的
test库。默认授权表里,test库和test_%开头的库被授权给了匿名用户,别人连上来第一件事可能就是拿test库做跳板。 - 如果服务监听了公网地址,3306端口一暴露,扫描器发现MySQL版本后,最先尝试的就是空密码、root/root、root/123456这一类组合。
这四个问题单看都是小毛病,合在一起就是灾难。很多“MySQL被入侵”的案例,回溯一下,根本原因就是新装完没跑安全初始化,匿名账号加空密码,等于给攻击者递钥匙。
1.2 脚本那五件事,其实是五道安全闸门
mysql_secure_installation 一共做五件事,我习惯把它理解成五道闸门:
- 设置或确认root密码,并视情况启用密码强度校验组件;
- 删除匿名账号;
- 禁止root远程登录;
- 删除test库及其访问权限;
- 刷新权限表,让前面的修改立即生效。
前四道关掉高危入口,第五道是确保修改落地。后面我会按执行顺序,把每一步的交互提示和你应该怎么选,逐个讲清楚。
有一个容易被忽略的点:这个脚本默认是交互式执行,它不会偷偷改你已经存在的数据,也不会帮你配置远程访问、修改端口、加固防火墙。它的边界非常明确,只管上面五件事。有些人以为跑完脚本数据库就“绝对安全”了,那是误解。它只是把默认安装里明显不合理的权限入口封住。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 交互式执行全流程:每一步提示到底让你干什么
2.1 前置条件:服务先起来,别卡在socket连接上
跑脚本之前,MySQL服务必须已经在运行。很多人一执行 mysql_secure_installation 就报下面这个错:
code复制ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
这个报错的意思是:脚本想通过Unix socket连本机的MySQL,但 /tmp/mysql.sock 这个socket文件不存在。MySQL连本机默认不走TCP,而是走socket文件,文件可能不在 /tmp 下。
排查顺序我建议这样:
- 先确认服务真的起来了:
systemctl status mysqld,或者ps -ef | grep mysqld; - 看进程有没有监听端口:
ss -lntp | grep 3306; - 找一下socket文件实际在哪:
find / -name "*.sock" 2>/dev/null | grep -i mysql; - 如果文件在
/var/lib/mysql/mysql.sock之类的位置,脚本应该能自动找到;如果脚本读的是默认路径,就用mysql_secure_installation --socket=/var/lib/mysql/mysql.sock指定一下。
不同安装方式的默认路径差异很大。Ubuntu的deb包默认的是 /var/run/mysqld/mysqld.sock,RHEL/CentOS的yum包默认是 /var/lib/mysql/mysql.sock,源码编译的默认经常是 /tmp/mysql.sock。这不是脚本本身的bug,是你没有提前确认环境的socket路径。脚本最开始会尝试用 mysqladmin 去探测连接,socket连不上就直接退出,不会给你慢慢检查的机会。
2.2 第一步:root密码与密码校验策略
脚本启动后,第一段提示通常是这样:
code复制Securing the MySQL server deployment.
Connecting to MySQL using a blank password.
如果你能直接进到这一步,说明当前root是空密码或者走socket免密认证。接下来它会问你是否设置root密码:
code复制VALIDATE PASSWORD COMPONENT can be used to test passwords
and improve security. ...
Do you wish
