linux密码安全需pam模块(pam_pwquality.so设复杂度、pam_pwhistory.so限历史)、chage管生命周期、pam_faillock.so防暴力破解三者协同;缺一不可。

Linux系统要真正守住密码这道门,得把“设密码”“用密码”“锁账户”三件事分开管,不能只改一个配置就以为万事大吉。核心是PAM模块精准控制密码强度与历史,chage精细管理每个账号的生命周期,再配合faillock或pam_tally2实现失败自动锁定——三者缺一不可。
设置强密码复杂度与历史复用限制
密码能不能设得够强,不看/etc/login.defs里的PASS_MIN_LEN,而取决于PAM中pam_pwquality.so是否启用且配置正确。它在用户改密时实时校验,旧密码不受影响。
- 编辑/etc/pam.d/common-password(Debian/Ubuntu)或/etc/pam.d/system-auth(RHEL/CentOS),在password段开头添加一行:
- 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
- 关键参数:12位最小长度;必须含大小写字母、数字、特殊字符各至少1个;新旧密码至少5字符不同;禁止连续4个相同字符;密码里不能出现用户名(含反转);root也强制执行
- 密码历史记录靠pam_pwhistory.so实现:在同一文件中加一行password required pam_pwhistory.so remember=24 use_authtok,表示保存最近24次密码哈希,新密码不得重复
- 首次启用前确保/etc/security/opasswd存在且权限为600(
touch /etc/security/opasswd && 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 -d 0 username(把shadow中密码最后修改日设为1970-01-01) - 查看效果:
chage -l username,重点关注“Password expires”和“Minimum number of days between password changes”
按失败次数自动锁定账户(防暴力破解)
仅靠密码复杂度挡不住撞库,必须叠加失败锁定。现代系统推荐pam_faillock.so,比老旧的pam_tally2更可靠、解锁逻辑更清晰。
- 编辑/etc/pam.d/common-auth(Debian/Ubuntu)或/etc/pam.d/system-auth(RHEL/CentOS),在auth段最开头插入三行(顺序不能错):
- auth [default=ignore] pam_faillock.so preauth silent deny=5 unlock_time=900 fail_interval=60
- auth [default=die] pam_faillock.so authfail deny=5 unlock_time=900 fail_interval=60
- auth [default=ok] pam_faillock.so authsucc
- 含义:60秒内输错5次,账户立即锁定;15分钟后自动解锁(unlock_time=900秒)
- 查状态:
faillock --user username;手动解锁:faillock --user username --reset - 注意:该策略不影响su切换用户,如需限制,需额外在/etc/pam.d/su中配置
临时锁定用户账户(非改密,仅阻断登录)
适用于员工休假、权限审计或怀疑异常等短期隔离场景,操作快、可逆性强,不改动密码本身。
- 锁定:
sudo passwd -l username或sudo usermod -L username,均会在/etc/shadow密码字段前加!或!! - 验证是否生效:
passwd -S username,输出中显示LK(Locked)即成功 - 解锁:
sudo passwd -u username或sudo usermod -U username - 该方式不影响SSH密钥登录(若已配置),如需彻底禁用所有认证方式,应结合sshd_config中的AllowUsers或DenyUsers使用











