Linux系统可通过PAM模块pam_faillock实现登录失败自动封禁,支持5次失败60秒内锁定15分钟,并结合iptables封禁IP、MFA增强认证、faillock命令管理封禁状态。

Linux系统可通过PAM模块结合faillock或denyhosts等工具,实现登录失败自动加入黑名单的多维度身份验证防护。核心在于识别失败行为、限制重试、持久化封禁,并兼顾合法用户误操作的恢复机制。
使用pam_faillock配置登录失败锁定策略
pam_faillock是systemd系统默认集成的PAM模块,支持基于次数、时间窗口和用户/组粒度的失败计数与锁定。
- 编辑/etc/pam.d/sshd(SSH)或/etc/pam.d/system-auth(全局),在auth段添加:
auth [default=ignore] pam_faillock.so preauth silent deny=5 unlock_time=900 fail_interval=60
- 在auth段下方紧接着添加:
auth [default=die] pam_faillock.so authfail deny=5 unlock_time=900 fail_interval=60
- 在account段添加(用于解锁检查):
account required pam_faillock.so
说明:连续5次失败(60秒内)、锁定15分钟(900秒)。失败记录保存在/var/run/faillock/下各用户名文件中,自动持久化且重启不丢失。
扩展IP维度:结合iptables或nftables自动封禁源IP
仅封用户不足以防御暴力扫描,需联动网络层阻断高频异常IP。
- 启用faillock的日志审计功能,在/etc/security/faillock.conf中设置log_failure = yes,确保/var/log/secure记录失败事件
- 编写轻量级监控脚本(如用awk+grep实时解析日志),检测单位时间内同一IP触发多次faillock事件,触发iptables封禁:
iptables -I INPUT -s 192.168.1.100 -j DROP
- 建议搭配ipset管理IP集合,提升规则效率;封禁时长可设为1小时或24小时,避免永久误封
增强可信度:多因素验证(MFA)与黑名单协同
单纯密码失败封禁易被绕过,应前置强化认证环节,降低失败触发概率。
- 为SSH启用Google Authenticator或YubiKey:安装libpam-google-authenticator,在/etc/pam.d/sshd中添加:
auth [success=done new_authtok_reqd=done default=ignore] pam_google_authenticator.so nullok
- 配合AuthenticationMethods publickey,keyboard-interactive(sshd_config中),强制先验密钥再验OTP,大幅减少密码爆破入口
- 此时pam_faillock仅作用于OTP环节,攻击者即使拿到密码也无法绕过,黑名单更精准有效
运维友好:封禁状态查看与手动解封方法
避免误封导致运维中断,需提供快速诊断与恢复能力。
- 查看某用户失败记录:faillock --user username
- 清空指定用户失败计数:faillock --user username --reset
- 列出当前iptables封禁的IP:iptables -L INPUT -v -n | grep DROP
- 解封单个IP:iptables -D INPUT -s 192.168.1.100 -j DROP
- 建议将常用操作封装为alias或小脚本,并限制执行权限(仅root或wheel组)

















