ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Ubuntu账户锁定机制全解析:从PAM原理到faillock实战配置

2026/8/12 12:23:48 拓冰建站 浏览量
Ubuntu账户锁定机制全解析:从PAM原理到faillock实战配置 1. 问题场景当登录界面告诉你“账户已锁定”如果你在Ubuntu的登录界面或者通过SSH远程连接时连续输错几次密码屏幕上突然弹出一条提示“为安全考虑已锁定该用户账户原因是登录尝试或密码更改尝试过多。请稍候片刻再重试”那一刻的心情想必是既焦急又困惑。这不仅仅是个人电脑会遇到的问题对于运维着成百上千台Linux服务器的管理员来说账户锁定策略更是系统安全防线的基石配置不当可能导致合法用户被误锁或者给暴力破解留下可乘之机。这个看似简单的“账户锁定”背后其实是Linux-PAMPluggable Authentication Modules可插拔认证模块在起作用。Ubuntu作为最流行的Linux发行版之一其用户认证体系深度依赖于PAM。理解并配置好账户锁定策略是每个从桌面用户到系统管理员都必须掌握的技能。它直接关系到系统的可用性与安全性之间的平衡锁得太松形同虚设锁得太紧又可能“误伤友军”。今天我们就来彻底拆解Ubuntu下的账户锁定机制从原理到配置从桌面到服务器让你不仅能解决眼前的“锁死”问题更能主动构筑合理的安全策略。2. 核心原理PAM与faillock如何协同工作要配置锁定策略首先得知道它是怎么运作的。在较新的Ubuntu版本如20.04 LTS及以后中账户失败登录处理的核心是pam_faillock模块。这与旧系统中常用的pam_tally2模块在思路上有显著不同理解其差异是正确配置的前提。pam_faillock模块采用了“中央登记簿”的设计理念。它不再像pam_tally2那样将失败计数直接存储在/var/log/faillog或每个用户的Tally文件中而是将所有的失败尝试记录在一个中心化的目录里通常是/var/run/faillock。这种设计有几个关键优势首先它支持更精细的锁定策略例如可以针对同一用户从不同终端发起的登录尝试进行累计计数其次其记录是存储在内存文件系统/var/run中的重启后默认会清零这避免了因历史失败记录导致账户被意外长期锁定但也意味着你需要额外配置如果你想持久化记录。它的工作流程可以概括为以下几步认证尝试用户输入密码进行登录图形界面、TTY终端或SSH。PAM栈调用认证请求触发PAM配置文件中对应的规则。对于登录服务如login,sshd,gdm-password会依次执行auth,account,password,session子栈。pam_faillock介入在auth栈中pam_faillock模块会被调用两次。第一次调用preauth在真正的密码验证之前执行。模块会检查/var/run/faillock目录下对应用户的记录文件。如果该用户最近的失败尝试次数已经达到了预设的阈值例如5次并且距离第一次失败尝试的时间仍在设定的“解锁时间”内例如600秒那么模块会直接拒绝本次认证尝试并返回“账户已锁定”的信息根本不会走到密码验证那一步。这就是你看到错误提示的直接原因。密码验证如果preauth检查通过即失败次数未超限或已过锁定时间系统才会进行实际的密码校验。第二次调用authfail或authsucc根据密码验证的结果pam_faillock再次被调用。如果验证失败authfail模块会在对应用户的记录中新增一条失败记录包含时间戳。当失败记录条数达到阈值时账户即被锁定。如果验证成功authsucc模块会清除该用户的所有失败记录相当于“重置计数器”。锁定状态一旦被锁定在解锁时间到期前任何新的认证尝试都会在preauth阶段被拒绝。这里有一个关键的细节pam_faillock的锁定是“软锁定”。它并不像使用usermod -L命令那样在/etc/shadow密码字段前添加!来禁用账户。软锁定只影响通过配置了pam_faillock的PAM服务进行的认证。这意味着如果用户已经有一个活动的登录会话比如图形界面已登录锁定不会踢出当前会话。同时root用户uid0默认不受pam_faillock策略限制这是一个重要的安全例外防止管理员把自己锁在外面。3. 实战配置手动解锁与策略定制遇到账户被锁第一反应当然是解锁。根据你的访问权限和场景有以下几种方法。3.1 紧急解锁当你还能访问系统时如果你被锁在图形界面或某个TTY外但还能通过另一个已登录的会话比如另一个用户桌面或者服务器上另一个SSH连接访问系统那么解锁非常简单。方法一使用faillock命令推荐这是管理pam_faillock锁定的官方工具。解锁指定用户例如用户zhangsansudo faillock --user zhangsan --reset这条命令会立即清除用户zhangsan的所有失败记录账户即刻解锁。你可以立即尝试重新登录。 要查看所有被锁定用户或特定用户的失败记录可以使用sudo faillock --user zhangsan # 查看特定用户 sudo faillock # 查看所有用户记录方法二直接删除记录文件faillock命令的本质就是操作/var/run/faillock/目录下的文件。每个被记录失败尝试的用户这里都有一个以用户名命名的文件。因此你也可以直接删除它来解锁sudo rm /var/run/faillock/zhangsan但请注意/var/run是内存文件系统重启后这个目录下的内容会丢失。所以如果系统重启了锁定状态会自动解除。这既是优点防止永久性误锁也是缺点无法持久化记录攻击行为。3.2 终极救援从恢复模式解锁这是最坏的情况你是系统唯一的管理员所有账户包括root都被锁了或者你无法通过任何现有会话进入系统。别慌Ubuntu的恢复模式Recovery Mode是你的救命稻草。重启计算机在GRUB引导菜单出现时选择“Advanced options for Ubuntu”。接着选择后面带有“recovery mode”的内核条目。系统会进入恢复模式菜单选择 “root” Drop to root shell prompt。你现在拥有完整的root权限但文件系统通常是以只读ro方式挂载的。首先需要将其重新挂载为可写mount -o remount,rw /现在你可以使用上面提到的任何一种方法解锁账户。例如重置root用户的失败计数faillock --user root --reset或者如果你忘记了密码此时也可以直接修改用户密码例如修改root密码passwd root操作完成后执行sync确保数据写入然后输入exit退出root shell在恢复菜单选择“resume”正常启动系统。注意从恢复模式修改系统是最高权限操作务必谨慎。确保你修改的是自己的账户并且清楚每一步操作的影响。3.3 定制策略修改PAM配置文件解决了紧急问题我们更需要的是防患于未然即定制符合自己安全需求的锁定策略。策略通过修改PAM配置文件实现。主要涉及两个文件/etc/pam.d/common-auth用于控制本地登录、图形界面登录等认证。/etc/pam.d/sshd用于控制SSH远程登录的认证。通常建议对SSH配置更严格的策略因为它是网络攻击的主要入口。在修改前务必备份原文件sudo cp /etc/pam.d/common-auth /etc/pam.d/common-auth.backup sudo cp /etc/pam.d/sshd /etc/pam.d/sshd.backup我们以配置SSH的严格策略为例。打开/etc/pam.d/sshd文件找到与auth相关的配置行。你需要添加或修改pam_faillock.so模块的参数。一个常见的、增强安全性的配置示例如下。你需要将其添加到auth栈的合适位置通常是在其他auth模块之后auth required pam_faillock.so preauth silent audit deny3 even_deny_root unlock_time600 auth [success1 defaultbad] pam_unix.so nullok auth [defaultdie] pam_faillock.so authfail audit deny3 even_deny_root unlock_time600 auth sufficient pam_faillock.so authsucc让我们逐行解析这个配置第一行 (preauth)required: 表示本模块必须成功但如果失败PAM栈会继续执行后续模块最终结果仍为失败。silent: 静默模式如果用户未被锁定则不显示任何消息。audit: 将锁定事件记录到系统审计日志如/var/log/auth.log便于追踪。deny3:核心参数。允许连续失败尝试的次数。这里设置为3次即第4次失败就会触发锁定。even_deny_root:关键参数。让root用户也遵守此锁定策略。默认root是豁免的但从安全角度建议启用。启用后务必确保你有其他解锁途径如恢复模式或另一个具有sudo权限的账户。unlock_time600: 锁定时间秒。账户被锁后600秒10分钟后自动解锁。也可以设置为0表示必须由管理员手动解锁faillock --reset。第二行 (pam_unix.so)这是进行实际Unix密码验证的模块。[success1 defaultbad]是一个控制跳转的语法。意思是如果本模块认证成功success则跳过后面1个模块即第三行的authfail模块如果失败defaultbad则继续执行下一个模块。第三行 (authfail)在密码验证失败后执行。参数与第一行基本一致用于记录失败尝试。[defaultdie]表示如果执行到此模块意味着密码验证失败了则立即终止auth栈并返回失败。第四行 (authsucc)在密码验证成功后执行负责清除该用户的失败记录。sufficient表示本模块成功就足以让auth栈返回成功。对于本地图形界面或控制台登录修改/etc/pam.d/common-auth文件添加类似的配置块。参数可以根据需要调整例如deny次数可以设置得比SSH稍多比如5次unlock_time可以稍短以平衡安全性和用户体验。配置完成后无需重启系统新的PAM规则会在下一次认证请求时立即生效。你可以通过故意输错密码来测试策略是否工作并观察/var/log/auth.log中的日志记录。4. 高级管理与故障排查掌握了基本配置后我们来看一些更深入的管理技巧和常见问题。4.1 持久化失败记录默认情况下/var/run/faillock下的记录重启即消失。对于服务器我们可能希望持久化失败记录以便分析长期的攻击模式。可以通过修改PAM模块的dir参数来实现auth required pam_faillock.so preauth silent audit deny3 dir/var/log/faillock将dir指向/var/log/faillock需要手动创建该目录并设置合适权限如sudo mkdir /var/log/faillock; sudo chmod 750 /var/log/faillock。这样记录就会保存在磁盘上重启后依然存在。需要注意的是持久化记录可能导致账户被长期锁定因此需要配套更完善的监控和清理机制。4.2 与fail2ban的联动pam_faillock是系统层面的认证防御而fail2ban是一个更强大的、应用层面的入侵防御框架。fail2ban可以监控各种日志文件如/var/log/auth.log,/var/log/apache2/error.log根据自定义规则检测恶意行为如密码失败、漏洞扫描并自动调用防火墙规则如iptables或firewalld来封禁来源IP地址一段时间。它们可以协同工作构成纵深防御第一层pam_faillock在认证环节快速锁定单个用户账户阻止针对特定账户的密码猜测。第二层fail2ban在网络层面封禁表现出攻击行为的IP地址无论它尝试哪个用户直接阻断其连接。例如可以配置fail2ban监控SSH日志如果同一个IP地址在10分钟内触发了5次pam_faillock锁定事件在日志中体现为“pam_faillock(sshd:auth): Consecutive login failures for user”则将该IP封禁24小时。这样即使攻击者不断更换用户名尝试也会被IP封禁拦下。4.3 常见问题与排查命令配置后所有用户都无法登录这通常是因为PAM配置语法错误或模块路径问题。首先检查你修改的PAM文件语法确保每一行的模块类型auth, account等、控制标志required, sufficient等、模块路径和参数正确无误。一个快速回滚的方法是使用备份文件sudo cp /etc/pam.d/common-auth.backup /etc/pam.d/common-auth sudo cp /etc/pam.d/sshd.backup /etc/pam.d/sshd更安全的方法是在修改PAM配置前先在另一个终端或通过控制台保持一个活动的root或sudo会话以便配置出错时能及时恢复。为什么root用户还是没被锁定请确认配置中包含了even_deny_root参数。另外检查是否有其他PAM配置文件如/etc/pam.d/login或SSH配置/etc/ssh/sshd_config中的PermitRootLogin覆盖或影响了root的认证流程。如何查看实时的认证和锁定日志使用tail和grep命令实时监控认证日志是运维的基本功# 查看所有认证相关日志 sudo tail -f /var/log/auth.log # 仅查看与faillock相关的日志 sudo tail -f /var/log/auth.log | grep -i faillock # 查看特定用户如zhangsan的登录尝试 sudo grep zhangsan /var/log/auth.log日志中你会看到类似“pam_faillock(sshd:auth): Consecutive login failures for user zhangsan”和“pam_faillock(sshd:auth): Access denied for user zhangsan”的条目清晰记录了失败和锁定的过程。faillock命令显示“No such file or directory”或没有输出这表示/var/run/faillock目录下没有该用户的失败记录文件。可能的原因有该用户从未失败登录过系统重启后内存中的记录被清空或者PAM配置根本没有使用pam_faillock模块可能还在用旧的pam_tally2。你可以检查PAM配置文件来确认。从旧系统升级后策略不生效如果你从Ubuntu 18.04等更旧的版本升级而来系统可能仍在使用pam_tally2。你需要手动将配置迁移到pam_faillock。两者的参数和命令完全不同pam_tally2使用denyn、unlock_timen参数管理命令是pam_tally2。建议在新系统上按照本文所述重新配置pam_faillock。账户锁定策略是系统安全中“默默无闻”的守卫者。一个配置得当的策略能在不打扰合法用户的前提下有效抵御自动化脚本的暴力破解。我的经验是对于面向公网的服务器SSH的deny值不要大于3并启用even_deny_root同时结合fail2ban使用。对于内部桌面环境策略可以稍宽松。最重要的是在应用任何新策略到生产环境前务必在测试环境中验证并确保你至少有一条不受该策略影响的备用管理通道如物理控制台访问、恢复模式、或另一个未配置严格策略的管理账户。安全是一个平衡的艺术而清晰的配置和透彻的理解是维持这个平衡的关键。