linux账号密码安全策略需pam模块协同控制,核心是密码复杂度(pam_pwquality.so设minlen=12、四类字符各至少1个、difok=4、maxrepeat=2、reject_username)、有效期(chage -m 90 -w 7 -m 1)和历史防重用(pam_pwhistory.so remember=5),配置前须备份文件并保留可用root权限。

Linux 账号密码安全策略不是改一个文件就能生效的,核心靠 PAM 模块协同控制,重点在 密码复杂度、有效期、历史防重用 三方面。配置前务必备份相关文件,并确保有可用的 root 或 sudo 权限账户在线,避免锁死系统。
设置密码复杂度(长度与字符类型)
现代发行版(如 RHEL 8+/Ubuntu 20.04+)推荐使用 pam_pwquality.so,它比旧的 pam_cracklib 更灵活可靠:
- 先确认模块已安装:运行
ls /lib/security/pam_pwquality.so或ls /lib64/security/pam_pwquality.so;若无,Debian/Ubuntu 执行sudo apt install libpam-pwquality,RHEL/CentOS 执行sudo dnf install libpwquality - 编辑 PAM 配置文件:
– Debian/Ubuntu:修改/etc/pam.d/common-password
– RHEL/CentOS/Fedora:修改/etc/pam.d/system-auth或/etc/pam.d/password-auth - 在
password段顶部添加一行(确保在其他 password 模块之前):password requisite pam_pwquality.so retry=3 minlen=12 difok=4 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1 maxrepeat=2 reject_username - 参数含义:
–minlen=12:基础分值 ≥12(小写/大写/数字/符号各计 1 分,实际长度通常接近该值)
–ucredit=-1等表示“至少含 1 个”,负号是强制语法
–difok=4:新密码至少 4 个字符与旧密码不同
–maxrepeat=2:禁止连续 3 个相同字符(如aaa)
–reject_username:密码不能包含用户名或其反转
限制密码有效期与登录提醒
有效期由 /etc/shadow 记录,通过 chage 命令统一管理最稳妥:
- 为指定用户设策略:
sudo chage -M 90 -W 7 -m 1 username
→ 密码 90 天后过期,提前 7 天提醒,至少用满 1 天才能再改 - 强制首次登录必须改密:
sudo chage -d 0 username
执行后,用户下次成功认证即进入改密流程(不依赖图形界面或 SSH 特定配置) - 查看当前策略效果:
chage -l username,关注 “Password must be changed” 和 “Password expires” 字段 - 全局默认值(仅影响新用户)可设在
/etc/login.defs:PASS_MAX_DAYS 90PASS_WARN_AGE 7PASS_MIN_DAYS 1
注意:这些不会自动更新已有用户,也不替代chage的实际控制力
防止重复使用旧密码
靠 pam_pwhistory.so 模块保存哈希记录,需配合 /etc/security/opasswd(首次启用时自动创建):
- 在同一个 PAM 配置文件(如
common-password或system-auth)中,放在pam_pwquality.so行之后,添加:password [default=ok] pam_pwhistory.so remember=5 use_authtok enforce_for_root - 说明:
–remember=5:保存最近 5 次密码哈希,新密码不得与之重复
–use_authtok:只在改密时校验,不干扰登录认证
–enforce_for_root:root 用户也受约束 - 确保
/etc/security/opasswd文件存在且权限为600、属主为root:root;PAM 会自动维护该文件
验证与注意事项
配置完别只用 root 测试,要切换到普通用户执行 passwd 实际尝试修改密码:
- 输弱密码(如
123456、abcabc、含用户名)应被拒绝并提示具体原因 - 输合规密码(如
MyP@ssw0rd2026!)应成功更新 - 检查
/etc/pam.d/下是否有多处加载了冲突的模块(如同时存在pam_pwquality和pam_cracklib),优先保留前者 - SELinux 启用时可能拦截写
/etc/security/opasswd,临时用setenforce 0排查;生产环境建议用audit2why分析日志 -
/etc/login.defs中的ENCRYPT_METHOD SHA512必须开启,否则新密码仍用弱哈希算法











