3. 账户与口令策略加固
Linux 的账户安全建立在两个核心文件之上:/etc/passwd 保存账户的身份与登录环境信息,/etc/shadow 保存口令散列与口令时效策略。理解这两个文件的结构,是判断“账户是否可登录、口令是否过期、口令是否被锁定”的基础。加固的目标不是简单地把文件权限改成 600,而是让账户身份、口令生命周期、认证过程三者形成闭环。
一、/etc/passwd 与 /etc/shadow 的结构
/etc/passwd 每行由 7 个冒号分隔字段组成,依次为:用户名、口令占位符、UID、GID、注释(GECOS)、家目录、登录 Shell。现代系统中第二个字段通常为 x,表示口令散列已迁移到 /etc/shadow。若该字段为空,则意味着该账户无需口令即可登录,这是必须排查的高危项;若为 * 或 !,通常表示该账户被禁止口令登录。
# /etc/passwd 示例
alice:x:1001:1001:Alice Wang:/home/alice:/bin/bash
svc_deploy:x:1002:1002:Deploy Service:/opt/deploy:/sbin/nologin
/etc/shadow 每行由 9 个冒号分隔字段组成,依次为:用户名、口令散列、最后一次修改口令的日期(自 1970-01-01 起的天数)、最小使用天数、最大使用天数、过期前警告天数、过期后宽限天数、账户失效日期、保留字段。其中“口令散列”字段若以 $6$ 开头表示 SHA-512,$y$ 表示 yescrypt,! 或 * 表示无有效口令。后 7 个字段共同构成口令时效策略,是本节加固的重点。
# /etc/shadow 示例(字段含义见上方说明)
alice:$6$Xk9...:19750:1:90:7:14:::
svc_deploy:!:19750:0:99999:7:::
权限方面,/etc/passwd 应为 644 root:root,/etc/shadow 应为 000 或 640 root:shadow,且绝不允许普通用户读取。可用 ls -l /etc/passwd /etc/shadow 与 stat -c '%a %U:%G %n' /etc/passwd /etc/shadow 核对。
二、PAM 模块配置
PAM(Pluggable Authentication Modules)是认证过程的调度层。口令复杂度、失败锁定、口令历史等策略,最终都通过 /etc/pam.d/ 下的服务配置文件调用相应模块实现。常用模块包括:
pam_pwquality.so:口令复杂度检查,替代旧的pam_cracklib.so;pam_pwhistory.so:禁止重复使用最近若干次旧口令;pam_faillock.so:登录失败计数与账户锁定;pam_unix.so:调用/etc/shadow完成口令校验与更新。
以 /etc/pam.d/system-auth(RHEL 系)或 /etc/pam.d/common-password(Debian 系)为例,口令复杂度通常配置为:
password requisite pam_pwquality.so try_first_pass retry=3 \
minlen=12 dcredit=-1 ucredit=-1 lcredit=-1 ocredit=-1 \
difok=3 maxrepeat=3 reject_username enforce_for_root
参数含义:minlen=12 最短 12 位;dcredit/ucredit/lcredit/ocredit=-1 分别要求至少 1 个数字、大写、小写、特殊字符;difok=3 新口令与旧口令至少 3 个字符不同;maxrepeat=3 同一字符最多连续重复 3 次;reject_username 禁止口令包含用户名;enforce_for_root 对 root 同样生效。修改后可用 echo 'Test@12345' | passwd --stdin alice 验证策略是否拦截弱口令。
三、口令复杂度与过期策略
复杂度由 PAM 控制,过期策略则由 /etc/shadow 字段或 chage 命令控制。推荐基线:最小使用天数 1,最大使用天数 90,警告 7 天,宽限 14 天。对已有账户批量设置:
chage -m 1 -M 90 -W 7 -I 14 alice
chage -l alice # 查看当前策略
新建账户的默认策略在 /etc/login.defs 中定义,应同步修改 PASS_MAX_DAYS 90、PASS_MIN_DAYS 1、PASS_WARN_AGE 7,否则 useradd 出来的账户仍沿用旧值。注意:chage 只影响单个账户,login.defs 只影响之后新建的账户,两者需配合使用。
四、账户锁定与登录失败处理
暴力破解防护依赖 pam_faillock.so。典型配置为连续失败 5 次锁定 900 秒,并在 auth、account 两段分别调用:
auth required pam_faillock.so preauth silent audit deny=5 unlock_time=900
auth [default=die] pam_faillock.so authfail audit deny=5 unlock_time=900
account required pam_faillock.so
查看与解锁:faillock --user alice 显示失败记录,faillock --user alice --reset 清零计数。若使用 pam_tally2(旧系统),命令为 pam_tally2 -u alice 与 pam_tally2 -u alice -r。加固后应验证:故意输错口令 5 次,观察是否出现锁定提示,再用 faillock 确认计数,最后重置并确认可正常登录。
五、加固后的验证与常见问题
完成配置后,建议按以下顺序验证:第一,检查文件权限与空口令账户,awk -F: '($2==""){print $1}' /etc/shadow 应无输出;第二,用 chage -l 抽查账户时效;第三,用弱口令测试 passwd 是否被 pam_pwquality 拒绝;第四,连续输错口令触发 faillock,确认锁定与解锁流程正常。
常见问题包括:只改了 login.defs 却未对存量账户执行 chage,导致老账户口令永不过期;pam_faillock 只写在 auth 段而漏写 account 段,导致锁定不生效;pam_pwquality 未加 enforce_for_root,root 仍可设置弱口令。排查时可用 journalctl -u sshd 或 /var/log/secure 观察认证失败与锁定日志,结合 faillock --user 的输出定位问题。