这条命令在查什么
这条核查命令用 awk 直接扫 /etc/passwd 的第三字段,把 UID 为 0 的账号名全部打出来。正常结果只有一行 root;出现第二行就意味着这台机器上有一个与 root 等权的账号,可能是历史遗留,也可能是后门。它是等保与基线核查里最快能得出结论的一条命令,也是入侵排查的固定动作:先看有没有多余超级用户,再谈其他加固。
基本信息
| 加固项 | 账号特权最小化 |
|---|---|
| 适用平台 | Linux(RHEL/CentOS/Debian/Ubuntu) |
| 风险等级 | 高 |
| 判读 | 除 root 外输出任何账号均为高危 |
| 命令要点 | 按 UID 判定,不按用户名判定;目录服务账号用 getent 兜底 |
典型使用场景
- 等保测评前的自查:先证明设备上没有多余超级用户,再往下查其他条款
- 应急响应第一轮:被入侵后先确认攻击者是否留了 UID 0 后门
- 交付验收:交付前把输出贴进报告,作为访问控制的证据
- 周期巡检:把结果与上期比对,新出现的账号必须有变更单对应
- 批量核查:脚本对多台主机跑同一命令,一次性拉出全部异常结果
核查命令
核查命令
awk -F: '$3==0 {print $1}' /etc/passwd # 最常用的一条,预期只有 root
getent passwd 0 # 含 LDAP/SSSD 等目录服务账号
grep -E ':0:0:' /etc/passwd # 双 0 比对:UID 与 GID 同时为 0
getent passwd | awk -F: '$3==0 {print $1, $7}' # 连同登录 shell 一起看
stat -c '%y %n' /etc/passwd /etc/shadow # 记录修改时间,纳入证据链输出判读
| 输出情形 | 含义 | 处置 |
|---|---|---|
| 只有 root | 符合基线 | 归档即可,无需处理 |
| root 加另一个账号 | 存在等权账号,高危 | 按安全事件流程取证,先锁定再评估 |
| 账号名刻意相似(如 root、admin、backup) | 伪装成管理账号的后门特征 | 立即取证,不要直接删除 |
| 完全无输出 | 命令或文件异常,多半是分隔符或路径写错 | 核对 -F 参数与本机实际文件位置 |
| getent 与本地文件结果不一致 | 存在目录服务提供的账号 | 以 getent 为准,并核对上游目录的授权来源 |
处置与复核
处置与复核
cp /etc/passwd /etc/shadow /root/evidence-$(date +%F)/ # 先封存证据
usermod -L -s /usr/sbin/nologin rogue0 # 锁定口令并禁用登录 shell
awk -F: '$3==0 {print $1}' /etc/passwd # 复核,确认只剩 root
awk -F: '$3==0 {print $1}' /etc/passwd > /root/uid0-$(date +%F).txt # 留档发现非 root 的 UID 0 账号按安全事件处理:先封存 passwd 与 shadow 副本并记录修改时间,再核实来源与创建时间,不要直接删除。删除会破坏现场,也让时间线无法还原。
getent 会同时返回本地与目录服务的账号:同一个 UID 0 账号可能来自上游 LDAP 或统一身份平台,处置前先确认来源,避免把集团统一账号误判成本机后门。
awk 的 -F 参数不能省:不指定冒号作分隔符时会把整行当成一个字段,输出为空会让人误以为系统干净。命令跑完先确认至少能看到 root 一行,看不到就是命令写错了,而不是设备没问题。
批量核查做法
- 用 Ansible 或 pdsh 对全部主机批量执行同一条命令,把结果汇总成一份总表
- 总表按主机分组,只标出非 root 的行,减少逐台翻查的工作量
- 每次变更后重跑并留存输出,与上期结果做差异比对
- 输出统一带主机名与时间戳,便于归档和事后追溯
输出要怎样归档
这一条命令的价值在于可重复比对:把每次输出按「主机名 + 日期」存档,形成跨期清单。周期核查时只关注差异行,新增的 UID 0 账号要么有对应变更单,要么就是待查对象;有了基线,判断从「像不像后门」变成「与上期是否一致」,结论更硬。