MySQL新装好,很多教程在服务启动那一行就收尾了,剩下的全交给开发者自由发挥。我第一次独立搭测试环境时也是这个流程:装完MySQL,mysql -uroot直接就能登进去,没有密码,好像一切都理所当然。直到有一次内网被扫描漏出了3306端口,看到日志里铺天盖地的暴力破解尝试,才想起MySQL明明自带了一个几乎被所有人忽略的mysql_secure_installation安全脚本,它能一次性收紧默认安装留下的各种权限漏洞。这篇文章就把这个脚本的完整执行过程拆开讲讲,包括每个选项背后的真实含义、会改动哪些底层账号和权限表,以及生产环境里怎么用才不会翻车。
mysql_secure_installation 是MySQL官方提供的交互式安全加固脚本,从MySQL 5.7到8.0都内置在发行版里,主要解决一个问题:MySQL默认安装后权限过于宽松,适合在局域网内跑通,但直接暴露在真实网络环境中处处是坑。下面我会按照实际执行时的问答顺序逐条解释,不跳坑不缩写,把每个选择都讲透。
1. 装完MySQL的那几分钟,默认状态有多危险
很多MySQL安装教程的环境准备阶段会直接让你跳过初始化安全配置,因为这对第一次上手的人来说不友好。但一个没有加固过的MySQL实例,风险通常集中在四个方面:root账户没有安全密码、存在匿名账号、默认携带test数据库、root允许远程登录。
先说root账户密码的问题。通过安装包或官方yum仓库装好的MySQL,在部分环境里root初始密码为空,或者只在日志里有临时密码。空密码意味着只要MySQL监听的端口能通到,任何知道用户名的连接方都可以尝试直接登录,不需要任何认证。即便有密码,也经常是root、123456这种能在字典里被快速打中的弱口令。
其次是匿名账号。MySQL系统表mysql.user内可能出现User=''的账户,这类账户也叫匿名用户。它存在的意义追溯到早期MySQL版本,用于让本地用户不带用户名也能连上服务。但如果你在一个真实的网络环境里,匿名用户往往意味着任何能连到3306端口的客户端都能以匿名身份建立会话,再配合其他漏洞,它就是一条低成本的踩点路径。
第三,长期存在的test数据库。MySQL安装时默认创建一个名为test的数据库,目的是方便新手测试。但test库默认可以被所有账号访问。如果你根本没在使用它,它就是一个多余的资源占用和信息泄露窗口。
第四,root远程登录。不少发行版会用root@'%'或root@'192.168.%'这类宽泛主机匹配创建账号,为的是方便管理员从工作站远程管理和运维。然而数据库的超管账户并不适合这样暴露在网络上,因为攻击者一旦拿到root口令,等待你的就是拖库或者直接篡改所有数据。
当初我把一套开发库部署到公网测试机上,配置MySQL时确实在文档里看到了mysql_secure_installation这个命令,但赶进度随手跳过了。后来被爆破日志教育了一顿才意识到,MySQL本身提供的这个加固脚本,就是针对上面四个问题逐个处理的,运行一次就能把绝大多数默认风险关在门外。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 执行前先看一眼你的环境,脚本到底能改哪些东西
磨刀不误砍柴工,先理解这个脚本会动哪些系统资源,再去执行它,会安心很多。mysql_secure_installation的本质是一组经过封装的安全配置步骤,内部通过SQL语句直接修改MySQL的系统权限表,包括mysql.user、mysql.db等,同时会按需触发部分插件的安装流程。
2.1 脚本执行前最值得做的检查清单
在执行脚本之前,建议先确认几点。
排查当前root是否可以无密码登录。我习惯先跑一次mysql -uroot,如果直接进入MySQL命令行而没有提示密码,说明root目前处于空密码状态。此时执行脚本会要求先设置root密码,这是第一个要处理的环节。如果root已有密码且版本是5.7+,那么执行时需要手动输入当前root密码才能继续。
确认当前是不是业务高峰期或生产环境。如果你连的是一个正在对外提供服务的实例,脚本的某些改动是即时生效的。比如移除匿名用户、删除test库、禁止root远程登录,这些动作会改变现有连接能使用的账号范围。尽管大多数业务账号不会被影响,依然建议在变更窗口执行,并在重大生产实例上提前备份mysql库或者全库。
对于存放大量业务数据的环境,即便不是高峰期我也建议先做一次物理备份再继续。理由很简单,脚本涉及对系统表的写操作,虽然逻辑上不会直接删除业务数据,但操作前有备份意味着万一出现权限误改,还有一条完整的退路。如果是一台刚安装完、还没有任何业务数据的MySQL,那么在安装步骤一气呵成后直接跑脚本,反而是最好的时机。
