pam_faillock与fail2ban分别在pam认证层和网络服务层实现账户级与ip级防暴力破解,二者协同构成纵深防御;前者限制单账户失败次数并自动锁定,后者基于日志动态封禁攻击ip。

Linux 系统中,pam_faillock 和 fail2ban 是两类不同层级的防暴力破解机制:前者在 PAM 认证层实现本地账户锁定,后者在网络服务层基于日志做动态 IP 封禁。二者不冲突,反而能形成纵深防御——pam_faillock 防止同一账户被反复撞库,fail2ban 阻断攻击源对整个服务(如 SSH、FTP)的扫描行为。
pam_faillock 的核心作用与典型配置
pam_faillock 是 PAM 模块,仅对本地用户登录(如 SSH 密码认证、控制台登录、su 切换)生效,不处理密钥登录或网络协议层的连接请求。它通过记录失败尝试次数、设置锁定时间、自动解锁等策略保护单个账户。
- 启用方式:在
/etc/pam.d/sshd(或system-auth)中添加两行(顺序不可颠倒):auth [default=bad success=ok user_unknown=ignore] pam_faillock.so preauth silent deny=5 unlock_time=900 fail_interval=900auth [default=die] pam_faillock.so authfail deny=5 unlock_time=900 fail_interval=900 - 关键参数说明:
deny=5:5 次失败后锁定;
unlock_time=900:锁定 15 分钟(秒),设为 0 表示永久锁定(需手动解锁);
fail_interval=900:只统计最近 15 分钟内的失败记录,避免长期累积误锁。 - 锁定状态可查:
faillock --user username;手动解锁:faillock --user username --reset。
fail2ban 的定位与协同价值
fail2ban 不干预用户认证逻辑,而是持续监控服务日志(如 /var/log/auth.log),匹配预定义规则(如 “Failed password for .* from”),触发 iptables/nftables 封禁对应 IP。它天然适配多种服务(SSH、vsftpd、nginx 登录页等),且封禁范围是 IP 而非账户。
- 与
pam_faillock形成互补:
当攻击者用不同账户暴力试探时,pam_faillock可能无法及时拦截(每个账户独立计数),而fail2ban会因高频失败日志统一封禁该 IP;
若攻击者绕过密码登录(如利用弱密钥或漏洞),pam_faillock完全不生效,fail2ban仍可通过异常连接模式(如大量 connection reset、短连暴破)进行检测。 - 建议在
fail2ban的[sshd]jail 中启用maxretry=3、bantime=3600,比pam_faillock更激进地阻断扫描行为,避免日志被刷爆。
配置注意事项与避坑提示
两者共存时需注意日志来源、触发时机和权限边界,否则可能相互干扰或留空档。
-
pam_faillock日志默认写入/var/log/faillock(二进制),fail2ban无法直接解析;它依赖auth.log中的 PAM 记录(如 “pam_faillock(sshd:auth): user unknown”),确保 SSH 的 PAM 配置已启用auth [default=ignore] pam_faillog.so或类似日志模块。 - 若系统使用
systemd-journald且未持久化日志,fail2ban可能漏监;确认/var/log/journal/存在或启用Storage=persistent。 - 避免重复封禁:不要让
fail2ban和pam_faillock同时对“同一条件”做响应(例如都只看 5 次失败),应错开粒度——前者管 IP 频率,后者管账户状态。 - 测试时务必保留一个免密钥登录的 root 会话,防止配置错误导致自己被锁死。
实际部署建议
中小规模服务器推荐组合策略:
- 对所有交互式登录服务(SSH、console、sudo)启用
pam_faillock,deny=3+unlock_time=600,兼顾安全与可用性; - 用
fail2ban监控auth.log,针对 SSH 设置maxretry=2、bantime=1800,并启用ignoreself=true避免误封本机; - 定期清理
pam_faillock锁定记录(脚本+cron),防止长期无效锁定积累; - 将
fail2ban的backend = systemd改为auto或polling,确保日志读取稳定(尤其在高 IO 场景下)。










