应使用 getent passwd | awk -F: '$3 == 0 {print $1 ":" $6 ":" $7}' 筛查所有 UID=0 账户,而非 find -user 0;发现异常账户后须人工确认来源与风险,再执行锁定、禁用或删除操作。

find -user 0 -and -not -name "root" 这个命令不能用于盘点 UID=0 的用户账户,它根本不会输出任何结果,也不符合 Linux 账户管理机制。原因很直接:-user 0 是 find 命令中用来按文件所属用户(UID)查找文件的参数,不是查 /etc/passwd 中的用户条目。它只会扫描文件系统里“所有者 UID 为 0”的文件(比如 /root/ 下的文件、/etc/shadow 等),和“是否存在非 root 的 UID 0 账户”完全无关。
真正要秒级发现并拦截这类后门,得从账户数据源入手,分三步走:快速筛查、人工确认、即时阻断。
⚠️ 注意:所谓“秒级拦截”,本质是“秒级发现 + 手动确认后立即处置”,没有全自动静默拦截的安全机制;任何声称能“自动删账号而不留痕”的脚本都极度危险,可能误伤系统服务。
快速筛出所有 UID=0 的账户(含伪装者)
只查 /etc/passwd 不够全面(尤其启用了 LDAP/SSSD 时),必须用 getent 兼容后端:
getent passwd | awk -F: '$3 == 0 {print $1 ":" $6 ":" $7}'
正常输出仅一行:
root:/root:/bin/bash
若出现多行,例如:
root:/root:/bin/bash backup:/var/backup:/sbin/nologin admin:/home/admin:/bin/bash
说明存在非 root 的 UID=0 账户——这就是高危后门或严重配置错误。
重点确认来源与风险等级
对每个非 root 的 UID=0 用户,逐项核查:
是否在
/etc/shadow中有密码记录?sudo grep '^backup:' /etc/shadow
若第二字段为空(backup::...)或为弱哈希(如$1$...),风险极高。是否近期登录过?
lastlog -u backup或sudo journalctl _UID=0 | grep backup | tail -3是否由自动化工具误建?
检查命令历史:history | grep -E "(useradd|adduser).*-u.*0.*-o"
查看 Ansible/Puppet 日志(如/var/log/ansible.log)是否有uid=0的 user 模块调用。是否具备登录能力?
看 shell 是否为/bin/bash/bin/sh等交互式 shell;若为/sbin/nologin,仍可能被su -c或sudo利用,不可掉以轻心。
立即拦截动作(确认为非法后)
确认为攻击者植入后,执行以下任一操作(不要跳过确认环节):
锁定账户(推荐首选):
sudo usermod -L -s /usr/sbin/nologin backup清空密码并禁用 shell:
sudo passwd -d backup && sudo usermod -s /usr/sbin/nologin backup彻底删除(仅当确认无业务依赖):
sudo userdel -r backup
⚠️ 删除前务必检查id -Gn backup、crontab -u backup -l、ls -la /home/backup/.ssh/,避免残留密钥或定时任务。
补充加固:防止再次植入
禁用危险参数(需重启
useradd生效):
编辑/etc/adduser.conf,设ALLOW_BADNAME=no,并确保无useradd -o调用权限。审计创建行为:
启用 auditd 规则:sudo auditctl -a always,exit -F uid!=0 -F auid>=1000 -F perm=x -F path=/usr/sbin/useradd设置告警:
将开头的getent命令加入每日 cron,输出异常时邮件通知管理员。
不复杂但容易忽略。











