mysql作为常用的关系型数据库,安装完成后默认配置存在较多安全风险,直接投入使用可能导致数据泄露、非法篡改等问题,因此需要完成系统化的安全加固操作。

mysql安全加固核心操作步骤
1. 清理默认风险账户和数据库
mysql安装后会自动创建空密码的匿名账户、允许root用户从任意远程主机登录,同时自带test测试数据库,这些都需要优先处理。
首先登录mysql服务端,执行以下命令查看当前账户列表:
-- 查看所有mysql用户账户 SELECT user, host FROM mysql.user;
删除匿名账户和允许远程登录的root账户,仅保留本地登录的root账户:
-- 删除匿名账户(user为空字符串的账户) DROP USER ''@'localhost'; DROP USER ''@'%'; -- 删除允许远程登录的root账户,仅保留localhost的root DROP USER 'root'@'%'; -- 刷新权限使配置生效 FLUSH PRIVILEGES;
同时删除默认的test测试数据库,避免被攻击者利用:
-- 删除test数据库 DROP DATABASE IF EXISTS test; -- 刷新权限 FLUSH PRIVILEGES;
2. 设置强密码策略
默认的密码策略较为宽松,需要调整为强密码规则,同时给root账户设置复杂密码。
先查看当前密码策略配置:
-- 查看密码策略相关参数 SHOW VARIABLES LIKE 'validate_password%';
如果未安装密码验证插件,先安装插件:
-- 安装密码验证插件 INSTALL PLUGIN validate_password SONAME 'validate_password.so';
调整密码策略参数,要求密码长度至少8位,包含大小写字母、数字和特殊字符:
-- 设置密码最低长度为8位 SET GLOBAL validate_password.length = 8; -- 设置密码强度策略为强(要求包含大小写、数字、特殊字符) SET GLOBAL validate_password.policy = STRONG; -- 给root账户设置复杂密码,替换为实际需要的密码 ALTER USER 'root'@'localhost' IDENTIFIED BY 'MySql@2024_Secure'; -- 刷新权限 FLUSH PRIVILEGES;
3. 限制网络访问范围
默认情况下mysql可能监听所有网卡的3306端口,需要将监听范围限制为仅本地或者指定可信IP,减少暴露面。
修改mysql配置文件my.cnf(Linux系统路径通常为/etc/my.cnf,Windows系统为my.ini),在[mysqld]配置段添加或修改以下内容:
[mysqld] # 仅监听本地回环地址,禁止远程访问 bind-address = 127.0.0.1 # 可选:如果需要允许指定IP访问,可设置为对应IP,多个IP用逗号分隔 # bind-address = 127.0.0.1,192.168.0.1 # 禁用skip-networking参数,确保本地连接正常 # skip-networking
修改完成后重启mysql服务使配置生效:
# Linux系统重启mysql服务 systemctl restart mysqld # Windows系统重启mysql服务 net stop mysql net start mysql
4. 最小化账户权限
遵循最小权限原则,避免使用root账户进行日常业务操作,根据业务需求创建专用账户并仅授予必要权限。
例如创建业务专用的数据库账户,仅授予对应数据库的增删改查权限:
-- 创建业务账户,仅允许从本地登录,替换为实际账户名和密码 CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'App@User_123'; -- 授予app_user对app_db数据库的所有权限,仅限该数据库 GRANT ALL PRIVILEGES ON app_db.* TO 'app_user'@'localhost'; -- 刷新权限 FLUSH PRIVILEGES;
如果需要允许指定远程IP访问,可调整host为对应IP:
-- 允许192.168.0.1的机器访问该账户 CREATE USER 'app_user'@'192.168.0.1' IDENTIFIED BY 'App@User_123'; GRANT SELECT,INSERT,UPDATE,DELETE ON app_db.* TO 'app_user'@'192.168.0.1'; FLUSH PRIVILEGES;
5. 关闭敏感功能和日志清理
关闭不必要的mysql功能,同时定期清理敏感日志,避免信息泄露。
- 禁用LOCAL INFILE功能,避免攻击者通过LOAD DATA读取服务器文件:在
my.cnf的[mysqld]段添加local-infile = 0 - 关闭查询日志、慢查询日志中记录敏感信息,避免日志泄露用户数据和SQL语句
- 定期清理mysql的错误日志、二进制日志,避免日志文件过大同时减少敏感信息留存
加固后验证方法
完成所有加固操作后,可通过以下方式验证配置是否生效:
- 尝试用空密码登录mysql,确认无法登录
- 尝试从远程主机用root账户登录,确认被拒绝
- 查看
validate_password相关参数,确认密码策略已生效 - 查看
bind-address配置,确认监听范围符合预期
定期关注mysql官方安全公告,及时更新mysql版本修复已知安全漏洞,也是保障数据库安全的重要措施。