3. RHEL密码策略与账户安全
在RHEL系统中,账户安全的第一道防线是密码策略。一个弱密码可能在数小时内被暴力破解,而合理的密码复杂度、老化周期和锁定策略可以将攻击成本提升数个数量级。本节围绕四个核心机制展开:密码复杂度控制(pam_pwquality)、密码老化管理(chage与login.defs)、账户锁定策略(pam_faillock),以及它们之间的协同关系。
密码复杂度:pam_pwquality模块
RHEL 8/9默认使用pam_pwquality模块替代早期的pam_cracklib。该模块在用户设置或修改密码时,对密码的强度进行实时校验。其主配置文件为/etc/security/pwquality.conf,也可以在PAM配置中通过参数覆盖。
关键参数包括:minlen(最小长度)、dcredit(数字字符数)、ucredit(大写字母数)、lcredit(小写字母数)、ocredit(特殊字符数)、minclass(最少字符类别数)、maxrepeat(最大连续重复字符数)、maxclassrepeat(同一类别最大连续字符数)、gecoscheck(检查密码是否包含用户信息)、dictcheck(字典检查)、enforcing(强制或仅警告)。
需要特别理解dcredit等参数的负值语义:当dcredit=-1时,表示密码中至少需要包含1个数字;当dcredit=1时,表示密码中每出现1个数字,可以给长度要求减少1个字符。负值是“至少要求”,正值是“信用抵扣”。这是初学者最容易混淆的地方。
一个典型的/etc/security/pwquality.conf配置示例如下:
minlen = 12
dcredit = -1
ucredit = -1
lcredit = -1
ocredit = -1
minclass = 3
maxrepeat = 2
maxclassrepeat = 4
gecoscheck = 1
dictcheck = 1
enforcing = 1
上述配置要求密码至少12位,且至少包含数字、大写、小写、特殊字符中的3类,不允许同一字符连续出现超过2次,不允许同一类别字符连续超过4个,且不能包含用户GECOS信息或字典单词。设置完成后,可以用echo "TestPass123!" | passwd --stdin testuser来验证策略是否生效——如果密码不满足要求,系统会拒绝并给出具体原因。
密码老化:chage与login.defs
密码老化控制密码的有效期,强制用户定期更换密码。RHEL中通过chage命令管理单个用户的密码老化参数,通过/etc/login.defs设置全局默认值。
chage -l username可以查看用户的当前老化设置。关键字段包括:最近一次修改密码的日期、密码最小使用天数(-m)、密码最大使用天数(-M)、密码过期前警告天数(-W)、密码过期后账户宽限天数(-I)、账户过期日期(-E)。
例如,要求用户每90天更换密码,提前7天警告,密码过期后3天内仍可登录但强制改密,超过3天则账户锁定:
chage -M 90 -m 1 -W 7 -I 3 testuser
chage -l testuser
全局默认值在/etc/login.defs中设置:PASS_MAX_DAYS 90、PASS_MIN_DAYS 1、PASS_WARN_AGE 7。注意,login.defs只影响新建用户,已存在用户需要用chage单独调整。此外,/etc/shadow中的第三个字段(从0开始计数)就是密码最后修改日期,第四个字段是最小天数,第五个字段是最大天数,第六个字段是警告天数,第七个字段是宽限天数,第八个字段是账户过期日期。理解这些字段的对应关系,有助于排查密码策略不生效的问题。
账户锁定策略:pam_faillock
密码复杂度防止弱密码,密码老化限制密码使用时长,而账户锁定策略则防止暴力破解。RHEL 8/9推荐使用pam_faillock模块,替代早期的pam_tally2。
pam_faillock的核心参数包括:deny(连续失败次数阈值)、unlock_time(锁定时长,秒)、fail_interval(失败计数的时间窗口,秒)、even_deny_root(是否也锁定root)。配置通常写入/etc/security/faillock.conf,然后在PAM配置中引用。
一个合理的配置示例:
# /etc/security/faillock.conf
deny = 5
unlock_time = 900
fail_interval = 300
even_deny_root
上述配置表示:在300秒内连续失败5次,账户锁定900秒(15分钟),root账户同样适用。配置完成后,需要确保/etc/pam.d/system-auth和/etc/pam.d/password-auth中包含pam_faillock的preauth和authfail行。可以使用authselect工具启用with-faillock特性:
authselect select sssd with-faillock with-pwquality --force
authselect apply-changes
查看失败计数和锁定状态使用faillock --user testuser,解锁使用faillock --user testuser --reset。注意,faillock的计数文件位于/var/run/faillock/目录下,系统重启后计数会重置。
策略协同与实战验证
四个机制并非孤立:pam_pwquality在密码设置时拦截弱密码;chage和login.defs控制密码生命周期;pam_faillock在认证失败时触发锁定。它们共同构成账户安全的纵深防御。
实战验证流程建议如下:
- 创建测试用户
useradd -m testuser,设置初始密码。 - 用
chage -l testuser确认老化参数,用passwd testuser尝试设置弱密码,观察pwquality是否拒绝。 - 用
faillock --user testuser查看失败计数,故意输错密码5次,确认账户被锁定。 - 等待
unlock_time或手动faillock --reset解锁,确认恢复正常登录。 - 检查
/var/log/secure中的认证日志,确认pam_faillock和pam_pwquality的审计记录。
/etc/pam.d/下的文件,并保持一个root会话不退出,以防配置错误导致无法登录。使用authselect管理PAM比手工编辑更安全,因为authselect会维护配置的一致性。
下面这张图展示了密码策略各组件在用户认证与密码修改流程中的介入位置和协同关系:
通过上述配置和验证,可以建立一套完整的账户安全基线。在实际生产环境中,建议结合authselect的sssd配置文件统一管理PAM策略,并定期审计/var/log/secure中的认证失败记录,及时发现异常登录尝试。密码策略不是一次配置就永久有效的,需要根据安全审计结果和业务需求持续调整参数阈值。