弱口令仍是服务器被入侵的第一大入口,而多数弱口令问题的根源是系统没有强制密码策略。本文介绍 Linux 密码策略加固的完整配置:通过 PAM 的 pwquality 模块强制密码复杂度、pam_tally2/pam_faillock 实现登录失败锁定,并统一设置有效期与历史密码限制,全部配置可直接复制执行。
适用场景
- 多账号服务器需要强制所有用户使用高强度密码,杜绝 123456、password 类弱口令
- SSH 面临持续爆破,需要在密码错误超过阈值后自动锁定账号或来源 IP
- 等保、安全基线测评要求密码定期更换且不可重复使用历史密码
- 新建用户流程需要自动应用统一的密码策略,避免逐个人工提醒
前置条件
- Linux 系统使用 PAM 认证框架(CentOS/RHEL/Rocky、Debian/Ubuntu 均默认)
- root 或 sudo 权限;建议另开一个测试终端保持登录,防止配置错误把自己锁死
- 确认模块版本:CentOS 8+/RHEL 8+ 与 Debian 11+ 使用 pam_faillock,CentOS 7 使用 pam_tally2,可用
ls /usr/lib64/security/ | grep -E "faillock|tally2"确认
原理说明
PAM(Pluggable Authentication Modules)是 Linux 认证的中间层,login、sshd、sudo 等程序都通过它校验身份。密码策略由三部分协同:
- pam_pwquality:设置密码时校验复杂度,包括最小长度、字符类别数、是否包含用户名、是否命中字典
- chage / login.defs:控制密码有效期、最短修改间隔、到期警告天数
- pam_faillock(或 pam_tally2):认证类模块,统计连续失败次数,达到阈值后临时锁定账号,令在线爆破在时间上不可行
三者分别解决”密码足够强”、”密码定期换”、”试错成本足够高”三个维度,缺一不可。
操作步骤
第一步:配置密码复杂度
# RHEL/CentOS 系列
yum install -y libpwquality
# 编辑 /etc/security/pwquality.conf,写入以下内容
minlen = 12 # 最小长度 12 位
minclass = 3 # 至少包含大写/小写/数字/符号中的 3 类
maxrepeat = 2 # 同一字符最多连续出现 2 次
maxsequence = 3 # 禁止 abc、123 等超过 3 位的连续序列
dictpath = /usr/share/dict/words # 字典检查(存在时启用)
usercheck = 1 # 禁止密码包含用户名
# 编辑 /etc/pam.d/system-auth(Debian/Ubuntu 为 /etc/pam.d/common-password),
# 在 password 栈首行追加:
password requisite pam_pwquality.so try_first_pass local_users_only retry=3
retry=3 允许用户设置密码时最多交互修正 3 次,避免过于生硬的体验。
第二步:配置有效期与历史密码
# /etc/login.defs 设置默认值(对新用户生效)
PASS_MAX_DAYS 90
PASS_MIN_DAYS 7
PASS_WARN_AGE 14
# 对存量用户批量应用
for user in $(awk -F: '$3>=1000 && $1!="nobody" {print $1}' /etc/passwd); do
chage -M 90 -m 7 -W 14 "$user"
done
# 记住最近 5 次密码不可重用:/etc/pam.d/system-auth 中 password 栈添加
password required pam_pwhistory.so use_authtok remember=5 enforce_for_root
PASS_MAX_DAYS=90 是等保基线的常见要求;remember=5 防止用户在新旧密码间来回切换绕过有效期。
第三步:登录失败锁定
RHEL 8+/Rocky/Debian 11+ 使用 faillock。创建 /etc/security/faillock.conf:
deny = 5 # 连续失败 5 次锁定
fail_interval = 600 # 失败计数窗口 10 分钟
unlock_time = 900 # 锁定 15 分钟后自动解锁
root_unlock_time = 900 # root 同样受控,防止 root 爆破
CentOS 7 使用 pam_tally2,在 /etc/pam.d/sshd 与 /etc/pam.d/system-auth 的 auth 栈首末两行分别添加:
auth required pam_tally2.so onerr=fail deny=5 unlock_time=900
account required pam_tally2.so
注意:启用 root 锁定前务必确认已配置 SSH 密钥登录作为后备通道,否则策略可能与管理终端一起被锁在门外。
配置验证
# 1. 复杂度:尝试设置弱密码应被拒绝
passwd testuser # 输入 12345678,预期提示 "too simplistic/systematic"
# 2. 有效期:核对生效参数
chage -l testuser
# 3. 失败锁定:故意输错密码 5 次,第 6 次即使密码正确也应被拒
faillock --user testuser # 查看失败计数(tally2 用 pam_tally2 -u testuser)
faillock --user testuser --reset # 手工解锁,恢复访问
三项验证全部符合预期后,策略即完整生效。建议将验证命令纳入安全基线巡检脚本,防止后续系统镜像或管理脚本变更时策略被覆盖。
常见问题
FAQ 1:所有用户(包括正确密码)登录失败,提示 Account locked?
大概率是爆破流量已把账号锁死,或 faillock 配置被写入了错误的文件顺序导致计数异常。用 root 执行 faillock --user 用户名 --reset 解锁;若 root 自身被锁,需进入单用户模式或救援模式执行 faillock --user root --reset。预防措施:管理通道同时保留 SSH 密钥认证。
FAQ 2:pwquality 提示密码包含字典词被拒绝,但业务必须使用该词?
这是 dictpath 字典检查在工作。若确属误判,可按用户临时豁免:echo "用户名" >> /etc/security/pwquality.conf-override 并在 pwquality.so 行加 enforcing=0 组合控制;更推荐的做法是让用户换用更长的口令短语,而不是关闭字典检查。
总结
密码策略加固是 Linux 服务器安全基线的地基:pwquality 管住复杂度、login.defs 与 pwhistory 管住生命周期、faillock 抬高爆破成本,三者配合可在不增加任何外部设备的前提下显著降低弱口令风险。策略落地后配合 SSH 密钥认证与定期账号审计,可形成长期有效的账号安全防线。