Skip to content

MySQL 暴力攻击防护

暴力攻击原理

什么是暴力攻击

  • 尝试使用大量用户名和密码组合登录系统
  • 利用自动化工具进行快速尝试
  • 目标是找到正确的登录凭据

MySQL暴力攻击的特点

  • 针对MySQL默认端口(3306)的连接尝试
  • 短时间内大量失败的登录尝试
  • 可能针对root或其他常见用户名

暴力攻击的危害

  • 消耗系统资源,影响正常服务
  • 可能导致账户锁定,影响正常使用
  • 成功后可能导致数据泄露或篡改
  • 可能被用作其他攻击的入口点

防护措施

密码策略加固

设置强密码验证插件

sql
-- 安装并启用密码验证插件
INSTALL PLUGIN validate_password SONAME 'validate_password.so';

-- 配置密码验证策略
SET GLOBAL validate_password_policy = 'STRONG';
SET GLOBAL validate_password_length = 12;
SET GLOBAL validate_password_number_count = 2;
SET GLOBAL validate_password_special_char_count = 2;
SET GLOBAL validate_password_mixed_case_count = 2;

定期密码更新

  • 实施密码过期策略
  • 禁止密码重用
  • 定期提醒用户更新密码

登录限制

限制失败登录尝试

sql
-- 安装并启用连接控制插件
INSTALL PLUGIN CONNECTION_CONTROL SONAME 'connection_control.so';
INSTALL PLUGIN CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS SONAME 'connection_control.so';

-- 配置失败登录限制
SET GLOBAL connection_control_failed_connections_threshold = 3;
SET GLOBAL connection_control_min_connection_delay = 60000; -- 1分钟

限制登录源IP

sql
-- 创建允许特定IP访问的用户
CREATE USER 'user'@'192.168.1.%' IDENTIFIED BY 'password';

-- 拒绝从特定IP访问
REVOKE ALL PRIVILEGES ON *.* FROM 'user'@'10.0.0.%';

限制最大连接数

sql
-- 设置全局最大连接数
SET GLOBAL max_connections = 100;

-- 为特定用户设置最大连接数
CREATE USER 'user'@'localhost' IDENTIFIED BY 'password' WITH MAX_USER_CONNECTIONS 10;

网络层面防护

防火墙配置

iptables配置(Linux)
bash
# 允许特定IP访问MySQL端口
iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 3306 -j ACCEPT

# 拒绝其他所有IP访问MySQL端口
iptables -A INPUT -p tcp --dport 3306 -j DROP

# 保存配置
service iptables save
Windows防火墙配置
  • 打开Windows防火墙高级设置
  • 创建入站规则,限制3306端口的访问IP

使用MySQL Proxy

  • 部署MySQL Proxy作为访问代理
  • 在Proxy层面实现连接限制和访问控制
  • 提供额外的安全层

端口转发和隐藏

  • 更改MySQL默认端口
  • 使用SSH隧道进行安全连接
  • 避免直接暴露MySQL端口到公网

监控与告警

实时监控登录尝试

sql
-- 查看当前连接
SHOW PROCESSLIST;

-- 查看连接历史(需要开启general_log)
SET GLOBAL general_log = 'ON';
SET GLOBAL general_log_file = '/var/log/mysql/general.log';

配置登录告警

  • 集成监控系统(如Zabbix、Prometheus)
  • 设置失败登录尝试的告警阈值
  • 配置实时告警通知(邮件、短信、微信)

日志分析

  • 定期分析MySQL错误日志
  • 使用ELK Stack集中管理和分析日志
  • 设置异常登录模式的自动检测

账户安全管理

最小权限原则

  • 为用户分配最小必要的权限
  • 避免使用root账户进行日常操作
  • 定期审查和回收不必要的权限

禁用远程root登录

sql
-- 禁止root远程登录
DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');
FLUSH PRIVILEGES;

移除匿名用户

sql
-- 删除匿名用户
DELETE FROM mysql.user WHERE User='';
FLUSH PRIVILEGES;

应急响应

检测暴力攻击

  • 监控短时间内大量失败的登录尝试
  • 观察来自同一IP的多次连接尝试
  • 分析MySQL错误日志中的认证失败记录

应对措施

  • 临时封锁攻击源IP
  • 重置受影响账户的密码
  • 检查是否有成功的未授权访问
  • 加强监控和防护措施

事后分析

  • 分析攻击模式和来源
  • 评估安全措施的有效性
  • 更新安全策略和防护机制
  • 记录事件并更新应急预案

最佳实践

安全配置基线

  • 定期更新MySQL版本,修补安全漏洞
  • 实施统一的安全配置基线
  • 定期进行安全审计和渗透测试

自动化防护

  • 部署入侵检测系统(IDS)
  • 实现自动IP封锁机制
  • 配置自动安全扫描

安全意识培训

  • 对开发人员和运维人员进行安全培训
  • 制定安全编码和操作规范
  • 定期进行安全演练

常见问题(FAQ)

Q1: 如何检测MySQL是否正在遭受暴力攻击?

A1: 可以通过以下方式检测:

  • 查看MySQL错误日志,寻找大量"Access denied"错误
  • 使用SHOW PROCESSLIST查看是否有大量来自同一IP的连接尝试
  • 监控系统日志中的网络连接记录
  • 使用专业的安全监控工具进行实时检测

Q2: 限制失败登录尝试会影响正常用户吗?

A2: 合理配置不会影响正常用户:

  • 设置适当的阈值(如3-5次)
  • 配置合理的延迟时间(如1-5分钟)
  • 为管理员账户设置更高的阈值或特殊处理
  • 提供密码重置机制,避免用户被永久锁定

Q3: 除了技术措施,还有哪些管理措施可以防止暴力攻击?

A3: 管理措施包括:

  • 制定严格的密码策略和账户管理规范
  • 定期进行安全审计和漏洞扫描
  • 建立安全事件响应机制
  • 加强员工安全意识培训
  • 与网络安全团队协作,实施整体安全防护策略

Q4: 如何在云环境中保护MySQL免受暴力攻击?

A4: 云环境中的防护措施:

  • 使用云服务提供商的安全组或网络ACL限制访问
  • 启用云平台的DDoS防护服务
  • 使用云数据库服务的安全功能(如AWS RDS的安全组)
  • 实施VPC隔离,避免直接暴露MySQL到公网
  • 利用云平台的监控和告警服务