导语
很多站长认为数据库只要做了备份就安全,但现实是:攻击者只要拿到一个弱口令、一个暴露的 3306 端口,或一个存在注入的接口,就能把整个库拖走。今天这篇教程,带你把 MySQL 加固到企业级标准,全程可落地、可直接复制。
一、先盘点:你的 MySQL 有哪些致命隐患?
动手前先自查 5 个高危点,命中任意一个都意味着数据库随时可能沦陷:
- root 密码为空或弱口令:最常见的翻车原因,爆破脚本几秒就能撞开;
- 3306 端口对公网开放:等于把数据库大门挂到互联网上,天天被全球扫描器问候;
- 存在匿名账户和 test 测试库:安装时默认创建的这些是拖库捷径;
- 应用账号权限过大:网站程序只需增删改查,却给了 ALL PRIVILEGES;
- 明文传输:未开启 SSL,数据在链路上裸奔,中间人可截获。
确认隐患后,按”基础加固 → 高级防护 → 日常巡检”三步走,把漏洞逐个堵死。
二、基础安全加固:安装后必做的 5 项配置
1. 运行安全初始化脚本
MySQL 5.7+ 自带初始化脚本,一键清除匿名用户、测试库并设置 root 密码:
mysql_secure_installation
# 依次选择:设置 root 强密码 → y 删除匿名用户
# → y 禁止 root 远程登录 → y 删除测试库 → y 刷新权限
2. 修改端口并限制监听地址
把 3306 换成非常见端口并只监听内网,避开公网扫描:
vim /etc/my.cnf # 或 /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
port = 3307 # 更换默认端口
bind-address = 127.0.0.1 # 仅本机监听,局域网访问改为内网 IP
systemctl restart mysqld
3. 建立业务账号,权限最小化
永远不要用 root 跑业务,为每个应用单独建号、授予最小权限:
CREATE USER 'webapp'@'localhost' IDENTIFIED BY 'Str0ng!Passw0rd';
GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* TO 'webapp'@'localhost';
FLUSH PRIVILEGES;
# 用 SHOW GRANTS 逐账号核查权限
SHOW GRANTS FOR 'webapp'@'localhost';
# 账号列表可在宝塔面板 → 数据库 → 权限管理中查看
4. 启用密码强度校验与失败锁定
开启密码策略插件与失败登录锁定,让暴力破解失效:
INSTALL PLUGIN validate_password SONAME 'validate_password.so';
SET GLOBAL validate_password_policy = 'STRONG';
SET GLOBAL validate_password_length = 12;
# MySQL 8.0+:连续 5 次失败锁定 30 分钟
INSTALL PLUGIN connection_control SONAME 'connection_control.so';
SET GLOBAL connection_control_failed_connections_threshold = 5;
SET GLOBAL connection_control_min_connection_delay = 1800000;
5. 关闭 LOCAL INFILE 与限制导入导出
[mysqld]
local_infile = 0 # 禁用 LOAD DATA LOCAL INFILE,防止读取服务器文件
secure_file_priv = /var/lib/mysql-files
三、高级防护:SSL 加密、审计与防火墙白名单
6. 开启 SSL 加密连接
即使只在内网,也要开启 SSL 防止数据被截获:
openssl req -newkey rsa:2048 -nodes -keyout mysql-key.pem \
-x509 -days 365 -out mysql-cert.pem
[mysqld]
ssl-cert = /etc/mysql/mysql-cert.pem
ssl-key = /etc/mysql/mysql-key.pem
require_secure_transport = ON # 强制所有连接走 SSL
# 应用侧连接指定
mysql -h 127.0.0.1 -u webapp -p --ssl-mode=REQUIRED
7. 开启审计日志与 binlog
[mysqld]
general_log = ON
general_log_file = /var/log/mysql/audit.log # 记录所有语句,入侵排查利器
log_bin = /var/log/mysql/mysql-bin
binlog_format = ROW
expire_logs_days = 15
8. 防火墙层:数据库端口只对可信来源开放
# 宝塔面板:防火墙放行 3307 仅限指定 IP
# firewalld 命令行方式:
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" \
source address="192.168.1.0/24" port protocol="tcp" port="3307" accept'
firewall-cmd --reload
四、日常巡检与应急要点
- 每周检查账号权限:用
SHOW GRANTS FOR 'webapp'@'localhost';逐账号核查,陌生账号立即删除; - 监控异常连接:
SHOW PROCESSLIST;发现异常会话立刻排查; - 坚持异地备份:
mysqldump --single-transaction -u root -p mydb | gzip > /backup/mydb_$(date +%F).sql.gz,配合 binlog 可精确恢复; - 及时升级版本:关注官方安全公告,严重漏洞发布后尽快升级。
总结
数据库安全没有一劳永逸,但把上面 8 项配置全部落地后,你的 MySQL 已能挡住 99% 的常规攻击:弱口令撞库、端口扫描、注入拖库、中间人截获统统失效。没有专职运维的站长,也可以把应用与数据库整体托管到专业防护服务上——速度网络提供高防 CDN、云 WAF 与 DDoS/CC 攻击防护,7×24 小时值守,源站隐藏与入侵拦截一体化,把安全交给专业团队。
