linux中增强密码校验的核心是让pam_pwquality.so模块在passwd时实时强制执行规则:需先确认模块安装且无pam_cracklib冲突,再集中配置pwquality.conf参数,最后在pam password段以requisite类型前置加载,并配合login.defs与pam_pwhistory.so实现有效期和历史密码限制。

Linux 中增强密码校验,核心是让 pam_pwquality.so 模块在用户执行 passwd 时真正介入并强制执行规则,而不是只改配置文件就以为生效。
确认模块已安装且未被旧模块干扰
先检查系统是否具备该模块:
- RHEL/CentOS/Fedora:运行
ls /lib64/security/pam_pwquality.so;若无,执行sudo dnf install libpwquality - Debian/Ubuntu:运行
ls /lib/x86_64-linux-gnu/security/pam_pwquality.so;若无,执行sudo apt install libpam-pwquality - 再排查冲突:运行
grep -E 'pwquality|cracklib' /etc/pam.d/common-password(Debian系)或/etc/pam.d/system-auth(RHEL系),确保没有残留的pam_cracklib.so行
集中配置密码规则到 pwquality.conf
把策略统一写进 /etc/security/pwquality.conf,便于维护和审计:
-
minlen = 12:基础最小长度为 12,但实际生效长度会动态抬高(如缺一类字符,自动 +1) -
dcredit = -1、ucredit = -1、lcredit = -1、ocredit = -1:分别要求至少 1 位数字、大写字母、小写字母、特殊字符(如!、@) -
difok = 5:新旧密码至少 5 个字符不同 -
maxrepeat = 3:禁止连续 4 个及以上相同字符(aaaa被拒) -
reject_username = 1:密码不能包含用户名或其反转(如用户名admin,则admin123或321nimda均被拒) -
enforce_for_root = 1:root 用户也受全部规则约束(默认不启用)
在 PAM password 流程中正确加载模块
仅配 pwquality.conf 不生效,必须在对应 PAM 文件中显式调用,并确保位置和类型正确:
- Debian/Ubuntu:编辑
/etc/pam.d/common-password,在所有password行最前面插入:password requisite pam_pwquality.so retry=3 - RHEL/CentOS:编辑
/etc/pam.d/system-auth或/etc/pam.d/password-auth,同样在password段靠前位置添加上述行 - 关键点:类型必须是
requisite,且必须位于pam_unix.so等其他password模块之前,否则会被跳过
配套加固:有效期 + 历史密码限制
光有复杂度不够,还需防长期不改密、反复用旧密码:
- 在
/etc/login.defs中设置全局生命周期:PASS_MAX_DAYS 90PASS_MIN_DAYS 7PASS_WARN_AGE 7 - 启用历史记录:在 PAM 文件中添加
password required pam_pwhistory.so remember=24 use_authtok
首次启用前创建空文件:sudo touch /etc/security/opasswd && sudo chmod 600 /etc/security/opasswd - 对已有用户立即应用:
sudo chage -M 90 -m 7 -W 7 username
验证时别只看配置是否保存,要用普通用户执行 passwd 实测:设 Abc123!(缺大写)、myuser123!(含用户名)、aaaaaa123ABC!(连续 6 个 a),观察是否被明确拒绝。日志可查 /var/log/auth.log(Debian/Ubuntu)或 /var/log/secure(RHEL/CentOS)。











