必须显式配置pam模块pam_pwquality.so(新系统)或pam_cracklib.so(旧系统)到对应pam文件,使用requisite标志,设置minlen、dcredit等参数强制长度与字符类型,并配合pam_pwhistory.so和login.defs实现历史记录与生命周期管控。

Linux 系统密码复杂度不能靠 guess 或默认设置,必须由 PAM 模块显式控制。核心是正确启用 pam_pwquality.so(现代系统)或 pam_cracklib.so(旧系统),并确保它被 passwd 命令实际调用。
确认当前生效的密码强度模块
不同发行版默认加载的模块不同,先查清再改:
- Ubuntu/Debian:运行
grep -v '^#' /etc/pam.d/common-password | grep -E '(pwquality|cracklib)' - RHEL/CentOS:运行
grep -v '^#' /etc/pam.d/system-auth | grep -E '(pwquality|cracklib)' - 若输出为空,说明尚未启用;若同时出现两个模块,需删掉一个,避免冲突
配置 pam_pwquality.so 强制字符类型与长度
在对应 PAM 文件中添加或修改这一行(放在其他 password 规则之前,且使用 requisite):
password requisite pam_pwquality.so retry=3 minlen=12 difok=5 dcredit=-1 ucredit=-1 lcredit=-1 ocredit=-1 maxrepeat=3 reject_username enforce_for_root
-
minlen=12是基础长度,但实际最小值 = 12 + 未满足的字符类别数(如缺数字,就自动加 1) -
dcredit=-1等参数分别强制至少 1 位数字、大写字母、小写字母、特殊字符 -
maxrepeat=3拒绝aaaa这类连续 4 个相同字符的密码 -
reject_username会拦截myuser123!或resuym123!(用户名反转)
防止密码重用与生命周期管控
仅设复杂度不够,还要管“能用多久”和“能不能再用”:
- 在
/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(太短+无大写/特殊符)→ 应拒绝
—MyPassword123(无特殊符)→ 应拒绝
—MyUser123!(含用户名)→ 应拒绝 - 成功设置合规密码后,立刻再设一次相同密码 → 应提示 “already used”
- 检查日志:
sudo tail -n 20 /var/log/auth.log(Debian/Ubuntu)或/var/log/secure(RHEL/CentOS),搜索pam_pwquality或password changed











