Linux 登录变慢主因是 PAM 模块触发 DNS 解析、网络请求或 SELinux 策略检查等耗时操作,需检查 /etc/pam.d/ 下配置文件中 auth/account 段的 pam_exec.so、pam_succeed_if.so 等模块行为,并结合 debug 日志、strace 及 SELinux 状态定位阻塞点。

Linux 登录变慢,往往不是系统整体卡顿,而是输入密码后等待数秒才进入 shell——这大概率是 PAM(Pluggable Authentication Modules)模块在后台执行了耗时操作。问题不在密码校验本身,而在认证流程中加载的 PAM 子模块是否触发了网络请求、DNS 解析、SELinux 策略检查或冗余服务调用。
检查 PAM 配置文件的加载顺序和模块行为
PAM 通过 /etc/pam.d/login、/etc/pam.d/sshd(SSH 登录)、/etc/pam.d/system-auth 等文件协同工作。关键要确认哪些模块被启用、是否设置了 [success=1 default=ignore] 这类跳转逻辑,以及是否存在 required 模块失败后仍强制执行后续模块的情况。
- 用 grep -v “^#” /etc/pam.d/login | grep -v “^$” 快速过滤注释与空行,观察实际生效行
- 重点关注 auth 和account段:如 pam_exec.so、pam_access.so、pam_time.so 等都可能引入延迟
- 若启用了pam_faildelay.so,它会在认证失败后主动 sleep,默认延迟 3 秒——即使成功登录也可能受其影响(取决于配置位置)
排查 DNS 与网络依赖模块
很多 PAM 模块(如 pam_listfile.so 配合 onerr=succeed 读取远程路径、pam_env.so调用 /etc/security/pam_env.conf 中的变量替换)会间接触发 DNS 查询。更常见的是 pam_succeed_if.so 中使用 user ingroup 或host条件时,若组信息来自 LDAP 或 NIS,或 host 参数需反向 DNS 解析,就会卡住。
- 临时禁用 /etc/nsswitch.conf 中hosts:行的 dns,改用files 测试是否改善
- 在 PAM 配置中为可疑模块添加 debug 选项(如 auth [default=ignore] pam_succeed_if.so debug user ingroup admin),查看/var/log/secure 或journalctl -u sshd中的详细日志
- 用 strace -f -e trace=connect,openat,read,write -p $(pgrep sshd) 捕获登录过程中的系统调用,定位阻塞点
警惕 SELinux 与 auditd 的隐式开销
在启用 SELinux 的系统上,pam_selinux.so模块会在每次登录时检查用户上下文策略,若策略复杂或 auditd 服务高负载,会导致明显延迟。同样,pam_loginuid.so会向内核写入 loginuid,若 audit subsystem 响应慢,也会拖慢流程。
- 运行 sestatus 确认 SELinux 状态;临时设为 permissive 模式(setenforce 0)测试登录速度变化
- 检查 /etc/pam.d/system-auth 中pam_loginuid.so是否带 try 选项(如[success=ok default=ignore] pam_loginuid.so try),避免因 audit 不可用而阻塞
- 用 ausearch -m avc -ts recent 查看是否有大量 SELinux 拒绝日志,说明策略频繁干预
精简非必要 PAM 模块并启用 faildelay 优化
默认发行版常预置多个安全增强模块,但并非所有场景都需要。例如 pam_tally2.so(已废弃)或pam_faildelay.so 在无暴力破解风险的内网环境可移除;pam_umask.so、pam_limits.so若配置简单,影响小,但若引用了外部配置文件或脚本,则需验证。
- 将 pam_faildelay.so 从auth段移到 auth [default=ignore] 之后,或直接注释掉——它只为防爆破设计,不应影响正常登录体验
- 用 pam_timestamp.so 替代重复密码输入时,注意其缓存目录 /var/run/sudo/timestamps/ 权限和磁盘 IO,避免因 tmpfs 满或 inode 耗尽导致阻塞
- 对调试确认无用的模块,用 # 注释而非删除,便于回滚;修改后务必用 ssh localhost 或虚拟终端实测,避免锁死自己






























