应使用 pam 的 pam_time.so 模块配置时段登录控制,在 /etc/pam.d/sshd 和 /etc/pam.d/login 的 account 段首行添加 account required pam_time.so,并正确设置 /etc/security/time.conf 规则,如 sshd;*;alice;wk0830-1730,确保日志记录、时区准确及会话超时加固。

在 Linux 系统中,设置账号在非工作时间禁止登录,核心是利用 PAM 的 pam_time.so 模块做时段控制,而不是简单禁用账户或改 shell。这种方式既保留账号功能(如 cron、服务调用),又让“非工作时间登录”本身成为可识别、可记录的安全信号。
配置 pam_time.so 实现时段拦截
这是最推荐的方案,精准、可审计、不影响其他系统行为:
- 编辑
/etc/pam.d/sshd(SSH 登录)和/或/etc/pam.d/login(本地终端),在account段最上方添加:account required pam_time.so - 确保
/etc/security/time.conf存在且格式正确,每行一条规则,格式为:service;ttys;users;times - 示例(仅允许用户
alice工作日 8:30–17:30 登录 SSH):sshd;*;alice;Wk0830-1730 - 注意:时间必须用 24 小时制、无冒号;
Wk表示周一至五,Al表示每天;service名必须与 PAM 服务名一致(如sshd,不能写成ssh)
确保拦截行为可追溯
单纯拒绝不够,要让异常登录尝试留下线索:
- 检查日志是否记录:Linux 下查看
/var/log/auth.log,应有类似pam_time(sshd:account): access denied for user `alice'的条目 - 避免静默失败:配置正确时,用户会直接收到
Permission denied,不提示输密码——这本身就是一种明确反馈 - 若同时启用登录失败锁定(如
pam_faillock.so),需加silent参数,防止时段拒绝被误判为暴力破解
补充加固:防止超时滞留与跨时段会话
时段限制只管“能不能登录”,不管“登录后待多久”。需额外控制已登录会话:
- 设置 Shell 空闲超时:在
/etc/profile.d/autologout.sh中添加export TMOUT=900(15 分钟无操作自动退出),并执行readonly TMOUT - 启用 SSH 心跳探测:在
/etc/ssh/sshd_config中加入ClientAliveInterval 300ClientAliveCountMax 1
5 分钟无响应即断开连接 - 定时清理:可写脚本检查
who或w输出,对非授权时段仍活跃的会话执行kill -9(建议每 10 分钟执行一次)
避坑要点
常见失效原因往往不是配置错,而是细节疏漏:
- PAM 行写在
/etc/pam.d/sshd太靠后,被其他模块跳过——务必放在account段最上方 -
time.conf中service名拼错(如写成ssh或SSH),导致规则不生效 - 系统时区不准:
timedatectl status确认使用的是本地时间(pam_time不读 UTC) - 测试前务必保留一个未受限制的 root 或管理员会话,避免自己被锁出











