Linux系统密码过期警告天数由chage -W设置,该值必须小于-M设定的最大有效期才生效,仅对交互式登录用户提示,且不适用于已过期密码或非密码认证场景。
chage -W 设置密码过期警告天数
用户在密码到期前收不到提醒,通常是因为 -W 参数没设或设得太小。这个值不控制“密码什么时候过期”,只控制“提前几天开始弹警告”。默认可能是 7 天,但很多系统压根没配,导致用户登录时突然被锁。
执行命令即可立即生效:
sudo chage -W 14 username
注意:-W 值必须小于 -M(最大有效期),否则警告不会触发。比如 -M 30 却设 -W 45,实际无效;系统日志里也不会报错,只会静默忽略。
- 警告仅在用户通过 SSH、console 或 GUI 登录时显示,不适用于 cron、systemd 服务等后台上下文
- 警告信息是 PAM 自动插入的,无法自定义文案,但可通过修改
/etc/pam.d/sshd或/etc/pam.d/login中的pam_pwquality.so行加retry=3提升交互体验 - 如果用户已处于密码过期状态(
chage -l显示Password expires: password must be changed),-W不再起作用
pam_pwquality.so 配置密码复杂度规则
只改 chage 不够——用户可能设个 Abc123!@# 就过关,但这种密码仍易被爆破。真正起效的是 pam_pwquality.so 模块,它在每次执行 passwd 时校验强度。
关键不是往 /etc/pam.d/common-password 里随便加一行,而是确保它出现在所有 password [default=ok] 规则之前,且用 requisite 类型中断流程:
password requisite pam_pwquality.so retry=3 minlen=12 difok=5 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1 maxrepeat=2 reject_username=1
常见踩坑点:
-
minlen=12和/etc/login.defs里的PASS_MIN_LEN冲突:后者只影响新用户初始策略,不干预passwd修改行为,优先级低于 PAM 模块 -
difok=5要求新旧密码至少 5 字符不同,但如果用户用passwd改密时输错两次,retry=3用完后直接退出,不会回退到旧密码 - 特殊字符限制(
ocredit=-1)对中文终端或某些 locale 可能误判,建议搭配en_US.UTF-8环境测试
强制用户下次登录改密:chage -d 0 的真实含义
chage -d 0 username 并不是“把密码设为空”或“标记为弱密码”,而是把 shadow 文件中 passwd 字段的最后修改时间设为 1970-01-01。系统一比对:「上次改密是 56 年前,早该换了」,于是拦截登录流程。
Swoole linux版
Swoole 是一款面向生产环境的 PHP 异步网络通信引擎,专为 Linux 操作系统设计(同时支持 FreeBSD 和 macOS)。它采用纯 C 语言编写,作为 PHP 扩展运行后会接管程序控制权并进入事件循环。区别于传统 Web 框架,Swoole 使 PHP 开发者能够编写高性能的异步并发 TCP、UDP、WebSocket 服务,并支持协程与毫秒定时器,广泛应用于物联网、网络游戏等高性能场景。
验证方式很简单:
sudo chage -l username
输出中若出现 Last password change : Jan 01, 1970,就表示已生效。用户下次输入正确密码后,不会进 shell,而是直接跳转到 passwd 提示符要求重设。
- 该操作对 root 用户也有效,但 root 密码过期后仍可物理控制台登录(除非禁用 root shell)
- 如果用户用 SSH 密钥登录,
chage -d 0不会触发改密流程——因为没走密码认证路径。必须配合PasswordAuthentication yes才可靠 - 批量设置时别用循环跑
chage -d 0后立刻passwd -d清空密码:这会导致账户无密码且强制改密,反而无法登录
/etc/login.defs 与全局策略的边界
/etc/login.defs 只影响新创建的用户(useradd),对已有用户完全无效。它设定的是「模板值」,写入 shadow 时的一次性快照。
例如改了 PASS_MAX_DAYS 90,再新建用户 testuser,其 chage -l testuser 会显示 Maximum number of days between password change : 90;但对已存在的 admin 用户,必须显式运行 chage -M 90 admin 才会更新。
-
PASS_WARN_AGE 14是chage -W的默认值,仅当创建用户时未指定-W才采纳 -
PASS_MIN_LEN 12在大多数现代发行版中已被pam_pwquality.so忽略,仅作文档参考 - 修改
/etc/login.defs后,务必检查useradd -D输出是否同步,避免因缓存或语法错误导致新用户策略失效
真正容易被忽略的是:chage 设置和 pam_pwquality 校验属于两个独立阶段,一个管「什么时候必须改」,一个管「改的时候必须多强」。漏掉任一环,策略就形同虚设。