MySQL 8如何配置记录失败登录尝试 适配fail2ban防暴力破解
MySQL 8 记录认证失败日志配置(适配fail2ban拦截暴力破解)
MySQL 8.0 版本默认日志规则不会将登录失败事件写入错误日志,和已废弃的log_warnings参数无关,核心原因是默认日志过滤规则、日志详细度参数未匹配到认证事件的记录要求,按以下步骤配置即可:
1. 修改mysqld主配置
根据你的发行版找到配置文件,Debian/Ubuntu默认路径为/etc/mysql/mysql.conf.d/mysqld.cnf,RHEL/CentOS/Rocky默认路径为/etc/my.cnf.d/mysqld.cnf,在[mysqld]段落添加/修改以下配置:
[mysqld] # 错误日志路径,按你实际部署的路径调整,默认路径参考: # Debian/Ubuntu: /var/log/mysql/error.log # RHEL/CentOS: /var/log/mysqld.log log_error = /var/log/mysql/error.log # 日志详细度设为3:级别2仅记录错误、警告,认证失败属于Note级别事件,必须设为3才能捕获 log_error_verbosity = 3 # 加载默认日志过滤、写入组件,保持默认文本格式方便fail2ban匹配 log_error_services = 'log_filter_internal; log_sink_internal' # 清空错误抑制列表,避免认证类事件被过滤 log_error_suppression_list = ''
2. 运行时验证配置(无需重启立即生效)
先通过MySQL客户端登录服务端,执行以下SQL让配置临时生效,确认日志正常输出后再重启服务把配置固化:
SET GLOBAL log_error_verbosity = 3; SET GLOBAL log_error_suppression_list = ''; -- 确认日志组件加载正常,预期返回 log_filter_internal; log_sink_internal SELECT @@GLOBAL.log_error_services;
配置生效后,故意输错密码发起一次连接请求,查看错误日志,若出现如下格式的条目说明配置成功:
2024-XX-XXTXX:XX:XX.XXXXXXZ 17 [Note] [MY-010926] [Server] Access denied for user 'xxx'@'x.x.x.x' (using password: YES)
3. 适配fail2ban拦截规则
确认日志正常输出后,配置fail2ban匹配日志特征:
- 新建filter规则文件
/etc/fail2ban/filter.d/mysqld8.conf:
[Definition] failregex = ^.*\[Note\] \[MY-010926\].*Access denied for user '.*'@'<HOST>'.*$ ignoreregex =
- 在
/etc/fail2ban/jail.local中添加对应jail配置:
[mysqld8] enabled = true port = 3306 filter = mysqld8 # 此处logpath和你my.cnf里配置的log_error路径保持一致 logpath = /var/log/mysql/error.log maxretry = 3 bantime = 86400 findtime = 600
- 重启fail2ban服务加载配置:
systemctl restart fail2ban # 执行以下命令确认jail正常运行 fail2ban-client status mysqld8
常见踩坑说明
- 不要在MySQL 8配置中写入
log_warnings参数,该参数已在8.0版本被移除,写入会导致MySQL服务启动失败 - 不要随意调整
log_error_services的组件顺序,必须先执行过滤逻辑再写入日志,顺序错误会导致日志写入异常 - 如果使用Docker/容器化部署MySQL,需要把错误日志路径挂载到宿主机,否则fail2ban无法读取日志内容
- 如果修改日志组件为JSON格式输出,需要同步调整fail2ban的正则匹配规则,否则会识别不到失败登录事件
内容的提问来源于stack exchange,提问作者Peter Maurer
相关产品推荐
相关产品推荐

