Linux pam_faillock 的账户锁定策略与 fail2ban 的互补配置

2次阅读

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

Linux pam_faillock 的账户锁定策略与 fail2ban 的互补配置

linux 系统中,pam_faillockfail2ban 是两类不同层级的防暴力破解机制:前者在 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=900
    auth [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=3bantime=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
  • 避免重复封禁:不要让 fail2banpam_faillock 同时对“同一条件”做响应(例如都只看 5 次失败),应错开粒度——前者管 IP 频率,后者管账户状态。
  • 测试时务必保留一个免密钥登录的 root 会话,防止配置错误导致自己被锁死。

实际部署建议

中小规模服务器推荐组合策略:

  • 对所有交互式登录服务(SSH、console、sudo)启用 pam_faillockdeny=3 + unlock_time=600,兼顾安全与可用性;
  • fail2ban 监控 auth.log,针对 SSH 设置 maxretry=2bantime=1800,并启用 ignoreself=true 避免误封本机;
  • 定期清理 pam_faillock 锁定记录(脚本+cron),防止长期无效锁定积累;
  • fail2banbackend = systemd 改为 autopolling,确保日志读取稳定(尤其在高 IO 场景下)。
text=ZqhQzanResources