centos 7 密码复杂度须修改 /etc/pam.d/system-auth 中 pam_pwquality.so 行,添加 minlen=8 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1 enforce_for_root 等参数,仅改 /etc/login.defs 无效;需配合 remember=5 和 difok=3 防重用,并用 pwscore/cracklib-check 验证。

修改 /etc/pam.d/system-auth 中的 pam_pwquality.so 行
CentOS 7 默认使用 pam_pwquality.so(而非旧版 pam_cracklib.so)控制密码复杂度,实际生效的配置就在这行里。必须找到并编辑它,不能只改 /etc/login.defs —— 那个文件只影响 PASS_MIN_LEN 这类基础长度,对大小写/数字/特殊字符无约束力。
打开文件:sudo vim /etc/pam.d/system-auth
定位到类似这行(通常在 password requisite 开头的位置):password requisite pam_pwquality.so try_first_pass local_users_only retry=3
在行尾追加参数,例如要求「至少8位、1个大写、1个小写、1个数字、1个特殊字符」:minlen=8 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1 enforce_for_root
关键点:
• ucredit=-1 表示“至少1个大写字母”,正数才是“最多”
• enforce_for_root 必须加上,否则 root 用 passwd username 给别人设密码时会绕过所有规则
• 不要删掉原有参数(如 try_first_pass),只追加
为什么改了没生效?常见验证失败原因
改完不生效,90% 是因为以下情况之一:
• 新建用户后立刻测试:/etc/login.defs 的 PASS_MIN_LEN 只对普通用户自己运行 passwd 生效;而 root 给用户设初始密码时,pam_pwquality 规则默认不触发 —— 必须加 enforce_for_root 才管用
• 没重启任何服务:PAM 规则是即时生效的,不需要重启 sshd 或 reboot,但需确保你测试的是「用户自己执行 passwd」,不是 root 替他设
• 参数拼错或空格漏了:比如写成 ucredit= -1(中间有空格)或漏掉等号,整行会被 PAM 忽略
• 同时存在多行 pam_pwquality.so:检查是否在 system-auth 里重复写了两行,后一行会覆盖前一行
用 pwscore 和 cracklib-check 快速验证规则
别靠猜,直接命令行测:
CentOS Linux 7.9.2009是传统CentOS Linux 7的最后主要版本,也是很多企业历史服务器中仍可能遇到的系统版本。它以稳定、兼容RHEL 7生态、文档丰富和软件支持广泛著称,曾长期用于Web服务、数据库、虚拟化节点和企业内部业务系统。不过CentOS Linux 7已于2024年6月30日停止维护,现在继续使用会面临安全补丁缺失风险。该版本更适合旧业务迁移、历史环境恢复或离线兼容性测试。
安装工具:sudo yum install libpwquality pwquality
打分看强度:echo "Abc123!" | pwscore → 返回数字(≥25 才算基本达标)echo "password" | pwscore → 明确报错 “The password fails the dictionary check”
查具体哪条不满足:echo "Abc123" | cracklib-check → 返回 Abc123: it is too short 或 it is based on a dictionary word
注意:cracklib-check 不检查大小写/数字数量,只做字典+长度判断;pwscore 才真正对应 pam_pwquality 的全部参数
想让规则对所有用户强制生效,还得配 remember 和 difok
仅限制新密码复杂度不够,还得防“换汤不换药”。这两项必须加在 system-auth 同一行或下一行:
• remember=5:禁止重用最近5次用过的密码,依赖 /etc/security/opasswd 文件记录历史
• difok=3:新密码至少和旧密码有3个字符不同(不是位置,是字符本身),防止把 Password123 改成 Password124
完整示例行:password requisite pam_pwquality.so try_first_pass local_users_only retry=3 minlen=8 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1 difok=3 remember=5 enforce_for_root
注意:remember 和 difok 必须配合使用,否则用户可能绕过 —— 比如旧密码是 Aa1!,新密码设成 Aa1@,只差1位,difok=3 就会拒绝;但如果没 remember,他下次还能切回去用 Aa1!










