两者管的对象不同
pam_faillock 是 PAM 认证栈里的一个模块,按「账号」记账:某账号在 fail_interval 时间窗内失败次数达到 deny,该账号即被锁定,unlock_time 内即使口令正确也登录不上。fail2ban 是独立守护进程,按「来源 IP」记账:解析 /var/log/secure 或 /var/log/auth.log,某 IP 在时间窗内失败超过阈值,就调用 iptables、nftables 或 firewalld 封禁该 IP。一个在认证层按账号判定,一个在网络层按来源判定,这是最本质的分工。
为什么两层都要有
口令喷洒式爆破对每个账号只试一两次,永远碰不到单账号的锁定阈值,但来源固定时会很快触发 fail2ban;反过来换大量 IP 分散尝试时,IP 封禁被稀释,faillock 仍能护住被重点攻击的少数账号。faillock 还有一个 fail2ban 给不了的覆盖:本地 tty 登录、su 与 sudo 提权同走 PAM,防火墙完全管不到这些路径。
基本信息
| 适用平台 | Linux(PAM 体系) |
|---|---|
| faillock 载体 | pam_faillock 模块,配置在 /etc/security/faillock.conf |
| fail2ban 载体 | fail2ban 服务 + 防火墙后端 |
| 权限要求 | root |
| 失败日志 | Debian/Ubuntu 在 /var/log/auth.log,RHEL 系在 /var/log/secure |
| 常用配置路径 | /etc/pam.d/、/etc/fail2ban/jail.local |
典型使用场景
- 对外暴露 22 端口的服务器:既防单账号撞库,也压住来源 IP 的扫描噪音
- 基线核查:口令失败锁定与来源封禁通常是两条独立检查项,只做一条算未达标
- 仅密钥登录的主机:faillock 价值下降,fail2ban 仍能减少日志噪音
- 本地终端与 su/sudo 场景:只有认证层锁定时能覆盖
- 多机统一策略:把 faillock.conf 与 jail.local 纳入配置管理批量下发
现状核查
现状核查
faillock | head # 列出各账号的失败次数与锁定状态
faillock --user ops --reset # 解除某账号锁定(误伤时用)
systemctl is-active fail2ban # fail2ban 是否在运行
fail2ban-client status sshd # 看该 jail 当前封禁了哪些 IP
iptables -S | grep -i f2b # fail2ban 自建链是否已生效
grep -Ev '^#|^$' /etc/security/faillock.conf # 看锁定阈值配置faillock 阈值配置
faillock 阈值配置
deny=5 # 连续失败 5 次开始锁定
unlock_time=900 # 锁 900 秒后自动解锁
fail_interval=900 # 只统计 900 秒窗口内的失败
even_deny_root # 连 root 一起锁,默认 root 不受限
root_unlock_time=300 # root 锁定时间另设,便于应急登录两层防护对照
| 维度 | pam_faillock | fail2ban |
|---|---|---|
| 作用对象 | 账号 | 来源 IP |
| 执行位置 | PAM 认证栈内 | 日志解析 + 防火墙 |
| 防批量撞库 | 弱:分散到多账号即可绕过 | 强:同一 IP 累计即封 |
| 防分布式来源 | 强:与来源数量无关 | 弱:每个 IP 都凑不够次数 |
| 本地登录覆盖 | 有(tty、su、sudo) | 无 |
| 解除方式 | faillock --user 用户 --reset | fail2ban-client set sshd unbanip IP |
| 误伤表现 | 用户报口令正确也登不上 | 整个出口 IP 或网段被挡 |
纯密钥登录的机器可只保留 fail2ban:faillock 主要防口令爆破,对公钥认证失败基本没有意义。
两套锁定的阈值与时长必须统一设计:faillock 锁 15 分钟、fail2ban 封 1 小时会让处置口径混乱。用户报「登录不上」时要一次看全两层,否则容易漏判。云环境中 NAT 出口共用公网 IP 时,务必把办公网、监控与堡垒机来源写进 ignoreip。