centos 7 密码复杂度策略必须通过 pam_pwquality.so 模块配置,仅修改 /etc/login.defs 中的 pass_min_len 无效;应验证并启用该模块,推荐使用 /etc/security/pwquality.conf 统一管理参数,如 minlen=10、dcredit=-2 等,并添加 enforce_for_root=1 以确保 root 用户调用时也生效。

CentOS 7 的密码复杂度策略必须通过 PAM 模块生效,仅改 /etc/login.defs 中的 PASS_MIN_LEN 是无效的——它只影响新建用户初始密码长度,不校验后续 passwd 修改行为。
确认并使用 pam_pwquality.so 而非 pam_cracklib.so
CentOS 7 默认启用 pam_pwquality.so(pam_cracklib.so 已被弃用),但部分系统残留旧配置或未加载模块。需先验证:
- 运行
grep -v "^#" /etc/pam.d/system-auth | grep pwquality,确认存在password requisite pam_pwquality.so行 - 若无输出,说明模块未启用;不要手动添加
pam_cracklib.so,应统一用pam_pwquality.so(二者参数兼容,但pam_pwquality更稳定) - 若该行存在但被注释或拼写错误(如
pam_pwqulity.so),会导致策略完全不触发
在 /etc/pam.d/system-auth 中正确追加参数
直接编辑 /etc/pam.d/system-auth,找到已有 password requisite pam_pwquality.so 的那行,在其末尾添加参数(不要另起一行,否则可能被跳过):
CentOS Linux 7.9.2009是传统CentOS Linux 7的最后主要版本,也是很多企业历史服务器中仍可能遇到的系统版本。它以稳定、兼容RHEL 7生态、文档丰富和软件支持广泛著称,曾长期用于Web服务、数据库、虚拟化节点和企业内部业务系统。不过CentOS Linux 7已于2024年6月30日停止维护,现在继续使用会面临安全补丁缺失风险。该版本更适合旧业务迁移、历史环境恢复或离
password requisite pam_pwquality.so try_first_pass retry=3 minlen=10 dcredit=-2 ucredit=-1 lcredit=-1 ocredit=-1 enforce_for_root
-
minlen=10:最小长度 10,注意它和各类字符最低数量是“叠加计分”关系,不是简单相加;例如minlen=10 ucredit=-1并不要求密码总长 ≥11,而是至少含 1 个大写字母且总长 ≥10 -
dcredit=-2表示“至少 2 个数字”,负号是关键;写成dcredit=2反而变成“最多 2 个数字”,会拒绝Abc12345@这类强密码 -
enforce_for_root必须显式加上,否则root执行passwd testuser时绕过所有检查 - 避免在
system-auth和password-auth中重复配置同一模块,否则可能因顺序冲突导致策略被覆盖
用 /etc/security/pwquality.conf 统一管理更安全
相比硬编码在 PAM 文件里,把规则集中到 /etc/security/pwquality.conf 更易维护、不易出错,且对所有调用该模块的服务(passwd、sudo、图形登录等)一致生效:
- 清空或注释掉
system-auth中pam_pwquality.so行的参数,只保留模块路径:password requisite pam_pwquality.so - 编辑
/etc/security/pwquality.conf,写入:minlen = 10 dcredit = -2 ucredit = -1 lcredit = -1 ocredit = -1 enforce_for_root = 1 retry = 3
- 该文件支持注释(
#开头),也支持minclass = 4(要求四类字符全齐),比逐项限制更简洁 - 修改后无需重启服务,下次执行
passwd即生效;但旧用户已设的弱密码不会自动失效,仅新设/修改时校验
验证策略是否真生效,而非“看起来生效”
常见假阳性:改完配置后 passwd 报错,但错误来自其他模块(如 pam_deny.so)或权限问题,而非 pam_pwquality 本身。验证步骤:
- 切换到普通用户(非 root),执行
passwd,尝试设12345678—— 应提示 “Password is shorter than minlen” - 再试
Abcdefg8(缺特殊字符)—— 应提示 “Password does not contain enough special characters” - 用 root 执行
passwd testuser设123456—— 若没加enforce_for_root,会成功;加了则同样报错 - 检查日志:
tail -f /var/log/secure | grep pwquality,成功拦截时会有明确模块名和拒绝原因
最容易被忽略的是:SSH 密钥登录用户仍可走 passwd 命令改密码,策略对其完全有效;但若服务(如某些 Web 管理面板)自己实现密码修改逻辑且未调用 PAM,则策略对其无效——这类场景必须单独加固。










