核心是用PAM的pam_time.so模块配合/etc/security/time.conf,在account阶段认证通过后、会话建立前拦截非授权时段操作;需在目标服务(如sshd、sudo)的account段首行添加account required pam_time.so,并按service;ttys;users;times格式编写规则,支持Wk、Al等时间缩写及timeout=会话时长限制。

要实现基于时间窗口的动态操作权限管控,核心是用 PAM 的 pam_time.so 模块配合 /etc/security/time.conf 文件,在 account 阶段做即时判断——不是登录后才检查,而是在认证通过、会话建立前就拦截非授权时段的操作请求。
一、启用 pam_time.so 并挂载到目标服务
该模块必须显式加载到你要控制的服务配置中,且类型为 account,位置需靠前(建议首行),否则可能被后续模块跳过:
- 编辑 /etc/pam.d/sshd(控制 SSH 登录)或 /etc/pam.d/sudo(控制 sudo 权限),在 account 段最上方添加:
account required pam_time.so - 若管控数据库维护命令(如
psql -U admin),需确认其调用的 PAM 服务名(常见为postgres或su),并在对应/etc/pam.d/xxx文件中添加相同行 - 修改后执行
sudo systemctl reload sshd(SSH)或sudo systemctl restart sudo(部分系统需重启相关服务)
二、编写 time.conf 实现精准时间策略
规则格式固定为:service;ttys;users;times,四字段用分号分隔,空格会被忽略,# 开头为注释:
-
service:必须与 PAM 服务名完全一致,如
sshd、sudo、login;写成ssh或SuDo均无效 -
ttys:可指定终端,
*表示所有,tty1表示本地第1虚拟控制台,pts/0表示首个 SSH 伪终端 -
users:支持单用户(
alice)、组(@dbadmin)、全体(ALL),可用!取反,如!root -
times:24 小时制、无冒号、不跨天;常用缩写:
Wk(周一至五)、MoTuWe(周一周二周三)、Sa/Su(单日)、Al(每天);例如:Wk0200-0400表示工作日凌晨 2:00–4:00
示例:仅允许 dba 组在凌晨 2:00–4:00 通过 SSH 执行数据库维护:sshd;*;@dba;Wk0200-0400
三、扩展控制:结合 session 模块限制会话时长
仅靠 pam_time 只能控制“能否开始”,若还需限制“能持续多久”,需搭配 session 类型模块:
- 在相同服务文件(如
/etc/pam.d/sshd)的 session 段添加:session required pam_time.so - 在
/etc/security/time.conf中补充带timeout=的规则,例如:sshd;*;@dba;Wk0200-0400;timeout=1800(单位为秒,即 30 分钟) - 超时后会话自动终止,用户收到 Connection closed,无法继续操作
四、验证与避坑要点
实测前务必保留一个不受限的 root 或管理员会话,防止误锁:
- 用
sudo pam_authenticate --debug或sshd -t检查语法是否合法 - 在非授权时段尝试触发目标操作(如 SSH 登录或 sudo 命令),应直接返回
Permission denied,且不提示密码输入 - 常见失效原因:pam_time.so 写在 account 段太靠后;time.conf 中 service 名拼错;times 字段含空格或冒号;用户属于多个组但规则未覆盖全部路径
- 若系统已启用
pam_faillock.so,建议在 pam_time 行末加silent参数,避免非授权时段尝试被误计入失败计数

















