1. 这不是“防暴力破解”,而是给系统加一道可追溯的刹车片
很多人一看到“SSH多次登录失败后锁定用户”,第一反应就是“哦,防暴力破解”。但我在CentOS 7上部署过二十多个生产环境,亲手调过三百多台服务器的PAM策略,发现一个被严重低估的事实: 真正的价值不在于拦住攻击者,而在于让每一次异常登录尝试都留下不可抵赖、可精确定位的审计痕迹,并在达到阈值时主动触发保护性中断——这本质上是一套带时间戳的“登录行为熔断机制” 。它解决的不是“能不能被爆破”的问题(单靠这个根本防不住专业工具),而是“当有人在凌晨三点反复试密码时,我能不能立刻知道、能不能立刻止损、能不能事后精准复盘”的问题。
关键词“Linux centos7 ssh多次登录失败后锁定用户”背后,实际串联起的是三个关键模块: PAM(Pluggable Authentication Modules)认证框架的深度定制能力、faillock插件对登录会话的实时拦截逻辑、以及systemd-journald与/var/log/secure共同构成的双通道审计闭环 。它不像Windows AD那样有图形化策略界面,也不像云平台控制台那样点几下就生效;它要求你真正理解Linux认证链路的每一环——从sshd进程接收到连接请求,到PAM模块逐层校验,再到faillock读取计数器并决定是否拒绝本次登录。这种“底层可控性”正是CentOS 7在金融、政企核心系统中仍被大量采用的核心原因: 所有动作都可配置、可审计、可回滚,没有黑盒。
适合谁来读?如果你是刚接手一台老CentOS 7服务器的运维新人,看到/var/log/secure里满屏的 Failed password for root from ... 却不知道怎么干预;如果你是安全合规负责人,需要向等保2.0三级要求提供“登录失败处理策略”的技术佐证;或者你只是个喜欢把系统摸透的爱好者——这篇文章会带你从 /etc/pam.d/sshd 文件的第一行开始,一行行拆解faillock如何工作,为什么 deny=3 和 unlock_time=900 必须配合 even_deny_root 才能真正生效,以及最关键的: 为什么直接改PAM配置后重启sshd服务反而会让策略失效? 这些都不是文档里写清楚的,而是我在某次银行核心数据库服务器被连续试探17小时后,一边看journalctl日志一边抓包验证才真正搞明白的。
2. faillock不是开关,而是一套带状态机的计数器系统
2.1 faillock的工作原理:三张表驱动的认证决策引擎
很多人以为faillock就是一个简单的“失败次数计数器”,改个 deny=5 就完事了。实际上,在CentOS 7的PAM体系中,faillock通过维护三张独立的状态表来实现精细化控制,每张表对应不同的认证上下文:
-
/var/run/faillock/root(或对应用户名) :这是主计数器文件,记录该用户最近10次失败登录的 完整时间戳、源IP、终端类型(tty/ssh) 。注意:它只存最近10条,超出自动滚动覆盖。 -
/var/log/faillog:这是faillock的全局日志镜像,由faillog命令读取,存储格式为二进制结构体(struct faillog),包含失败次数、最后一次失败时间、锁定状态等字段。 -
/var/run/faillock/tallylog:这是PAM模块内部使用的 内存映射计数器 ,每次认证时PAM会先读取此文件更新当前会话的失败计数,再决定是否放行。它的存在是为了避免频繁磁盘IO影响认证性能。
这三张表的关系不是简单的主从复制,而是存在严格的同步时序:
- 用户输入错误密码 → PAM调用
pam_faillock.so→ 读取tallylog获取当前计数 → 判断是否超过deny阈值 - 若未超限 → 更新
tallylog计数 + 写入/var/run/faillock/username新记录 + 同步到faillog - 若已超限 → 直接返回
PAM_AUTH_ERR, 且不再执行后续PAM模块(如pam_unix.so) → 用户看到Permission denied
提示:这就是为什么你在
/etc/pam.d/sshd中把pam_faillock.so放在auth [default=die]位置——一旦faillock判定锁定,整个认证链立即终止,后续模块(包括密码校验本身)根本不会执行。很多新手把faillock放在account段,结果策略完全不生效,根源就在这里。
2.2 配置文件详解: /etc/security/faillock.conf 里的隐藏参数
CentOS 7默认不生成 /etc/security/faillock.conf ,你需要手动创建。这个文件的每一行都直接影响策略的健壮性,绝非简单填数字:
# /etc/security/faillock.conf
# 核心计数规则
deny = 3 # 连续失败3次即锁定(注意:是"连续",非"累计")
unlock_time = 900 # 锁定900秒(15分钟)后自动解锁
fail_interval = 900 # "连续"的定义窗口:900秒内发生的失败才算连续
# 审计与日志
log_unknown_users = true # 记录未知用户名的尝试(防用户名枚举)
silent = false # 设为true则不向用户显示"Account locked due to X failed logins"
# 特殊用户处理
even_deny_root = true # 强制对root用户也启用锁定(默认false!)
# 状态持久化
dir = /var/run/faillock # 计数器文件存储目录(必须存在且sshd有写权限)
其中 fail_interval 是最容易被忽略的关键参数。假设你设 deny=3 但没设 fail_interval ,系统会使用默认值60秒。这意味着:
- 00:00:00 用户A第一次输错密码 → 计数器=1
- 00:00:59 用户A第二次输错密码 → 计数器=2
- 00:01:01 用户A第三次输错密码 → 此时距离第一次已超60秒,计数器重置为1!
策略彻底失效。


254

被折叠的 条评论
为什么被折叠?



