mysql安全加固需四步:①修改默认3306端口并更新所有客户端连接配置;②设bind-address=127.0.0.1并配防火墙;③删除'root'@'%',创建最小权限专用账号;④启用ssl加密并强制客户端使用。

检查并修改 MySQL 默认端口避免冲突
MySQL 默认监听 3306 端口,若服务器已运行其他 MySQL 实例、MariaDB 或某些数据库代理(如 ProxySQL),就会发生端口占用,启动失败时常见错误是:Can't start server: Bind on TCP/IP port: Address already in use。
实操建议:
- 先用
sudo lsof -i :3306或sudo netstat -tuln | grep :3306查看谁占用了该端口 - 确认无误后,在配置文件
/etc/mysql/my.cnf(或/etc/my.cnf)的[mysqld]段下添加:port = 3307(或其他未被占用的端口) - 注意:修改端口后,所有客户端连接(包括命令行
mysql -P 3307、应用连接字符串)都必须显式指定新端口,否则会连不上 - 重启服务前务必执行
sudo mysqld --initialize-insecure --user=mysql(仅首次初始化)或直接sudo systemctl restart mysql
限制 MySQL 监听地址增强网络隔离
默认配置中 bind-address 可能为 127.0.0.1(仅本地)或 0.0.0.0(监听所有网卡),后者若未配防火墙,等于把数据库裸露在公网,极易被暴力扫描和利用。
实操建议:
- 生产环境强烈设为
bind-address = 127.0.0.1,强制只响应本地连接;远程应用应通过跳板机、SSH 隧道或内网服务网格访问 - 若必须监听内网 IP(如
192.168.1.100),请确保该 IP 所属网卡不对外暴露,并配合系统防火墙(如ufw或iptables)放行指定源 IP:sudo ufw allow from 192.168.1.50 to any port 3306 - 禁用
skip-networking——虽然它能彻底关闭 TCP 连接,但会导致无法使用任何远程管理工具,运维成本陡增,不推荐
禁用 root 远程登录并最小化用户权限
MySQL 安装后常遗留 'root'@'%' 这类通配主机用户,一旦密码弱或泄露,攻击者可直接远程提权。即使端口受限,内部员工误配或应用漏洞也可能触发横向移动。
实操建议:
- 登录后立即执行:
DROP USER 'root'@'%';,保留仅'root'@'localhost' - 为应用创建专用账号,限定来源主机(如
'app_user'@'192.168.1.30'),并只赋予必要库表的SELECT, INSERT, UPDATE权限,不用GRANT ALL - 密码必须启用强策略:MySQL 8.0+ 可设
validate_password.policy = STRONG,并检查validate_password.length是否 ≥12 - 定期审计账号:
SELECT user, host, authentication_string FROM mysql.user;,重点关注host列含%或空值的记录
启用 MySQL 原生 SSL 加密连接
明文传输账号密码和敏感数据(如身份证、订单号)在内网也不安全,尤其当交换机被嗅探或存在中间人风险时。ssl_mode=DISABLED 是很多 ORM 默认行为,容易被忽略。
实操建议:
- 生成证书(可用 OpenSSL)后,在
my.cnf中启用:ssl-ca = /var/lib/mysql/ca.pem,ssl-cert = /var/lib/mysql/server-cert.pem,ssl-key = /var/lib/mysql/server-key.pem - 重启后验证:
SHOW VARIABLES LIKE '%ssl%';应全部为ON或显示路径;再查SHOW STATUS LIKE 'Ssl_cipher';确认非空 - 客户端连接必须显式要求加密:
mysql -u app_user -p --ssl-mode=REQUIRED;应用代码中也要设置对应参数(如 Python PyMySQL 的ssl={'ssl': {}}) - 注意:自签名证书会导致客户端报
SSL connection error: SSL is required but the server doesn't support it,此时需在客户端配置信任 CA,而非禁用 SSL
bind-address 和防火墙规则当成“二选一”——其实二者必须叠加生效;还有人以为改了端口就等于隐藏了服务,却忘了 nmap -sV -p 3307 target 依然能精准识别 MySQL 版本并发起针对性攻击。










