应使用getent passwd | awk -f: '$3=1 && $3

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










