CentOS 7 SSH登录失败锁定:PAM faillock深度配置与审计实践

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影响认证性能。

这三张表的关系不是简单的主从复制,而是存在严格的同步时序:

  1. 用户输入错误密码 → PAM调用 pam_faillock.so → 读取 tallylog 获取当前计数 → 判断是否超过 deny 阈值
  2. 若未超限 → 更新 tallylog 计数 + 写入 /var/run/faillock/username 新记录 + 同步到 faillog
  3. 若已超限 → 直接返回 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!
    策略彻底失效。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值