linux密码复杂度真正起效的是pam_pwquality.so模块配置,而非/etc/login.defs中的pass_min_len;需在/etc/pam.d/common-password(debian/ubuntu)或system-auth(rhel/centos)中添加password requisite pam_pwquality.so retry=3 minlen=12 difok=4 dcredit=-1 ucredit=-1 lcredit=-1 ocredit=-1 maxrepeat=3 reject_username enforce_for_root,并配合pam_pwhistory.so remember=24及login.defs中pass_max_days 90等参数实现完整策略。

密码复杂度靠 pam_pwquality.so 控制
Linux 系统真正起效的密码强度规则,不是写在 /etc/login.defs 里的 PASS_MIN_LEN,而是由 PAM 模块 pam_pwquality.so 执行。该模块默认已预装于 Ubuntu 20.04+、RHEL 8+ 等现代发行版;老系统如 CentOS 7 可能用 pam_cracklib.so,但建议升级或统一使用 pwquality。
核心配置位置是:
– Debian/Ubuntu:/etc/pam.d/common-password
– RHEL/CentOS:/etc/pam.d/system-auth 或 /etc/pam.d/password-auth
在对应文件中添加或修改这一行(放在其他 password 模块之前):
password requisite pam_pwquality.so retry=3 minlen=12 difok=4 dcredit=-1 ucredit=-1 lcredit=-1 ocredit=-1 maxrepeat=3 reject_username enforce_for_root
关键参数含义:
- minlen=12:基础最小长度为 12 位(注意:若字符类别未达标,实际要求会自动加长)
- dcredit=-1 等四类 credit:分别强制至少含 1 位数字、大写字母、小写字母、特殊字符
- difok=4:新密码与旧密码至少 4 个字符不同
- maxrepeat=3:禁止连续 4 个及以上相同字符(如 aaaa 被拒,aaabbb 允许)
- reject_username:密码不得包含用户名或其大小写反转
- enforce_for_root:root 用户同样受约束
历史密码记录靠 pam_pwhistory.so 实现
仅防弱密码不够,还需防“换汤不换药”——反复重用旧密码。这由 pam_pwhistory.so 模块完成,它将旧密码哈希存入 /etc/security/opasswd。
在同一个 PAM 配置文件(如 /etc/pam.d/common-password)中,紧接在 pam_pwquality.so 行之后添加:
password [success=1 default=ignore] pam_unix.so use_authtok sha512 shadow
password required pam_pwhistory.so remember=24 use_authtok enforce_for_root
说明:
- remember=24:保存最近 24 次密码哈希,新密码不得与其中任一重复
- use_authtok:确保复用已有认证令牌,避免二次提示输密
- enforce_for_root:使 root 用户也纳入历史检查
首次启用前,手动创建空文件并设权限:
sudo touch /etc/security/opasswd && sudo chmod 600 /etc/security/opasswd
生命周期与全局策略要协同设置
密码有效期、提醒天数等时间类策略,由 /etc/login.defs 定义全局默认值,并通过 chage 命令对单个用户微调。
编辑 /etc/login.defs,确保以下三行未被注释且数值合理:
- PASS_MAX_DAYS 90:密码最长有效 90 天
- PASS_MIN_DAYS 7:两次改密至少间隔 7 天(防绕过)
- PASS_WARN_AGE 7:到期前 7 天开始登录时提醒
对已有用户批量应用:
sudo chage -M 90 -m 7 -W 7 username
服务账户可禁用过期(如数据库账号):
sudo chage -E -1 username
验证是否真正生效,不能只看配置
改完配置后务必实测,否则策略可能因加载顺序、模块冲突或条件判断被跳过。
测试步骤:
- 用普通用户执行 passwd,尝试设 Abc123!(太短)、MyPass123(缺特殊符)、john123!(含用户名)——应全部被拒绝
- 成功设一个合规密码后,立刻再设相同密码,应提示 “already used”
- 检查日志确认拦截行为:
Ubuntu/Debian 查 /var/log/auth.log,
RHEL/CentOS 查 /var/log/secure,搜索 pam_pwquality 或 pam_pwhistory
若失败,优先排查:
– 是否改错了 PAM 文件(如改了 common-password,但 SSH 登录实际走 sshd → system-auth)
– 是否存在重复加载同一模块导致逻辑覆盖
– 是否遗漏 use_authtok 导致流程中断











