Linux配置密码复杂度需启用pam_pwquality.so(非login.defs的PASS_MIN_LEN),先查清发行版对应PAM文件中模块,删冗余模块;设minlen=12、ucredit=-1等参数并理解补偿机制;再配pam_pwhistory.so防重用及chage控有效期。

Linux 中配置密码复杂度策略,核心是正确启用并配置 PAM 密码强度模块(pam_pwquality.so 或旧版 pam_cracklib.so),而不是修改 /etc/login.defs 里的 PASS_MIN_LEN —— 后者在启用 PAM 后完全无效。
确认当前系统用哪个模块
不同发行版默认不同,必须先查清再操作,避免两个模块共存导致策略静默失效:
- 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_cracklib.so),必须删掉其中一个
安装并加载 pam_pwquality 模块
现代系统(RHEL 8+/Ubuntu 20.04+)推荐使用 pam_pwquality,它支持更细粒度控制且更稳定:
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
- 安装:Ubuntu/Debian 执行
sudo apt install libpam-pwquality;RHEL/CentOS 执行sudo yum install libpwquality或sudo dnf install libpwquality - 验证模块存在:
ls /lib/security/pam_pwquality.so(或/lib64/security/下) - 编辑对应 PAM 文件:
– Ubuntu/Debian →/etc/pam.d/common-password
– RHEL/CentOS →/etc/pam.d/system-auth - 在
password段中、pam_unix.so行之前插入:password requisite pam_pwquality.so retry=3 minlen=12 difok=5 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1 maxrepeat=3 reject_username enforce_for_root
理解关键参数的实际效果
这些参数不是独立生效,而是相互影响,尤其要注意“补偿机制”:
-
minlen=12是基础长度,但若未满足四类字符要求(大小写字母、数字、特殊符号),模块会自动加长最低门槛——例如只输字母数字,实际可能需 14 位以上 -
ucredit=-1等表示“至少含 1 个”,负号是关键;正数含义相反(最多) -
difok=5指新旧密码至少 5 个字符不同,不是“最多相同 5 个” -
maxrepeat=3禁止连续 4 个及以上相同字符(如aaaa被拒,aaabbb允许) -
reject_username会拦截含用户名或其大小写反转的密码(如myuser123!),但默认对 root 不生效,需加enforce_for_root
配合历史记录与生命周期管控
仅设复杂度不够,还需防重用、控时效:
- 启用密码历史:在同个 PAM 文件中添加
password required pam_pwhistory.so remember=24 use_authtok
首次启用前执行:sudo touch /etc/security/opasswd && sudo chmod 600 /etc/security/opasswd - 设置全局有效期:编辑
/etc/login.defs,确保包含PASS_MAX_DAYS 90PASS_MIN_DAYS 7PASS_WARN_AGE 7 - 为已有用户立即应用:
sudo chage -M 90 -m 7 -W 7 username

















