Linux系统通过PAM模块(如pam_pwquality.so或pam_cracklib.so)配置密码复杂度,需修改/etc/pam.d/common-password或system-auth文件,设置minlen、difok、ucredit等参数,并配合pam_pwhistory.so实现历史密码限制及chage命令配置过期策略。

Linux系统中设置用户密码复杂度策略,主要通过PAM(Pluggable Authentication Modules)模块实现,核心是配置 /etc/pam.d/common-password(Debian/Ubuntu)或 /etc/pam.d/system-auth(RHEL/CentOS)文件,配合 pam_pwquality.so(新版)或 pam_cracklib.so(旧版)模块生效。
确认系统使用的PAM密码模块
不同发行版默认启用的密码强度模块略有差异:
- RHEL 8+/CentOS 8+、Ubuntu 20.04+ 默认使用
pam_pwquality.so,功能更完善,支持 Unicode、类字符统计、相似度检查等 - 较老系统(如 CentOS 7、Ubuntu 16.04)可能仍用
pam_cracklib.so,语法相近但选项略少 - 执行
grep -v '^#' /etc/pam.d/common-password | grep pwquality或grep cracklib可快速确认当前启用的模块
基础密码复杂度参数配置(以 pam_pwquality.so 为例)
在对应 PAM 配置文件中添加或修改这一行(通常位于 password [success=1 default=ignore] pam_unix.so obscure use_authtok try_first_pass sha512 之前):
password requisite pam_pwquality.so retry=3 minlen=10 difok=3 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1 maxrepeat=3 reject_username enforce_for_root
各关键参数含义:
- retry=3:密码输入错误最多重试3次才拒绝新密码
- minlen=10:最小长度10位(注意:实际最小长度 = minlen + 类别数补偿,见下条说明)
- difok=3:新密码至少有3个字符与旧密码不同
- ucredit=-1:必须含至少1个大写字母(负值表示“至少”,正值表示“最多”)
- lcredit=-1:必须含至少1个小写字母
- dcredit=-1:必须含至少1个数字
- ocredit=-1:必须含至少1个特殊符号
-
maxrepeat=3:禁止连续重复同一字符超过3次(如
aaabbb允许,aaaa拒绝) - reject_username:禁止密码包含用户名(大小写不敏感)
- enforce_for_root:对 root 用户同样强制执行该策略
⚠️ 注意:minlen 不是绝对最小长度。若某类字符未满足(如缺数字),模块会自动加长最低要求——例如设 minlen=10 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1,但用户只输大小写字母,则实际要求至少13位(10+3类未达标)。建议搭配 minclass=4 更直观控制类别数。
验证与调试密码策略是否生效
配置保存后无需重启服务,下次改密即生效。推荐按以下步骤验证:
- 切换到普通用户,运行
passwd尝试设置弱密码(如123456、password、aaaaaa123),观察提示信息是否符合预期 - 查看日志辅助排查:
sudo tail -f /var/log/auth.log(Debian/Ubuntu)或sudo journalctl -u systemd-logind -f(RHEL 8+) - 临时启用调试模式:在 PAM 行末尾加
debug,例如pam_pwquality.so debug minlen=10,日志中会输出详细校验过程 - 用
pwmake 128(来自 libpwquality-utils 包)生成符合当前策略的随机密码,反向验证策略强度
补充建议与常见注意事项
仅靠 PAM 设置不能覆盖所有安全场景,需配合其他机制:
- 密码历史限制:在
pam_pwhistory.so行中添加remember=5,防止用户循环使用最近5次密码 - 密码过期策略:用
chage -M 90 -m 7 -W 7 username设置最长90天、最短7天、提前7天提醒 - 避免配置冲突:确保同一类型(
password)的pam_pwquality.so或pam_cracklib.so只出现一次,重复会导致策略叠加异常 - 容器或云镜像环境:若使用 cloud-init 或 Ansible 自动化部署,需将 PAM 配置纳入初始化流程,而非仅手动修改
- SSH 密钥登录用户不受密码策略影响,但建议仍为 root 或 sudo 用户设置强密码作为兜底










