pam_pwquality.so 的 lcredit、ucredit、dcredit、ocredit 参数为负数时表示对应字符的最低数量要求,如 lcredit=-1 即至少1个小写字母;实际生效需结合 minlen 和总分判定,常用 minclass=4 替代四个 credit=-1 配置。

pam_pwquality.so 是 Linux 中用于密码强度检查的 PAM 模块,常配合 password requisite pam_pwquality.so 使用。其中 lcredit、ucredit、dcredit、ocredit 控制密码中各类字符的最低数量要求(或容许的最多缺失数),理解它们的关键在于:数值为负数表示“至少需要多少个”,为正数则表示“最多允许缺失多少个”——但实际配置中几乎**只用负数**。
各 credit 参数的真实含义
这些参数不是“必须包含几个”,而是“密码得分中,对小写字母/大写字母/数字/特殊字符的加分项最低要求”。pam_pwquality 会为密码中每类字符加 1 分,再根据其他规则(长度、重复、字典等)综合打分;而 credit 参数设定了该类字符贡献的**最低有效分值**:
- lcredit=-1:密码中至少要有 1 个小写字母(否则此项得分为 0,拖低总分)
- ucredit=-1:至少 1 个大写字母
- dcredit=-1:至少 1 个数字
-
ocredit=-1:至少 1 个特殊字符(如
!@#$%^&*等非字母数字字符)
注意:ocredit 的“特殊字符”范围由 minclass 和 dictcheck 等上下文影响,且默认不包含空格、控制字符或某些 Unicode 字符;可用 enctype 或自定义 pwquality.conf 调整。
如何验证参数是否生效
最直接的方式是手动测试不同密码,并观察 passwd 命令的返回结果:
- 编辑
/etc/pam.d/common-password(Debian/Ubuntu)或/etc/pam.d/system-auth(RHEL/CentOS),确保有类似行:password requisite pam_pwquality.so retry=3 lcredit=-1 ucredit=-1 dcredit=-1 ocredit=-1 - 用普通用户执行
passwd,依次尝试以下密码:
→abc123(缺大写和特殊字符)→ 应失败
→Abc123(缺特殊字符)→ 应失败(若 ocredit=-1)
→Abc123!(四类齐全)→ 应成功 - 启用调试日志辅助判断:在 PAM 行末加
debug,如:password [success=ok default=bad] pam_pwquality.so debug lcredit=-1 ...
然后查看/var/log/auth.log(Debian)或/var/log/secure(RHEL),搜索pam_pwquality关键字,能看到逐项打分过程,例如:score: 2 (l=1, u=1, d=1, o=0)→ 总分 2,但因 ocredit=-1 导致不达标
常见误区与注意事项
这些参数容易被误解,需特别注意:
- 它们**不独立强制生效**:最终是否拒绝密码,取决于总分是否 ≥
minlen对应的基础分 + 各 credit 加分。例如minlen=8时,即使满足所有 credit,但密码只有 7 位,仍会失败 -
minclass是更简洁的替代方案:比如minclass=4表示密码必须至少包含 4 类字符(小写、大写、数字、特殊),效果等价于同时设四个 credit=-1,且更易维护 - 负值越大(如
lcredit=-3),要求越严(至少 3 个小写字母);设为 0 表示该类字符不参与加分也不扣分;设为正值(如ucredit=1)表示“最多可缺 1 类大写字母”,极少使用 - 修改后无需重启服务,PAM 规则在下次
passwd调用时立即生效,但建议先用非 root 用户测试,避免锁死 root 密码
快速确认当前配置的方法
不用翻配置文件,也能快速获知系统当前生效的 credit 规则:
- 运行
grep -r "pam_pwquality" /etc/pam.d/找到实际加载的行 - 用
pwscore工具(来自libpwquality包)本地评分:echo "Abc123!" | pwscore→ 输出一个整数分值(如 35),分值越高代表越强;结合pwmake 64可生成合规随机密码作参考 - 检查全局配置:
cat /etc/security/pwquality.conf,其中定义的默认值会被 PAM 行中的显式参数覆盖











