封禁多维度身份验证失败的恶意ip,核心是建立基于行为、频率、上下文的实时风险判定机制;需综合时间(10分钟内5次mfa失败)、设备(3种以上ua+分辨率+无storage)、业务路径(非常规组合或批量探测)三项独立信号,辅以nginx日志解析、动态黑名单、严格防护边界(如2小时封禁上限、每分钟限5个ip、排除内网/cdn)及人工复核通道。

封禁多维度身份验证失败的恶意IP,核心不是单纯“封IP”,而是建立基于行为、频率、上下文的实时风险判定机制。自动脚本只是执行环节,关键在判断逻辑是否合理——误封正常用户比漏掉攻击者代价更高。
明确“多维度验证失败”的具体指标
不能只看“登录失败次数”。需综合至少三项独立信号:
- 时间维度:10分钟内同一IP触发5次以上MFA(短信/邮箱/APP验证码)请求,且均未完成最终认证(如未输入正确TOTP或未点击邮件链接)
- 设备/指纹维度:同一IP下出现3种以上不同User-Agent + 不同屏幕分辨率 + 无本地storage缓存(说明非熟客)
- 业务路径维度:该IP在失败前尝试过非常规组合(如用新注册手机号+老账号密码+跳过人脸识别),或批量探测多个用户名后集中攻击某1个
用轻量级脚本实现闭环响应(以Python + Nginx为例)
不依赖复杂WAF或云服务,利用现有Nginx日志和系统命令即可落地:
- 定时解析/var/log/nginx/access.log,用awk/grep提取含
"POST /api/v1/auth/mfa"且响应码为401或422的行,按IP聚合计数 - 对满足阈值的IP,写入临时黑名单文件/etc/nginx/conf.d/blocked_ips.conf,格式为
deny 192.168.1.100; - 执行
nginx -t && nginx -s reload热重载配置,无需重启服务 - 自动记录封禁日志到/var/log/auth-block.log,包含时间、IP、触发规则编号、原始日志片段(脱敏后)
必须设置的防护边界,避免脚本变“自毁工具”
没有这些限制,脚本可能放大攻击效果:
- 单IP最长封禁时长=2小时:用文件时间戳或Redis TTL控制,超时自动清理,防止被撞库利用来瘫痪合法用户
- 全球每分钟最多新增5个封禁IP:加全局计数器,防攻击者故意制造大量失败请求触发脚本疯狂封禁(即“封禁反射攻击”)
-
排除内部网段与CDN出口IP:在匹配前先过滤
10.0.0.0/8、172.16.0.0/12、192.168.0.0/16及已知CDN段(如Cloudflare ASN列表)
留出人工复核通道,别让脚本做最终裁决
自动封禁只是第一道缓冲,所有触发记录必须同步到可查界面:
- 将封禁事件推送到企业微信/钉钉机器人,附带
一键解封按钮(调用带鉴权的API) - 提供简单Web页面(哪怕只有HTML+JS),列出最近2小时被封IP、触发规则、原始请求摘要,支持按用户名/IP搜索
- 每天凌晨自动生成统计简报邮件:总封禁数、误报抽样检查结果(随机选3条人工确认)、Top5攻击IP地理分布










