Linux密码复杂度策略必须由PAM模块显式控制,真正生效的是pam_pwquality.so(现代系统)或pam_cracklib.so(旧系统),需正确加载到实际调用的PAM配置文件并使用requisite标志;/etc/login.defs中PASS_MIN_LEN无效,minlen等参数才起效;须配合pam_pwhistory.so限制重用及chage设置生命周期。

Linux 系统的密码复杂度策略不能靠默认值或猜,必须由 PAM 模块显式控制。真正起效的是 pam_pwquality.so(现代系统)或 pam_cracklib.so(旧系统),且需正确加载到实际被调用的 PAM 配置文件中,并使用 requisite 标志确保强制执行。
确认当前生效的密码强度模块
不同发行版默认启用的模块不同,先查清再改,避免冲突:
- 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):
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
- 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),搜索关键词password或pam_pwquality










