口令时效的全局缺省
/etc/login.defs 是 Linux 账号口令时效的全局缺省值来源:PASS_MAX_DAYS 定义口令最长可用天数,PASS_MIN_DAYS 定义改完之后至少隔几天才能再改(防止用户靠连续改密绕过历史记录),PASS_WARN_AGE 定义到期前几天开始提示。它只影响“之后新建账号”和“之后改密”的动作,存量账号的真实时效记录在 /etc/shadow 里,所以改完全局配置还要批量对齐老账号,否则审计现场看到的仍是不达标。
基本信息
| 加固项 | 口令有效期、最短使用期与到期提醒 |
|---|---|
| 适用平台 | Linux(RHEL/CentOS、Debian/Ubuntu,login.defs + shadow) |
| 权限要求 | root |
| 常见基线 | PASS_MAX_DAYS 90(按等保要求可放宽到 365)、PASS_MIN_DAYS 1、PASS_WARN_AGE 7 |
| 落地位置 | /etc/login.defs 定缺省,chage 定单个账号 |
典型使用场景
- 等保测评“口令定期更换”条款的取证与整改
- 新装系统统一口令时效策略,避免逐台手工设置
- 安全审计发现大量账号从未改密,需要一次性对齐
- 特权账号与普通账号采用不同时效时做差异化配置
- 离职账号回收前确认其口令有效期状态
全局配置
全局配置
grep -E '^PASS_' /etc/login.defs # 先看现状
sed -i 's/^PASS_MAX_DAYS.*/PASS_MAX_DAYS 90/' /etc/login.defs
sed -i 's/^PASS_MIN_DAYS.*/PASS_MIN_DAYS 1/' /etc/login.defs
sed -i 's/^PASS_WARN_AGE.*/PASS_WARN_AGE 7/' /etc/login.defs
grep -E '^PASS_' /etc/login.defs # 复核存量账号对齐与抽查
存量账号对齐与抽查
chage -l someuser # 单账号视角:有效期、最短使用期、提醒、是否过期
chage -M 90 -m 1 -W 7 someuser # 对齐单个账号
awk -F: '{print $1, $4, $5, $6}' /etc/shadow | head # 第 4/5/6 列分别是 min/max/warn
awk -F: '($5 > 90 || $5 == "") {print $1, $5}' /etc/shadow # 快速找出超期或未设有效期的账号配置项与 shadow 列对应
| 配置项 | shadow 列 | 含义 |
|---|---|---|
| PASS_MAX_DAYS | 第 5 列 | 口令最长可用天数,空值表示永不过期 |
| PASS_MIN_DAYS | 第 4 列 | 两次改密之间的最小间隔天数 |
| PASS_WARN_AGE | 第 6 列 | 到期前开始提醒的天数 |
| (无全局项) | 第 7 列 | 闲置天数,超过后账号自动失效,需单独设置 |
login.defs 只改缺省值,不会回写已有账号:登录现场做审计时读的是 /etc/shadow 的实际字段。稳妥做法是先改全局,再用 chage 批量覆盖存量账号,最后用 awk 统计一遍还有多少账号超期。
把 PASS_MAX_DAYS 设成 -1 或 99999 等于取消有效期,是审计中最常见的扣分项;反过来把 PASS_MIN_DAYS 设得过大(如 30)会让用户在被钓鱼后无法立即改回口令,也会影响应急轮换。两个值都要结合运营节奏定,不要照抄模板。