非常游戏网
如何在Linux中修改用户密码过期警告天数 Linux设置密码策略的方法

如何在Linux中修改用户密码过期警告天数 Linux设置密码策略的方法

2026-05-20301006

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 14chage -W 的默认值,仅当创建用户时未指定 -W 才采纳
  • PASS_MIN_LEN 12 在大多数现代发行版中已被 pam_pwquality.so 忽略,仅作文档参考
  • 修改 /etc/login.defs 后,务必检查 useradd -D 输出是否同步,避免因缓存或语法错误导致新用户策略失效

真正容易被忽略的是:chage 设置和 pam_pwquality 校验属于两个独立阶段,一个管「什么时候必须改」,一个管「改的时候必须多强」。漏掉任一环,策略就形同虚设。

标签: