MySQL数据库漏洞防护措施实战:从检查到加固全流程
为什么MySQL数据库漏洞防护不能等?
很多新手买完服务器,装上MySQL后就直接用默认配置跑业务。
但网络上的扫描工具和攻击脚本一直在寻找未打补丁的MySQL数据库,一旦命中,轻则数据被删,重则被勒索或拖库。MySQL数据库漏洞防护措施并不是锦上添花,而是保障服务器正常运行的基本操作。 下面我们从零开始,分成几步彻底把漏洞堵上。
动手前需要准备什么?
- 一台已安装MySQL的Linux服务器(本文以CentOS 7/Ubuntu 20.04为例)
- 拥有root或sudo权限的账号
- 能通过SSH连接服务器(或者你用的宝塔/1Panel等面板,也能直接执行命令)
- 记录下当前MySQL的root密码(如果忘记,需要先重置)
如果你用的是宝塔面板,操作路径大同小异:在“数据库”页面可以执行SQL,但建议直接进入终端执行命令,更灵活。
第一步:检查当前MySQL版本及已知漏洞
登录服务器,先查看MySQL版本:
mysql -V
# 或者进入MySQL后执行:
SHOW VARIABLES LIKE 'version';
记录版本号(例如8.0.28)。
然后去 MySQL官方安全公告页面 或直接用 searchsploit 工具搜一下该版本是否存在高危漏洞。
如果版本过旧(比如5.6、5.7的低版本),CVE漏洞列表里往往有好几个严重级别的项。
执行检查命令(安全扫描):
# 安装 lynis 安全审计工具(可选)
wget https://downloads.cisofy.com/lynis/lynis-3.0.9.tar.gz
tar -xzf lynis-3.0.9.tar.gz && cd lynis
./lynis audit system --test-from-group mysql
lynis 会给出数据库相关的漏洞和配置建议。
如果你不想装第三方工具,直接看下一步手动加固。
第二步:修补已知漏洞——升级MySQL到最新稳定版
升级是最直接、最彻底的MySQL数据库漏洞防护措施。
以下命令演示在Ubuntu上更新:
# 添加MySQL官方APT源(获取最新版本)
wget https://dev.mysql.com/get/mysql-apt-config_0.8.24-1_all.deb
sudo dpkg -i mysql-apt-config_0.8.24-1_all.deb
sudo apt update
sudo apt install mysql-server
CentOS用户请用:
# 移除旧版MySQL或MariaDB
sudo systemctl stop mysqld
sudo yum remove mysql-server
# 添加MySQL Yum源
wget https://dev.mysql.com/get/mysql80-community-release-el7-7.noarch.rpm
sudo rpm -ivh mysql80-community-release-el7-7.noarch.rpm
sudo yum install mysql-community-server
升级后务必重启并登录验证:
sudo systemctl restart mysqld
mysql -u root -p
SELECT VERSION();
看到版本号变为最新(如8.0.37),说明漏洞补丁已打上。
第三步:加固配置与账号权限(堵住常见漏洞入口)
很多MySQL漏洞并非代码问题,而是配置不当导致。
以下几项是必须处理的:
1. 移除匿名账户和空密码账户
-- 查看是否有匿名用户或空密码
SELECT User, Host, authentication_string FROM mysql.user WHERE User='' OR authentication_string='';
-- 删除匿名用户
DELETE FROM mysql.user WHERE User='';
-- 强制空密码用户设置密码
ALTER USER 'emptyuser'@'localhost' IDENTIFIED BY '新强密码';
2. 关闭不需要的远程访问
-- 只允许本地登录(除非业务必要)
UPDATE mysql.user SET Host='localhost' WHERE User='root';
FLUSH PRIVILEGES;
3. 限制应用账号权限(最小权限原则)
如果网站或应用使用单独的数据库账号,不要给它ALL PRIVILEGES,只给必要权限:
GRANT SELECT, INSERT, UPDATE, DELETE ON 业务库.* TO 'appuser'@'localhost';
-- 绝对不要 GRANT ALL 或 SUPER 权限给普通应用
4. 修改MySQL默认端口(非必须,但能减少扫描攻击)
编辑配置文件 /etc/mysql/my.cnf(或 /etc/my.cnf),找到 port=3306 改为其他端口(如 13306):
[mysqld]
port=13306
改完后重启MySQL,并在防火墙放行新端口。
避坑:新手常犯的三个错误
错误1:升级后忘记执行 mysql_upgrade
从低版本跨版本升级后,系统表可能需要更新。
执行:
sudo mysql_upgrade -u root -p
sudo systemctl restart mysqld
不执行可能导致部分功能异常甚至无法启动。
错误2:删除了root账户但没保留备用账号
如果你想在本地只保留一个应用账号,请先在MySQL里创建一个拥有全部权限的备用管理员:
CREATE USER 'admin'@'localhost' IDENTIFIED BY '复杂密码';
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost' WITH GRANT OPTION;
错误3:升级后忘记更新防火墙规则
如果你改了端口,记得在iptables或firewalld里放行新端口,否则应用连不上数据库。
验证:我的MySQL漏洞防护措施生效了吗?
执行以下检查清单,逐条勾选:
SELECT VERSION();—— 版本是最新的(例如8.0.37)SELECT User, Host FROM mysql.user;—— 没有匿名用户和不需要的远程账户SHOW VARIABLES LIKE 'port';—— 端口不是默认3306(如果你改了)- 尝试用root从远程服务器登录:
mysql -h 你的IP -u root -p—— 应该被拒绝 - 查看MySQL错误日志:
sudo tail -50 /var/log/mysql/error.log—— 没有大量连接错误或已知漏洞警告
如果以上全部通过,说明你的MySQL数据库漏洞防护措施已经落地。
建议每季度重复一次版本检查和权限审计,把安全变成日常习惯。
如果你在操作中遇到报错(如“Access denied”或“mysqld服务无法启动”),优先回看本文的避坑部分,或者检查命令是否有拼写错误。
数据库安全没有一劳永逸,但只要跟着步骤走一遍,就能挡住90%的初级攻击。