MySQL弱口令漏洞本质上不是软件本身的代码缺陷,而是一种由运维配置疏忽引发的系统性安全风险。攻击者通过暴力破解或字典攻击,反复尝试root、admin等常见账户的简单密码组合,一旦成功即获得数据库最高权限。这直接导致数据泄露、篡改甚至被勒索加密。修复的核心在于立即阻断爆破通道、强制实施强密码策略并清除已植入的后门。
立即定位弱口令账户并强制重置首先需要排查当前所有用户的口令强度。登录MySQL后执行以下SQL语句,可导出用户列表,重点检查是否存在空口令或与用户名相同的密码。
SELECT user, host, authentication_string FROM mysql.user;
对于确认使用弱口令的账户,必须立即修改。注意MySQL 5.7与8.0版本修改密码的语法存在差异;
5.7版本使用以下命令:
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('新复杂密码');
FLUSH PRIVILEGES;
而8.0及以上版本由于移除了PASSWORD()函数,必须使用:
ALTER USER 'root'@'localhost' IDENTIFIED BY '新复杂密码'; FLUSH PRIVILEGES;
新密码必须包含大小写字母、数字及特殊符号,长度至少12位,且避免使用生日、公司名等易被社工的信息。建议直接使用密码管理器生成随机字符串。
关闭危险的外部网络访问通道绝大多数MySQL弱口令爆破事件源于数据库3306端口直接暴露在公网。修复时,应检查配置文件my.cnf(Linux)或my.ini(Windows)中的bind-address参数。将其修改为仅监听本地或内网指定IP,能瞬间切断90%以上的攻击面。
[mysqld] bind-address = 127.0.0.1
如果业务确实需要远程连接,绝对不要直接开放公网端口。应在云服务商控制台配置安全组,仅放行特定办公出口IP或应用服务器的内网IP。同时,在MySQL用户权限层面做双重限制,禁止root账户远程登录:
DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');
FLUSH PRIVILEGES;
创建专门的低权限应用账户,并严格限制其Host字段为应用服务器IP,如'appuser'@'192.168.1.100',杜绝使用通配符'%'。
部署登录失败锁定与连接控制插件MySQL默认未开启登录失败锁定机制,这使得攻击者可以无限次尝试密码。从MySQL 8.0.19开始,可通过connection_control插件实现类似操作系统的账户锁定策略。在MySQL命令行中安装插件:
INSTALL PLUGIN CONNECTION_CONTROL SONAME 'connection_control.so'; INSTALL PLUGIN CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS SONAME 'connection_control.so';
随后在配置文件中设定阈值,例如连续失败3次锁定2分钟,并设置最小连接延迟,打乱爆破节奏:
[mysqld] connection-control-failed-connections-threshold=3 connection-control-min-connection-delay=120000
对于低版本数据库,无法使用该插件时,可借助Fail2ban这类主机层防护软件。在/etc/fail2ban/jail.local中配置针对MySQL日志的监控规则,一旦同一IP失败次数超标,立即通过iptables封禁。
启用SSL/TLS加密传输并强制验证即使密码足够复杂,若在网络层明文传输,依然可能被中间人嗅探。应强制启用SSL加密。首先检查数据库是否已编译SSL支持:
SHOW VARIABLES LIKE '%ssl%';
若未开启,需生成证书并配置my.cnf:
[mysqld] ssl-ca=/etc/mysql/certs/ca.pem ssl-cert=/etc/mysql/certs/server-cert.pem ssl-key=/etc/mysql/certs/server-key.pem require_secure_transport=ON
对已存在的远程用户,执行强制SSL要求:
ALTER USER 'appuser'@'192.168.1.100' REQUIRE SSL;
这样即便口令被截获,攻击者看到的也只是加密乱码,极大提升破解成本。
深度清理提权木马与异常存储过程弱口令被爆破成功后,攻击者通常会写入后门。最经典的提权手法是利用MySQL的INTO OUTFILE向Web目录写入Webshell。修复时,必须检查secure_file_priv参数,确保其值为空或指向一个不可通过Web访问的非敏感目录,严禁为空字符串(即允许任意路径写入)。
[mysqld] secure_file_priv = /var/lib/mysql-files/
同时,执行以下命令检查并删除可疑的存储过程和函数,攻击者常利用这些对象执行系统命令:
SELECT ROUTINE_NAME, ROUTINE_DEFINITION FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_TYPE='FUNCTION' AND ROUTINE_SCHEMA='mysql'; DROP FUNCTION IF EXISTS sys_exec; DROP FUNCTION IF EXISTS cmdshell;
还需检查mysql.user表,查看是否存在异常新增的超级用户,特别是Host为%且包含Grant_priv权限的陌生账户,立即删除。
实施最小权限原则与数据库审计日常运维应彻底摒弃直接使用root账户的习惯。为不同业务线创建独立账户,并严格使用GRANT语句分配SELECT、INSERT、UPDATE等基本权限,严禁授予FILE、SUPER、PROCESS等敏感权限。开启MySQL的通用查询日志或审计插件,可追溯所有操作记录。在配置文件中开启:
[mysqld] general_log = ON general_log_file = /var/log/mysql/general.log
需注意,高并发下此操作会消耗性能,建议在应急排查时短暂开启,或部署性能更优的第三方审计插件。定期分析日志中出现的“Access denied”频率,可及时发现未遂的爆破行为。
加固操作系统层与定期漏洞扫描数据库安全依赖于底层操作系统。应确保MySQL运行在独立的低权限系统账户下,该账户对数据库数据目录拥有读写权,但禁止登录Shell。定期使用官方工具或安全基线检查脚本扫描配置缺陷。对于老旧版本MySQL,应制定升级计划,因为新版不仅修复了已知漏洞,还提供了更现代的密码插件,如caching_sha2_password,其安全性远超旧版的mysql_native_password。可通过以下命令将用户认证插件升级:
ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY '强密码';
弱口令防护不是一次性工作,而是一个持续的对抗过程。当所有技术手段部署完毕后,必须将密码复杂度检查、网络隔离策略写入企业的安全基线文档,任何新上线的数据库实例都应自动通过合规检查。只有将被动修补转化为主动防御,才能真正杜绝因弱口令引发的连锁性数据灾难。
