识别僵尸账号需交叉验证登录行为、密码策略、账户属性及系统活动痕迹,重点筛查gecos字段异常、lastlog与chage联合判断活跃性、shell及home目录非标配置,并结合auditd追踪异常操作。

识别僵尸账号和伪装用户不能只看用户名或备注字段,得结合登录行为、密码策略、账户属性和系统活动痕迹交叉验证。单纯靠“名字像测试号”或“备注为空”容易误判,也容易漏掉真正危险的隐蔽账户。
查GECOS字段看备注是否可疑
GECOS字段(/etc/passwd 第五列)记录真实姓名、部门、电话等,但系统不校验格式,所以重点不是“填没填”,而是“填得反常”。可用以下命令快速拉取:
- getent passwd | cut -d: -f1,5 —— 比 cat /etc/passwd 更可靠,覆盖 LDAP/NIS 账户
- getent passwd | awk -F: '$5 ~ /^(test|demo|temp|old|backup|202[0-9])$/ || $5 == "" || $5 ~ /^,+,+$/ {print $1,$5}' —— 筛出含关键词、全空或纯逗号的账号,标记为初筛对象
注意:邮箱或手机号出现在备注里(如 zhangsan@company.com)反而更可能为真实用户,但需配合组成员身份(id -Gn username)进一步确认活跃性。
用 lastlog 和 chage 联合判断是否真“死”
僵尸账号的核心特征是“长期无活动 + 无有效凭证延续机制”。单看一项会出错:
- lastlog -b 365 列出一年内未登录的账号;但 root、nobody、sync 显示 “Never logged in” 属正常,别动
- chage -l username 关键看:Password expires: never 或 Account expires: 为空,说明没设过期;若显示 password must be changed 且距今超90天,基本可判定废弃
- 特别警惕 UID 的非标准系统账号——可能是攻击者创建的低权限后门
检查 shell、home 目录与登录权限
很多伪装用户会刻意隐藏自身行为痕迹:
- grep -v '/sbin/nologin\|/bin/false' /etc/passwd | awk -F: '$7 !~ /^\/(bin|usr\/bin)\/bash$/ && $7 != "/bin/sh" {print $1,$7}' —— 找出 shell 非标准 Bash/Sh 的账号,如 /usr/bin/tcsh、/bin/zsh 或路径异常的自定义 shell
- awk -F: '$6 == "" || !($6 ~ /^\/home\//) {print $1,$6}' /etc/passwd —— home 目录为空或不在 /home 下,可能为 service account,但也可能是伪造账户
- passwd -S username 只显示锁状态(L/P),不能替代 lastlog+chage;P 状态不代表活跃,三年没登录照样显示 P
用 auditd 追踪异常登录与提权行为
如果已启用 auditd,可快速发现伪装用户的操作证据:
- 查失败登录:ausearch -m authfail -i | grep "acct=" | sort | uniq -c | sort -nr
- 查 sudo 提权:ausearch -m EXECVE -i | grep -E "(sudo|su\s+-)"
- 查新用户创建:ausearch -m ADD_USER -i(需提前开启 user/group 相关规则)
- 关键审计规则建议加到 /etc/audit/rules.d/custom.rules:
-w /etc/passwd -p wa -k identity_change
-a always,exit -F arch=b64 -S execve -F uid!=0 -k suspicious_exec
auditd 日志比 /var/log/auth.log 更难篡改,适合事后回溯真实操作链。











