sudo 可通过 PAM 的 pam_time.so 模块实现时间段权限控制:在 /etc/pam.d/sudo 中添加 auth [default=die] pam_time.so,并在 /etc/security/time.conf 中配置如 sudo;Al0h;@admin;Wk0900-1759;and 的规则,结合用户组与 sudoers 实现细粒度时段管控。

sudo 本身不直接支持按时间段控制提权,但可以通过 PAM 的 pam_time.so 模块实现“仅在特定时间段内允许执行 sudo 命令”的效果。核心思路是:让 sudo 的 PAM 配置链调用 pam_time.so,并依据时间规则(如工作日 9:00–18:00)动态放行或拒绝认证请求。
确认并启用 sudo 的 PAM 时间控制
sudo 的行为由 /etc/pam.d/sudo 文件定义。该文件默认可能为空或仅包含 minimal 配置,需手动补充 pam_time 规则:
- 编辑
/etc/pam.d/sudo,在顶部添加一行(确保在其他 auth 规则之前):auth [default=die] pam_time.so - 若该文件不存在,可复制
/etc/pam.d/su或创建新文件;注意权限应为644,且不可被普通用户修改 - 确保系统已安装
pam_time模块(常见于大多数发行版,如 RHEL/CentOS/Debian 默认包含)
配置 /etc/security/time.conf 实现时段策略
所有时间规则统一写入 /etc/security/time.conf。每行格式为:service;ttys;users;times;restrictions
- 关键字段示例(允许 admin 组用户仅在工作日 9:00–17:59 使用 sudo):
sudo;Al0h;@admin;Wk0900-1759;and - 说明:
•sudo:匹配 PAM service 名
•Al0h:表示所有终端(tty)和图形会话(包括 ssh、gnome-terminal 等)
•@admin:指 admin 组所有成员(组名前加 @)
•Wk0900-1759:周一至周五(Wk)的 09:00 至 17:59
•and:表示该规则与其他规则逻辑“与”关系(常用,避免意外放行) - 支持的时间标识:
•Mo,Tu,We,Th,Fr,Sa,Su或Wk(工作日)、Wd(非工作日)
•Al(全天)、Al0h(所有会话类型)
• 时间格式为 24 小时制,如0800-1200、1330-1700
配合用户组与 sudoers 实现细粒度协同
PAM 时间控制只管“能否通过认证”,不替代 sudo 权限定义。需同步做好权限隔离:
- 将需受时段限制的用户加入特定组(如
admin),避免影响其他 sudo 用户 - 在
/etc/sudoers中明确授权该组,例如:%admin ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx - 注意:pam_time 在 auth 阶段拦截,一旦拒绝,sudo 连密码提示都不会出现;若通过时间校验,才进入 sudoers 权限检查阶段
- 测试建议用
sudo -l或sudo whoami,并在跨时段边界(如 17:59 和 18:00)验证是否即时生效
验证与排错要点
时间策略生效依赖系统时钟准确及 PAM 加载顺序:
- 确保系统使用 NTP 同步时间(如
timedatectl status显示 “System clock synchronized: yes”) - 查看
/var/log/auth.log(Debian/Ubuntu)或/var/log/secure(RHEL/CentOS)中 pam_time 相关日志,关键词如 “pam_time: access denied” - 临时调试可加
debug参数到 pam_time 行:auth [default=die] pam_time.so debug,日志会输出匹配过程 - 若规则未生效,检查
time.conf中是否有语法错误(如分号缺失、空格误用)、用户是否确属目标组、以及是否遗漏@符号(@admin≠admin)

















