首页/安全/安全加固速查/UID 0 账号核查(仅允许 root)
主机加固基线90 条

UID 0 账号核查(仅允许 root)

检查 /etc/passwd 中 UID 为 0 的账号:任何非 root 的 UID 0 账号都等同于超级用户,是攻击者留后门与提权的经典手法,发现即清理。

安全加固速查安全更新于 2026-10-13

UID 0 的含义

Linux 判定权限看的是 UID 而不是用户名:/etc/passwd 第三字段为 0 的账号就是超级用户,权限与 root 完全相同。后门账号的经典做法有两种,一是新建账号后把 UID 改成 0,二是直接复制 root 那一行、只改用户名。所以核查只认 UID 不认名字,叫 dbadmin、sysbackup 的账号同样可能是完全特权账号。

基本信息

加固项非 root 账号不得拥有 UID 0
适用平台Linux(RHEL/CentOS/Debian/Ubuntu)
风险等级高
判定标准UID 0 账号列表只应包含 root 一行
检查位置/etc/passwd 第三字段;目录服务账号用 getent 兜底

典型使用场景

  • 交付自查与等保核查:证明设备上不存在多余的超级用户账号
  • 应急响应取首证:账号被悄悄添加后,UID 0 清单是最快能定位的一步
  • 周期巡检:把 UID 0 清单纳入定期核查,与上次记录比对差异
  • 存量清理:早期运维图省事复制的 root 账号往往还留在 passwd 里
  • 变更后复核:任何账号操作之后重跑一次,确认没有引入新的 UID 0

核查命令

核查命令
awk -F: '($3 == 0) { print $1 }' /etc/passwd        # 预期只有 root 一行
awk -F: '($3 == 0) { print $1, $3, $4, $7 }' /etc/passwd   # 一并看 GID 与登录 shell
grep -E ':0:0:' /etc/passwd                        # 双 0 比对:UID 与 GID 都为 0
getent passwd 0                                    # 含 LDAP/SSSD 等目录服务账号
stat -c '%y %n' /etc/passwd /etc/shadow            # 看修改时间,近期被改要追来源

passwd 逐字段读法

字段含义判读要点
用户名登录名,仅为显示与登录用名字普通不代表权限普通,不能据此排除
口令占位x 表示哈希存放在 shadow 中出现明文或空字段要单独核查口令状态
UID用户标识,0 即超级用户除 root 外出现 0 一律按高危登记
GID主组标识,0 即 root 组只改 GID 为 0 的变体同样可读写 root 组文件
描述字段账号备注信息后门账号常留空或填写随意,可作辅助线索
家目录登录后的起始目录指向不存在的路径或为 / 的账号要额外核实
登录 shell登录后使用的 shell为 bash 或 sh 说明可交互登录,风险等级再上调

处置:先锁定再评估

处置:先锁定再评估
# 不要一上来就删账号,删除会产生无属主文件,破坏现场
usermod -L -s /usr/sbin/nologin rogue0     # 锁定口令并禁用登录 shell
passwd -l rogue0                           # 或单独锁定口令
awk -F: '($3 == 0) { print $1 }' /etc/passwd   # 复核处置结果
# 确认是历史遗留且无人使用后,再走变更流程删除:
# userdel rogue0 之后执行 find / -nouser -print 补扫无属主文件
处置前确认该账号是否被业务直接使用:userdel -r 会连家目录一起删除,普通 userdel 也会让该账号名下文件变成无属主。删除属于变更动作,不在核查环节顺手做;核查阶段只记录证据(账号名、UID、家目录、创建与修改时间)。
只查 /etc/passwd 会漏掉目录服务里的账号:LDAP 与 SSSD 环境的 UID 0 账号在本地文件里看不到,统一用 getent 兜底。容器与 chroot 环境有各自独立的 passwd,也要按各自文件单独核查。

常见后门特征

  • 账号名模仿系统账号:如 r00t、root0、adm1n、support 这类容易被扫一眼放过的名字
  • UID 为 0,但家目录指向根目录或不存在的路径
  • 描述字段留空,而同类系统账号通常有明确说明
  • 创建时间与 passwd 文件修改时间接近,说明是同一批操作产生的
  • 出现在全新建的系统上,却不属于该发行版的默认账号清单

把核查做成制度

UID 0 清单只在受控时才有意义:把「UID 0 只允许 root」写成基线条款,纳入周期核查与变更审批,禁止任何人工把 UID 改成 0 的操作绕过流程。核查输出连同 passwd 与 shadow 的修改时间一起归档,形成可跨期比对的证据链,评审时才有说服力。

易错点

  • 只看用户名不看 UID:把后门账号起成数据库管理员之类的普通名字是常见伪装,判定必须按第三字段
  • 处置顺序反过来:先删账号再取证会破坏时间线,正确顺序是封存 passwd 与 shadow 副本及修改时间,再评估处置
  • 漏掉 GID 0 变体:某些做法把 UID 保持普通值只把 GID 改成 0,同样能读写 root 组文件,单 0 与双 0 都要看
  • 下调 UID 影响文件属主:把 UID 0 账号改成普通 UID 会让其名下文件归属变化,必须走变更窗口并在事后补扫无属主文件
  • 域账号与本地账号混查:getent 会同时返回本地与目录服务结果,定位时须区分来源,否则容易误判成本地后门

数据来源与参考

  • CIS Linux Benchmark:访问控制章节(Ensure UID 0 account is root only)
  • 等保 2.0 三级:身份鉴别与访问控制要求

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌