系统时间错乱会导致pam密码过期判断失准,因chage和pam_unix.so等模块依赖系统时间与/etc/shadow日期字段做算术比较;时间偏差数小时或跨天会使未过期密码被误判为过期,日志仅显示“authentication token is no longer valid”等模糊错误。

系统时间错乱会导致 PAM 的密码过期判断完全失准——因为 chage 和 PAM 模块(如 pam_unix.so、pam_faillock.so)在验证密码是否过期时,全部依赖系统当前时间与 /etc/shadow 中的日期字段(如 passwd_last_changed、passwd_max_days)做算术比较。一旦系统时间严重偏差(比如快了3个月或慢了2周),原本未过期的密码会被判定为“已过期”,或相反,过期密码被误认为仍有效。这种故障隐蔽性强,日志里常只显示模糊的 PAM authentication failed 或 Authentication token is no longer valid,却找不到密码策略变更痕迹。
确认系统时间是否异常
先排除硬件时钟和系统时钟不同步这个最常见源头:
- 运行
date查看当前系统时间,注意年月日、时分秒及时区(如CST或UTC) - 运行
hwclock --show查看硬件时钟(RTC)时间,对比两者是否一致(允许几秒误差,但不可差数小时或跨天) - 检查 NTP 服务状态:
systemctl status chronyd(RHEL/CentOS 8+)或systemctl status ntpd(旧版),确认服务正在运行且同步正常(chronyc tracking中System time偏移应 - 若使用 systemd-timesyncd:
timedatectl status,关注System clock synchronized: yes和NTP service: active
检查 /etc/shadow 中的时间字段是否被时间错乱“污染”
系统时间错误期间执行过 passwd 或 chage,可能导致 /etc/shadow 第三列(密码最后修改时间)写入错误值,后续即使时间修复,PAM 仍按错误基准计算过期:
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
- 用
sudo chage -l username查看用户密码状态,重点关注Last password change和Password expires两行——如果显示的日期明显不合理(如 “Jan 01, 1970”、“Dec 31, 2025” 或未来一年),说明时间错乱期间更新过密码 - 直接查看
/etc/shadow对应用户的第三字段(用sudo awk -F: '$1=="root"{print $3}' /etc/shadow),该值是自 Unix 纪元(1970-01-01)起的天数,可换算验证:例如20100≈ 2025-01-15;若数值为0、负数或极大值(>25000),基本可断定被错误写入
验证 PAM 是否因时间问题拒绝认证
时间错乱引发的 PAM 失效,通常会在认证日志中留下关键线索:
- 查
/var/log/secure(CentOS/RHEL)或/var/log/auth.log(Ubuntu/Debian),搜索关键词:password expired、Authentication token is no longer valid、account expired - 重点观察错误发生时的**日志时间戳**是否与你当前
date输出不一致——比如日志里显示Sep 10,但date是Sep 15,说明系统时间已漂移,日志本身也不可信 - 临时启用更详细 PAM 日志:编辑
/etc/pam.d/sshd,在第一行加入auth [default=ignore] pam_echo.so debug msg="PAM auth start for ${USER}"(需安装pam_echo),重启 sshd 后重试登录,观察输出是否与预期时间逻辑矛盾
修复与预防措施
时间错乱导致的密码过期误判,不能只改时间,还需清理残留影响:
- 校准时间后,对所有受影响用户重置密码修改时间:
sudo chage -d $(date +%Y-%m-%d) username(将 last password change 设为今天) - 若需长期禁用密码过期(如 root 用于自动化任务),用
sudo chage -M -1 username(-1表示永不过期),而非单纯调大天数 - 检查并加固 NTP 配置:确保
/etc/chrony.conf或/etc/ntp.conf至少配置 3 个可靠上游服务器,添加makestep 1 3(chrony)或tinker stepout 120(ntpd)允许大步长校正 - 部署时间监控:用 cron 每 5 分钟执行
if [ $(ntpstat | grep -c "synchronised") -eq 0 ]; then echo "NTP unsync at $(date)" | mail -s "NTP Alert" admin@example.com; fi










