真正起效的密码最短长度必须由PAM模块pam_pwquality.so控制,/etc/login.defs中PASS_MIN_LEN仅影响新建用户默认值且不强制生效;需同步配置/etc/security/pwquality.conf的minlen参数并确保system-auth中正确加载该模块。

PASS_MIN_LEN 在 /etc/login.defs 中只是“新建用户”的默认参考值,不强制生效。真正起效的密码长度限制必须由 PAM 模块控制,核心是 pam_pwquality.so(或兼容的 pam_cracklib.so)。
/etc/login.defs 的 PASS_MIN_LEN 为什么改了没用
- 它只影响
useradd创建新用户时的默认策略,且仅在未显式指定密码策略时作为 fallback - 普通用户自己执行
passwd时,完全不读取该值 - root 用
passwd username强制改他人密码时,也绕过此限制 - 实测:设
PASS_MIN_LEN 12,仍可成功设置 6 位密码(只要 PAM 没拦)
所以别只改这个文件,否则白忙。
必须配置 pam_pwquality.so 才能强制最小长度
CentOS 7 默认启用 pam_pwquality.so(替代旧版 pam_cracklib.so),它从 /etc/security/pwquality.conf 读取规则,优先级高于 /etc/login.defs。
- 编辑
/etc/security/pwquality.conf - 确保以下行已取消注释并设为所需值:
-
minlen = 8—— 最小总长度(注意:不是“至少 8 位”,而是“至少 8 字符”,含大小写/数字/符号) -
lcredit = -1—— 至少 1 个小写字母 -
ucredit = -1—— 至少 1 个大写字母 -
dcredit = -1—— 至少 1 个数字 -
ocredit = -1—— 至少 1 个特殊字符
-
⚠️ 注意:minlen 是硬性下限,但若其他 credit 规则叠加后实际所需长度更高(比如要求 1 大 + 1 小 + 1 数 + 1 符),那密码必须 ≥ 4 字符,但 minlen=8 会覆盖并强制 ≥ 8。
CentOS Linux 7.9.2009是传统CentOS Linux 7的最后主要版本,也是很多企业历史服务器中仍可能遇到的系统版本。它以稳定、兼容RHEL 7生态、文档丰富和软件支持广泛著称,曾长期用于Web服务、数据库、虚拟化节点和企业内部业务系统。不过CentOS Linux 7已于2024年6月30日停止维护,现在继续使用会面临安全补丁缺失风险。该版本更适合旧业务迁移、历史环境恢复或离
system-auth 中的模块调用不能缺失
即使 pwquality.conf 配好了,如果 /etc/pam.d/system-auth 里没加载 pam_pwquality.so,规则照样不生效。
检查是否存在类似这一行(通常在 password requisite 段):
password requisite pam_pwquality.so try_first_pass local_users_only retry=3
- 如果被注释掉或缺失,需手动添加(推荐放在
pam_unix.so之前) - 不要同时保留
pam_cracklib.so和pam_pwquality.so,二者冲突,优先用后者
测试是否真生效:用普通用户操作
- 切换到非 root 用户(如
test),运行passwd - 输入一个 7 位纯字母密码,应直接报错:
Bad password: The password fails the dictionary check - it is based on a dictionary word或类似提示(具体取决于其他规则) - 若仍能设成功,说明:
-
pam_pwquality.so未被调用(检查system-auth) - 或
pwquality.conf路径错误 / 权限不对(应为 600,属主 root) - 或该用户被
local_users_only排除(比如是 LDAP 用户)
-
root 用户修改自己密码时默认受控;但 root 修改其他用户密码时,try_first_pass 可能跳过复杂度检查——这是设计行为,不是 bug。
真正卡住密码长度的地方只有两个:PAM 模块加载 + pwquality.conf 中的 minlen。其他文件都是辅助或仅对新建用户起始作用。漏掉任一环,都等于没设。

















