
后台入口被泄露之后,撞库、字典爆破和路径扫描就会很快把日志填满。只有用应用层验证码来提高门槛,并不能从系统的角度来阻止大量的恶意请求。Fail2Ban的作用就是把“日志特征—行为阈值—防火墙封禁—安全告警”这四个环节串联起来形成一个自动化的闭环,不需要人工监控。
防护链路
1. 日志识别
对Nginx/Apache访问日志、SSH认证日志以及业务自定义登录日志进行监控,从中找出401/403高频出现的情况、异常的User-Agent和敏感路径(如/admin、/login、xmlrpc)探测行为等。在反向代理的情况下要先设置好真实的客户端IP地址透传,否则会错误地封锁掉网关。
2. 自动封禁
用filter来设置failregex以及findtime窗口内失败的次数限制:
[admin-login]
enabled = true
filter = admin-login
logpath = /var/log/nginx/access.log
maxretry = 5
findtime = 300
bantime = 7200
port = http,https
banaction = nftables-multiport
当超过一定数值时就会调用nftables或者iptables来封锁该IP地址,在时间一到之后会自动解除封锁;对于经常作案的人可以加上recidive监狱来进行逐步延长封锁的时间。
3. 异地登录提醒
登录成功的记录会单独写入日志中,根据IP地址和常用的属地基线来判断是否为“异地”,如果命中了异地的特征的话,并不会阻止用户的请求,但是会发送Webhook(飞书/企微/钉钉)或者邮件通知,包含时间、用户名、IP地址、所属地区以及用户代理等信息。
4. 白名单兜底
在办公网、跳板机和CDN回源节点上设置ignoreip,上线之前使用fail2ban-regex进行正则表达式检查,防止错误地阻止正常的运维操作。
落地要点
- 业务日志要按格式输出“登录失败/成功”,方便Fail2Ban进行精确匹配
- 封禁策略根据风险等级来划分:爆破接口严格限制,正常的登录比较宽松
- 告警分为“封禁事件”、“可疑成功的登录”,后者优先级高
- 封禁表开启持久化,重启不会丢失数据
- 高流量的站点使用 journald 或者独立的日志文件来减少正则表达式匹配的时间
总结
Fail2Ban并不是用来取代WAF或者强密码策略的,而是把“试探成本”转嫁给攻击者:自动封禁可以抑制住高频次的暴力破解行为,异地登录告警则填补了“密码已经被泄露”的信息空白。两者结合之后,后台系统抵御撞库的能力以及异常响应的速度都会有所提高。