为什么要用 getent 查账号
本地 /etc/passwd 干净不代表没有后门账号:接入 LDAP、sssd 等目录服务后,账号视图由 NSS 合并多个来源。检查 UID 0 的账号、重复 UID 与重复用户名,必须用 getent passwd——它走的是与应用程序完全相同的 NSS 链路。
基本信息
| 工具 | getent passwd(合并 NSS 全部来源) |
|---|---|
| 检查项 | UID 为 0 的账号、重复 UID、重复用户名 |
| 原因 | 本地与目录服务可能各存在一个同名账号 |
| 替代视角 | id <名字> 查看最终生效的来源与结果 |
| 配置依据 | /etc/nsswitch.conf 的来源顺序 |
| 性质 | 只读查询,不做任何修改 |
典型使用场景
- 排查是否存在 UID 为 0 的非 root 账号
- 确认同名账号在本地与目录服务中的优先级
- 加固巡检:核对重复 UID 带来的权限放大
- 排查账号被禁用后仍能登录的情况
- 审计前核对账号视图与资产台账是否一致
- 处置中确认删除动作是否真的生效
- 演练中练习跨库账号检查
跨库检查 UID 冲突
跨库检查 UID 冲突
getent passwd | awk -F: '$3==0' # 所有 UID 为 0 的账号
getent passwd | awk -F: '{print $3}' | sort -n | uniq -d | head # 重复 UID
getent passwd | awk -F: '{print $1}' | sort | uniq -d | head # 重复用户名
getent passwd root # 与本地文件比对
id root # 最终生效视图
grep -E '^passwd' /etc/nsswitch.conf # 账号来源顺序检查项与异常表现
| 检查项 | 命令 | 异常表现 |
|---|---|---|
| UID 0 账号 | awk -F: '$3==0' | 出现 root 以外的条目 |
| 重复 UID | uniq -d 统计第三列 | 两个账号共享同一权限范围 |
| 重复用户名 | uniq -d 统计第一列 | 两处同名条目,谁生效看来源顺序 |
| 来源顺序 | nsswitch.conf | 目录服务排在本地前会覆盖本地账号 |
| 最终视图 | id <名字> | 与 getent 结果不一致即需追查 |
id 与 getent 走同一条 NSS 链路:它们的结果才是应用程序真实看到的账号视图,直接读 /etc/passwd 会得出不同结论。
处置中删除账号后要用 getent 复验:账号可能来自目录服务,删掉本地文件并不会让它真正消失。
比对时要连 shell 字段一起看:UID 正常的账号若 shell 指向可执行脚本或异常解释器,同样值得追查来源。