应使用PAM time模块在auth阶段拦截:第一步备份common-auth;第二步在末尾添加auth [default=die] pam_time.so;第三步在time.conf中配置tempuser;Al0800-2000;ttys|ssh|console;Al0101-1231;and;/bin/login;/usr/bin/gdm-session-worker;/usr/libexec/openssh/sshd;ALLOW;第四步保存即生效,非授权时段登录直接提示“Access denied”。

银河麒麟系统需对特定账户(如外包人员、临时工或三权账户)实施时段访问控制,防止其在非工作时间(例如20:00至次日8:00)登录系统,避免越权操作或审计盲区。
通过PAM time模块实现登录时段限制
该方法直接拦截认证流程,在用户输入密码阶段即拒绝非授权时段的登录请求,无需修改桌面环境或服务配置,生效快且覆盖SSH、图形登录、控制台等全部入口。
第一步:备份原始认证配置文件,防止误操作导致系统无法登录:
sudo cp /etc/pam.d/common-auth /etc/pam.d/common-auth.bak
第二步:编辑common-auth,在末尾新增一行启用time模块校验:
sudo nano /etc/pam.d/common-auth
在文件最底部插入:
auth [default=die] pam_time.so
第三步:创建或编辑时间策略文件,精确指定用户与允许时段:
sudo nano /etc/security/time.conf
在该文件中添加规则,例如限制用户tempuser仅可在工作日8:00–20:00登录:
tempuser;Al0800-2000;ttys|ssh|console;Al0101-1231;and;/bin/login;/usr/bin/gdm-session-worker;/usr/libexec/openssh/sshd;ALLOW
注意:Al表示“all days”,ttys代表本地终端,ssh代表远程SSH,console涵盖Ctrl+Alt+F1~F6;【规则末尾必须显式写ALLOW,否则默认全部DENY】
第四步:保存退出后,无需重启服务,策略立即生效。切换至tempuser账户在20:01尝试TTY登录,将直接提示“Access denied”并退出认证流程。
验证与调试登录时段策略
当策略未按预期生效时,需确认是否被其他PAM模块提前终止认证链,或规则语法存在隐性错误。
执行以下命令查看当前用户登录时的PAM调试日志:
sudo journalctl -u systemd-logind --since "1 hour ago" | grep -i "pam_time"
若无输出,说明pam_time.so未被触发,检查common-auth中是否遗漏了auth行,或该行被前面的sufficient模块跳过。
临时启用详细日志辅助排查:在/etc/pam.d/common-auth中将pam_time.so行改为:
auth [default=bad success=ok] pam_time.so debug
该设置会在/var/log/auth.log中记录每次匹配过程,包括时间戳比对结果和字段解析状态。
方法二:使用systemd-logind会话级限制(仅限图形与本地TTY)
此方式不干预认证本身,而是在用户通过密码验证后、会话建立前进行拦截,适用于已启用logind管理的桌面环境(如UKUI、Kylin Desktop),但对纯SSH登录无效。
方法一:为指定用户创建logind配置片段:
sudo mkdir -p /etc/systemd/logind.conf.d/
sudo nano /etc/systemd/logind.conf.d/restrict-tempuser.conf
写入以下内容,禁止tempuser在20:00–07:59期间建立新会话:
[Login]
AllowSuspend=no
AllowHibernate=no
IdleAction=lock
IdleActionSec=300
SessionMax=1
StopIdleSessionSec=300
# 以下为关键限制
RestrictSessions=yes
StopSessionTimeoutSec=0
StopIdleSessionSec=0
IdleActionSec=0
⚠️ 注意:systemd-logind原生不支持时间范围限制,上述配置仅能全局禁用会话;真正实现时段控制需配合外部脚本与logind的Inhibit机制,复杂度高且易失效,【不推荐用于生产环境的时段管控】。
方法二:直接使用loginctl命令临时锁定用户会话(仅当前生效):
sudo loginctl lock-session
该操作无法按时间自动触发,需配合cron定时任务手动执行,稳定性差。

















