linux密码复杂度必须由pam的pam_pwquality.so模块控制,需在password栈中以requisite类型靠前加载;/etc/login.defs中pass_min_len无效;须配置/etc/security/pwquality.conf并启用pam_pwhistory.so限制历史复用。

Linux 中密码复杂度校验必须由 PAM 模块显式控制,核心是正确启用 pam_pwquality.so(现代系统)或 pam_cracklib.so(旧系统),并确保它在 password 栈中以 requisite 类型靠前加载。仅改 /etc/login.defs 中的 PASS_MIN_LEN 无效,该参数在启用 PAM 后完全被忽略。
确认并启用 pam_pwquality.so 模块
这是当前主流发行版(RHEL 8+/CentOS 8+、Ubuntu 20.04+)的事实标准模块,取代了已弃用的 pam_cracklib.so:
- 检查模块是否存在:
ls /lib/security/pam_pwquality.so(Debian/Ubuntu)或ls /lib64/security/pam_pwquality.so(RHEL/CentOS) - 若缺失,安装对应包:
sudo apt install libpwquality-tools(Ubuntu/Debian)或sudo yum install libpwquality(RHEL/CentOS) - 确认当前生效配置:
Ubuntu/Debian:运行grep -v '^#' /etc/pam.d/common-password | grep pwquality
RHEL/CentOS:运行grep -v '^#' /etc/pam.d/system-auth | grep pwquality
若输出为空,说明未启用;若同时出现pwquality和cracklib,必须删掉其中一个——共存会导致策略静默失效
配置密码字符类型与最小长度规则
推荐使用 /etc/security/pwquality.conf 集中管理参数,避免在多个 PAM 文件中重复写参:
-
minlen = 12:基础最小长度为 12,但实际生效长度 = 12 + 未满足的字符类别数(例如缺数字,则至少需 13 位) -
dcredit = -1:强制至少 1 位数字 -
ucredit = -1:强制至少 1 个大写字母 -
lcredit = -1:强制至少 1 个小写字母 -
ocredit = -1:强制至少 1 个特殊字符(如!@#$%) -
difok = 5:新旧密码至少 5 个字符不同(防简单递增如Password123→Password124) -
maxrepeat = 3:禁止连续 4 个及以上相同字符(aaaa被拒,aaabbb允许) -
reject_username = 1:拒绝包含用户名或其大小写反转的密码(如用户名admin,则admin123或321nimda均被拒) -
enforce_for_root = 1:让 root 用户也受全部规则约束(默认不生效)
注入 PAM password 流程确保强制执行
仅配 pwquality.conf 不够,必须在 PAM 密码修改流程中明确调用:
- Ubuntu/Debian:编辑
/etc/pam.d/common-password,在password [success=1 default=ignore] pam_unix.so行之前插入:password requisite pam_pwquality.so retry=3 - RHEL/CentOS:编辑
/etc/pam.d/system-auth,同样在 password 段靠前位置添加同上一行 -
retry=3表示允许用户最多重试 3 次输入合规密码 - 务必确保该行类型为 requisite,且位于其他 password 模块之前,否则可能被跳过或静默忽略
配套设置密码生命周期与历史复用限制
仅管住“怎么设密码”不够,还需防止长期不改密和反复用旧密码:
- 在
/etc/login.defs中设置全局有效期:PASS_MAX_DAYS 90(90 天强制更新)PASS_MIN_DAYS 7(改密后 7 天内不可再改)PASS_WARN_AGE 7(到期前 7 天登录时提醒) - 在 PAM 配置文件中启用历史记录:
password required pam_pwhistory.so remember=24 use_authtokremember=24表示保存最近 24 次密码哈希(存于/etc/security/opasswd) - 首次启用前手动创建空文件:
sudo touch /etc/security/opasswd && sudo chmod 600 /etc/security/opasswd - 对已有用户立即应用:
sudo chage -M 90 -m 7 -W 7 username











