在CentOS 7中,若要设置密码最小长度,需同时配置/etc/login.defs中的PASS_MIN_LEN参数以及/etc/pam.d/system-auth中的pam_pwquality.so模块的minlen参数。需要注意的是,前者仅对useradd创建的新用户初始密码起作用,而后者才是真正对所有passwd操作进行校验的关键,两者缺一不可。

CentOS 7 设置密码最小长度,不能只改一个地方 —— PASS_MIN_LEN 在 /etc/login.defs 里只影响新建用户;真正拦住密码设置的,是 PAM 模块里的 pam_pwquality.so 配置。漏掉任意一处,都可能让弱密码通过。
修改 /etc/login.defs 中的 PASS_MIN_LEN
这个值仅在用 useradd 创建新用户时生效,对已有用户或 passwd 修改密码无约束力。
- 编辑文件:
sudo vi /etc/login.defs - 找到或添加这一行:
PASS_MIN_LEN 8(不要写成PASS_MIN_LENGTH,后者无效) - 注意:该参数最大支持 999,但实际生效依赖 PAM,单独设了不等于生效
配置 pam_pwquality.so 强制执行最小长度
这是真正起效的核心环节。CentOS 7 默认使用 pam_pwquality.so(不是旧版 pam_cracklib.so),必须在 /etc/pam.d/system-auth 中正确配置。
- 打开文件:
sudo vi /etc/pam.d/system-auth - 找到以
password requisite pam_pwquality.so开头的行(通常在第 20 行左右) - 确保它包含
minlen=8,例如:password requisite pam_pwquality.so try_first_pass local_users_only retry=3 minlen=8 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1 - 如果该行被注释(# 开头)或缺失,需取消注释或新增;重复出现的行会导致策略叠加失败
- 改完后立即生效,无需重启服务
验证是否生效的几个关键点
光改配置不验证,等于没改。常见“以为生效了但其实没拦住”的情况,往往出在这里:
- 测试命令:
passwd当前用户,尝试设 7 位纯数字密码 —— 应报错:password not accepted或类似提示 - 检查实际加载的参数:
grep -v "^#" /etc/security/pwquality.conf | grep minlen,确认minlen = 8存在(authconfig命令会写入此文件,但手动编辑system-auth优先级更高) - 注意 root 用户默认不受限:若要强制 root 也遵守,必须加
enforce_for_root参数,否则passwd root可绕过 chage -l username查看的是密码有效期,跟长度无关,别混淆
最容易被忽略的是:/etc/login.defs 的 PASS_MIN_LEN 和 PAM 的 minlen 是两套机制,前者只管新建用户初始密码生成逻辑,后者才真正校验每次 passwd 输入。生产环境务必两者都设,且以 PAM 配置为准。