linux用pam_faillock.so配置deny=5、unlock_time=900、fail_interval=60三参数协同;windows通过组策略设账户锁定阈值5次、锁定时间30分钟、重置计数器30分钟,并需叠加防火墙限流与日志告警。

直接配置账户锁定策略是防暴力破解最有效的手段之一,但必须按系统类型区分实现方式——Linux靠PAM模块精准计数,Windows靠组策略统一管控,而数据库(如MongoDB)和Web应用则需额外加层防护。
Linux:用 pam_faillock.so 实现可审计的登录失败控制
主流发行版(Ubuntu 22.04+、RHEL 8+、CentOS Stream)默认支持 pam_faillock.so,无需重启服务,规则写入即生效。
- 编辑对应PAM配置文件:
– Ubuntu/Debian:修改/etc/pam.d/common-auth
– RHEL/CentOS:修改/etc/pam.d/system-auth - 在
auth段开头严格按顺序插入三行(顺序错会导致策略失效):auth [default=ignore] pam_faillock.so preauth silent deny=5 unlock_time=900 fail_interval=60auth [default=die] pam_faillock.so authfail deny=5 unlock_time=900 fail_interval=60auth [default=ok] pam_faillock.so authsucc - 参数含义:
–deny=5:60秒内连续输错5次即触发锁定
–fail_interval=60:只统计最近60秒内的失败次数,防长周期试探
–unlock_time=900:15分钟后自动解锁,不依赖人工干预 - 验证与管理:
– 查看某用户状态:faillock --user username
– 手动重置:faillock --user username --reset
Windows:通过组策略统一设定阈值与时间窗口
域环境必须在域控制器上配置;本地服务器可用 gpedit.msc(专业版及以上)或 secpol.msc(家庭版仅限本地策略)。
- 路径:
计算机配置 → Windows 设置 → 安全设置 → 账户策略 → 账户锁定策略 - 三项关键参数必须协同设置:
– 账户锁定阈值:设为 5(高权限账户可设为3)
– 账户锁定时间:建议 30分钟(设为0表示永不自动解锁,运维风险高)
– 重置账户锁定计数器:必须与锁定时间一致,也设为 30分钟 - 额外加固项:
– 启用“允许管理员帐户锁定”,取消 Administrator 默认豁免
– 禁用 Guest 账户,防止被利用为跳板
– 修改默认 Administrator 用户名,降低扫描命中率 - 生效与验证:
– 运行gpupdate /force刷新策略
– 登录失败5次后,检查事件查看器中事件ID 4740 是否记录
绕过操作系统层的常见场景,必须单独加固
账户锁定策略只对系统级登录(如SSH、RDP、本地控制台)有效。Web后台、数据库接口、API等均不受影响,需独立部署防护。
-
MongoDB:官方至今不支持内置账号锁定。必须在外围拦截:
– 防火墙限制单IP连接频率(如 firewalld 或 ufw)
– 反向代理(Nginx/HAProxy)层做请求限流
– 应用层用 Redis 实现滑动窗口计数(key格式:login_fail:{ip}:{username}),5分钟超10次即返回HTTP 429 -
Web应用登录页(如Spring Boot、Django、Flask):
– 不依赖框架默认插件(如Django Axes需启用AXES_LOCK_OUT_BY_COMBINATION_USER_AND_IP)
– 每次失败写入Redis并设5分钟TTL,达到阈值后跳过密码校验直接拒绝 -
SSH专项加固(Linux):
– 设置MaxAuthTries 3(sshd_config)
– 禁用 root 远程登录:PermitRootLogin no
– 改非标端口 + 强制密钥认证,从源头减少爆破面
配套监控与应急响应不能少
锁定只是第一道防线,及时发现、快速定位、可控恢复才是闭环。
- 集中采集日志:
– Linux:/var/log/auth.log中匹配Failed password和Account locked
– Windows:安全日志中筛选事件ID 4625(登录失败)、4740(账户锁定) - 配置告警:
– 对同一IP在60秒内出现≥5次失败登录,触发邮件或短信通知
– 使用ELK、Graylog或简单脚本+rsyslog转发均可实现 - 临时解锁机制:
– Linux:root执行faillock --user xxx --reset
– Windows:在“计算机管理→本地用户和组”中右键用户→“属性”→“常规”页勾选“账户已禁用”再取消,或用net user username /active:yes











