为什么要查新增账号
入侵者建立后门账号后,/etc/passwd、/etc/shadow、/etc/group 的修改时间会与家目录创建时间同步变新。判定要抓两条线:账号「建立时间」与「首次登录时间」,只盯家目录会漏掉 root 家目录与本就不建家目录的账号。
在什么前提下解读
时间戳本身只是线索,可信的做法是把文件时间、auth.log 中的 useradd 痕迹、lastlog 首次登录三者交叉。若日志已轮转,还要翻 .1 与压缩包补齐时间窗,否则「没查到」和「确实没有」分不清。
基本信息
| 关键文件 | /etc/passwd、/etc/shadow、/etc/group、/etc/gshadow |
|---|---|
| 家目录线索 | /home、/root 及自定义路径(如 /var/www) |
| 时间工具 | ls -l --time-style=long-iso、stat |
| 登录记录 | lastlog、last、wtmp 归档 |
| 权限要求 | 读 shadow 与 lastlog 需 root |
| 适用平台 | RHEL/CentOS 与 Debian/Ubuntu 通用 |
典型使用场景
- 确认入侵者是否新建后门账号(help、admin、test 之类常见名)
- 核查运维交接后是否有未登记的账号被建立
- 清理共享主机上长期无人认领的账号
- 用 auth.log 的 useradd/usermod 记录校验账号建立时间点
- 事件收尾时核对账号清单,确认没有遗留通道
时间线索交叉排查
时间线索交叉排查
ls -l --time-style=long-iso /etc/passwd /etc/shadow /etc/group /etc/gshadow
ls -lt /home /root | head -n 20
lastlog | grep -v 'Never logged in' | head -n 20
grep -aiE 'useradd|usermod|groupadd' /var/log/auth.log* 2>/dev/null | tail -n 20
stat -c '%n mtime=%y ctime=%z' /etc/passwd /etc/shadow
awk -F: '$3>=1000 && $3<65534 {print $1, $3, $6, $7}' /etc/passwd输出逐列读法
| 字段 | 含义 | 正常/异常 |
|---|---|---|
| passwd 的 mtime | 账号文件最后修改时间 | 与已知运维操作时间不符即为异常 |
| lastlog 时间 | 账号最后一次登录 | 新账号显示 Never logged in 需解释来历 |
| 家目录 mtime | 目录内容最后变动 | 与 passwd 修改时间接近说明同时创建 |
| UID 段 | 1000 以上为普通用户 | 出现非 0 的高权限 UID 要单独核对 |
高权限与可登录账号复核
高权限与可登录账号复核
awk -F: '$3==0 {print $1, $7}' /etc/passwd # UID 0 账号全部列出
awk -F: '$7 !~ /(nologin|false)$/ {print $1, $7}' /etc/passwd # 可登录 shell 的账号账号可能是先建后用的:建立时间与首次使用时间要分开记录;auth.log 轮转后看不到记录时应翻 wtmp 与归档日志补历史。
只看账号名会漏掉最隐蔽的一类:root1、admin0 这类近似名,以及任何 UID 为 0 的非 root 账号,都必须按 UID 字段逐条核对。
一并核对的账号类型
- UID 0 的非 root 账号与可登录 shell 的系统账号
- 具备 sudo 权限的普通账号(含 sudoers.d 下的条目)
- 应用自建账号:数据库、Web 面板、备份软件依附账号
- 长期未登录却未锁定的历史运维账号