linux系统需通过pam模块pam_pwquality.so强制密码复杂度,配置minlen=12、dcredit=-1等参数,并结合login.defs设置生命周期及pam_pwhistory限制复用,再经实测与日志审计确保生效。

Linux系统默认密码强度较弱,容易被暴力破解。要提升安全性,必须通过PAM模块(pam_pwquality.so)强制设置密码复杂度,并配合日志审计追踪密码修改行为。
一、启用并配置密码复杂度策略
编辑PAM密码策略配置文件:
sudo nano /etc/pam.d/common-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位(注意:实际最小长度还受
minclass和字符种类影响) - dcredit=-1:至少含1位数字;ucredit=-1:至少1个大写字母;lcredit=-1:至少1个小写字母;ocredit=-1:至少1个特殊字符
- difok=4:新密码与旧密码至少4个字符不同
-
maxrepeat=3:禁止连续3个以上相同字符(如
aaabbb允许,aaaa拒绝) - reject_username:禁止密码包含用户名或其反转
- enforce_for_root:root用户也受策略约束
⚠️ 注意:若系统使用libpwquality旧版本(如CentOS 7),部分参数名不同(如minlen对应minlen,但ocredit可能需用minclass=4替代)。可运行man pam_pwquality确认支持项。
二、设置密码生命周期与历史记录
防止长期不改密和密码复用,需配置/etc/login.defs和/etc/pam.d/common-password:
1. 编辑/etc/login.defs,确保以下行存在且未被注释:
PASS_MAX_DAYS 90
PASS_MIN_DAYS 7
PASS_WARN_AGE 7
2. 在/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
说明:
- PASS_MAX_DAYS 90:密码最长有效期90天
- PASS_MIN_DAYS 7:两次改密至少间隔7天(防频繁重置绕过策略)
- remember=24:保存最近24次密码哈希,禁止重复使用
三、验证策略是否生效
不要仅依赖配置完成就认为有效,务必实测:
- 用普通用户执行
passwd,尝试设置Abc123!(太短)、MyPass123(无特殊符)、MyPassword123!(含用户名子串)——均应被拒绝 - 成功设置一个合规密码后,再尝试设为相同密码,应提示“already used”
- 检查
/var/log/auth.log(Ubuntu/Debian)或/var/log/secure(RHEL/CentOS)中是否有pam_pwquality相关拒绝日志
如遇策略不触发,检查PAM调用顺序:同一类型(password)的模块按自上而下执行,requisite失败立即终止;确认没有其他password required模块提前返回success跳过后续校验。
四、审计密码策略执行情况
定期检查策略是否被绕过或失效:
- 查所有用户的密码过期信息:
sudo chage -l username,或批量查看:sudo awk -F: '$2 ~ /^\$/ {print $1}' /etc/shadow | xargs -I{} sh -c 'echo -n "{}: "; chage -l {} | grep -E "(Password|Minimum|Maximum)"' - 查近期密码修改日志:
sudo grep "password changed" /var/log/auth.log | tail -20 - 检查PAM配置完整性:
sudo pam-config --query pwquality(SUSE系)或手动确认pam_pwquality.so路径存在(通常为/lib/x86_64-linux-gnu/security/pam_pwquality.so) - 扫描弱密码(需离线):导出
/etc/shadow哈希,用john或hashcat进行有限字典爆破测试(仅限授权环境)
建议将关键检查项写成脚本,加入cron每日运行,并邮件告警异常(如发现password changed但无对应用户操作记录)。










