Linux PAM会话超时与闲置断开通过pam_idle、pam_time、pam_faillock等模块在认证会话层实现底层控制,比TMOUT或SSH参数更安全,适用于高安全场景,支持空闲冻结、时段限制与认证强化。

Linux PAM 会话超时与闲置断开,核心是通过 PAM 模块在认证会话层面 施加控制,比单纯依赖 shell 变量(如 TMOUT)或 SSH 参数更底层、更难绕过,适用于高安全要求场景。它不替代 TMOUT 或 ClientAlive,而是作为补充加固层,尤其对本地 TTY 和图形登录有效。
一、用 pam_idle 实现空闲冻结(非登出)
该模块让空闲会话进入“冻结”状态,用户按键后需重新输入密码才能恢复,等效于锁屏。
- 编辑 /etc/pam.d/login(控制本地 TTY)或 /etc/pam.d/gdm-password(GNOME)等对应服务文件
- 在 session 段添加一行:
session optional pam_idle.so timeout=900
(900 秒 = 15 分钟) - 确保 /etc/systemd/logind.conf 中已设:
IdleAction=lockIdleActionSec=900
并执行sudo systemctl restart systemd-logind
二、用 pam_time 限制登录时段 + 强制踢出
该方式可阻止用户在非授权时间建立新会话,也能配合脚本清理已存在的跨时段会话。
- 编辑 /etc/security/time.conf,添加规则,例如:
*;Al0800-1800;admin;!Al0800-1800
表示仅允许 admin 在工作日 08:00–18:00 登录 - 确认 /etc/pam.d/sshd 和 /etc/pam.d/login 中包含:
account required pam_time.so - 对已登录但超出时段的会话,需额外用定时脚本 kill:
who | awk '$1=="admin" && $3 !~ /^(0[8-9]|1[0-7]):[0-5][0-9]$/' | awk '{print $2}' | xargs -r kill -TERM
三、用 pam_faillock 配合空闲策略增强认证强度
当会话被 pam_idle 冻结后恢复,或用户尝试在非时段登录时,pam_faillock 可强制走完整认证流程,并记录失败次数。
- 在 /etc/pam.d/login 的 auth 段添加两行(顺序不可颠倒):
auth [default=ignore] pam_faillock.so preauth silent deny=3 unlock_time=600auth [default=die] pam_faillock.so authfail deny=3 unlock_time=600 - 在 account 段添加:
account required pam_faillock.so - 这样即使用户知道密码,若连续输错 3 次,账户将被锁定 10 分钟
四、验证与常见失效点
配置后务必实测,避免“以为生效实则无效”:
- 切到本地 TTY(Ctrl+Alt+F2),登录后静置 15 分钟 → 按任意键 → 应提示输入用户名和密码
- 检查
journalctl -u systemd-logind -n 20是否有 idle lock 相关日志 - 若无反应,重点排查:
– pam_idle.so 是否已安装(find /lib* -name "pam_idle.so")
– logind.conf 是否重启生效
– PAM 配置文件路径是否正确(不同发行版略有差异)











