应使用getent passwd | awk -F: '$3<0 || ($3>=1 && $3<1000)' /dev/null命令结合/etc/passwd人工核查格式异常行,重点追溯创建来源与登录痕迹。
怎么查系统里有没有非标准UID的用户
Linux默认用户UID从0开始,普通用户通常从1000起(不同发行版可能略有差异),但管理员可能手动创建UID小于1000甚至为负数的“别名账户”——这类账户不走
流程,容易绕过常规审计。直接看
最可靠,但不能只扫UID数字,得结合
(兼容LDAP/NIS)和
逻辑过滤。
注意
比直接读
更准,尤其在启用了SSSD或LDAP的环境
某些容器镜像或嵌入式系统会把普通服务用户UID设成500、999等,需结合
里的
值判断是否真异常
为什么
有时查不到别名账户
因为别名账户未必是独立用户,可能是通过
改名残留、
强制创建的重复UID,或仅存在于
但
被删掉的“半残”账户。这时候
查不到,但
仍可能成功登录——本质是PAM认证层还能匹配密码哈希。
用
确认该用户名是否仍在shadow数据库中
检查
里近期是否有
或
对应这个用户名,哪怕
失败
别忽略
结果:有些别名账户没家目录,但
还在,能免密登录
只能找到root?漏了哪些情况
只查UID=0确实只抓到root,但攻击者常用“UID复用”手法:用
创建第二个UID=0用户。这种账户
显示是root权限,但用户名不是root,
也照常返回
状态,极难察觉。
必须加
单独扫非root的UID=0
同一UID下多个用户名会导致
只返回第一个(按
顺序),所以得用
全文件扫描
某些加固脚本会禁用
,但老版本
或直接编辑
仍可绕过
审计脚本里为什么不能只依赖
这条命令只输出去重后的UID列表,完全丢失用户名上下文,你看到“999”根本不知道是
还是攻击者新建的
。更糟的是,如果某行
格式损坏(比如少一个
),
会截断错位,把shell字段当UID输出,导致误报。
坚持用
带用户名输出,再用
按UID排序
加
抑制
对损坏行的警告,避免干扰管道后续处理
真正要自动化审计时,得补一句
先挑出格式异常行人工核查
非标准UID本身不危险,危险的是它背后脱离标准流程的创建方式——这些账户往往没进sudoers白名单、没被堡垒机日志捕获、也不在定期导出的用户清单里。查的时候别只盯数字,重点看“谁建的、怎么建的、有没有登录痕迹”。
adduser/etc/passwdgetent passwdawkgetent passwd | awk -F: '$3 :排除root(0)、daemon(1)、sys(2)、nobody(65534)等系统保留UID,只留可疑低UIDgetent/etc/passwd/etc/login.defsUID_MINid -u usernameusermod -luseradd -o/etc/shadow/etc/passwdidsu - usernamegetent shadow username/var/log/auth.logFailed passwordsession openedidls -la /home//home/username/.ssh/authorized_keysawk -F: '$3 == 0' /etc/passwduseradd -o -u 0 backdooridpasswd -SPSawk -F: '$3 == 0 && $1 != "root" {print}' /etc/passwdgetent passwd 0/etc/passwdawkuseradd -oadduser/etc/passwdcut -d: -f3 /etc/passwd | sort -udnsmasqhack01/etc/passwd:cutawk -F: '{print $1,$3}' /etc/passwdsort -k2,2n2>/dev/nullawkgrep -v '^[a-z]\+:[^:]*:[0-9]\+:[0-9]\+:[^:]*:[^:]*:[^:]*:/[^:]*:/[^:]*:' /etc/passwd