3. 账户生命周期管理

在RHEL服务器安全基线中,账户生命周期管理是权限治理的第一道闸门。一个账户从创建到删除,通常经历“创建→使用→锁定→过期→删除”五个阶段。每个阶段都有对应的命令和参数,若管理不当,会留下“幽灵账户”“共享账户”“永不过期账户”等典型风险。本节围绕useradd、usermod、chage、passwd四个核心命令,梳理一条可落地的最小化账户治理流程。

一、创建账户:最小化属性与默认策略

创建账户不是简单地执行useradd tom。在安全基线中,创建时必须同时确定:UID/GID、主目录、登录Shell、所属附加组、密码策略、账户有效期。RHEL默认从/etc/login.defs和/etc/default/useradd读取默认值,但生产环境通常需要显式覆盖。

例如,为运维人员创建账户时,应避免使用/bin/bash作为服务账户的Shell,服务账户应使用/sbin/nologin。以下示例创建一个仅用于备份任务的账户:

useradd -r -s /sbin/nologin -d /var/lib/backup -c "Backup Service" -u 980 backup_svc
passwd -l backup_svc
chage -E 2025-12-31 -M 90 -m 7 -W 14 backup_svc

这里-r表示创建系统账户,UID从系统保留范围分配;-s /sbin/nologin禁止交互登录;passwd -l立即锁定密码,使该账户只能通过su或服务方式调用;chage设置账户到期日、密码最长使用90天、最短7天、提前14天警告。这样创建的账户即使被误用,也无法直接登录系统。

创建后应立即检查/etc/passwd、/etc/shadow、/etc/group三处记录是否一致,尤其确认UID未被占用、主目录权限为700或750。

二、锁定与解锁:临时停用而非删除

当员工离职、账户疑似泄露或需要临时停用时,优先选择“锁定”而不是“删除”。锁定保留账户的UID、主目录和文件属主关系,避免因删除导致文件归属变成数字UID。RHEL中锁定账户有两种常用方式:

  • passwd -l username:在/etc/shadow密码字段前加!,使密码哈希失效,但账户仍可被su或SSH密钥登录绕过。
  • usermod -L username:与passwd -l效果类似,同样只锁定密码。
  • usermod -s /sbin/nologin username:修改Shell,阻止交互式登录,但已建立的会话不受影响。

更严格的做法是同时锁定密码并修改Shell,必要时再配合chage -E 0将账户立即过期。解锁时使用passwd -u或usermod -U,但要注意:如果账户已过期,仅解锁密码仍无法登录,必须同时调整chage -E。

三、过期控制:用chage管理时间边界

chage是账户生命周期中最重要的时间控制工具。它管理的是“账户有效期”和“密码有效期”两个不同维度:-E控制账户本身何时失效,-M、-m、-W控制密码多久必须更换。两者混淆是常见错误。

参数含义典型值
-E账户到期日(YYYY-MM-DD)合同结束日
-M密码最长使用天数90
-m密码最短使用天数7
-W密码过期前警告天数14
-I密码过期后宽限天数7

查看账户时间策略使用chage -l username。若输出中“Account expires”为never,说明账户永不过期,这在安全基线中通常属于不合规项。对于临时账户、外包账户、测试账户,必须设置明确的-E日期。

四、删除账户:清理残留与文件归属

删除账户使用userdel。默认只删除/etc/passwd、/etc/shadow、/etc/group中的记录,不删除主目录和邮件池。若确认该账户的文件不再需要,使用userdel -r username一并删除主目录和邮件。但在生产环境中,更稳妥的做法是先锁定、观察一段时间,确认无进程和定时任务依赖后再删除。

删除前应检查:crontab -u username -l是否有定时任务;ps -u username是否有运行进程;find / -user username是否有散落文件。删除后还应检查/etc/sudoers、/etc/ssh/sshd_config、/etc/security/access.conf中是否残留该账户的授权条目。

账户生命周期状态与命令映射 创建 useradd 正常使用 passwd / chage 锁定 passwd -l / usermod -L 过期 chage -E 删除 userdel -r 解锁恢复 确认无依赖 观察期后 关键检查点 1. 创建后:确认 UID 唯一、Shell 为 nologin(服务账户)、主目录权限 700/750 2. 锁定后:验证 passwd -S 显示 LK,且 SSH 密钥登录路径已关闭 3. 过期前:chage -l 确认 Account expires 非 never,提前通知用户 4. 删除前:检查 crontab、运行进程、sudoers、SSH 授权文件残留

五、最小化账户治理的落地要点

把上述命令串成规范流程,需要落到日常操作习惯中。第一,所有账户创建必须走申请单,明确用途、有效期、责任人,禁止“先建后补”。第二,服务账户一律使用/sbin/nologin并锁定密码,禁止交互登录。第三,人员账户设置chage -M 90 -W 14,外包和临时账户额外设置-E到期日。第四,离职或转岗当天执行锁定,观察30天后再删除。第五,每季度执行一次账户审计:

# 列出所有可登录账户
awk -F: '$7!="/sbin/nologin" && $7!="/bin/false" {print $1,$3,$7}' /etc/passwd

# 列出永不过期账户
chage -l $(awk -F: '$3>=1000 && $3<65534 {print $1}' /etc/passwd) | grep -B1 "never"

# 列出90天未登录账户
lastlog -b 90

审计结果应形成整改清单:对无主账户执行锁定,对永不过期账户补充到期日,对长期未登录账户确认是否仍在使用。通过“创建有约束、使用有监控、锁定有记录、过期有提醒、删除有清理”的闭环,才能把账户数量控制在最小必要范围内,降低横向移动和权限滥用的风险。

不要用userdel直接删除仍被进程或定时任务引用的账户,否则会产生“孤儿文件”和“UID复用”问题。删除前务必确认ps -u、crontab -u、find / -user三项检查为空或已迁移。