![]()
2023年,某金融公司的生产环境被审计出一条诡异记录:一个名为backup_svc的账号在过去3年里执行了超过800万次文件操作,却从未有过任何登录会话。审计员一度怀疑是日志篡改,直到运维工程师展示了那条/etc/passwd里的配置——/sbin/nologin。
这就是非交互式用户(non-interactive user),Linux系统里最被低估的"幽灵账号"。
它像一把没有钥匙孔的锁
普通用户登录时,系统会读取/etc/passwd最后一列,启动/bin/bash或/bin/zsh,给你一个可以敲命令的交互环境。非交互式用户则指向一个"空壳"可执行文件——通常是/sbin/nologin或/bin/false。
你尝试用ssh ammar@server连接?连接瞬间即断开,连密码验证的报错都懒得给你看完整。KodeKloud的Day 1实验里,学员用sudo useradd -s /sbin/nologin ammar创建的这个用户,完美复现了这种"存在但不可触碰"的状态。
![]()
这种设计最早可追溯至1990年代的Unix系统管理实践。当时系统管理员需要让某些服务进程拥有独立的文件所有权,又不想给潜在攻击者留下任何交互入口。/sbin/nologin的源码极其简单:打印一条拒绝信息,返回退出码1。没有shell解析,没有环境变量加载,攻击链在这里直接断掉。
为什么DevOps工程师突然扎堆学这个
2020年后,容器化和CI/CD流水线普及,非交互式用户的使用场景暴增。GitLab Runner、Jenkins Agent、Kubernetes的securityContext——这些服务都需要一个系统身份来读写文件,但绝不需要(也不应该)被人直接登录操作。
KodeKloud的课程设计很有代表性:学员先通过本地终端获取跳板机凭证(steve/stapp02/Am3ric@),再远程创建目标用户。这种"双层认证+最小权限"的演练,模拟了真实企业环境中运维工程师的日常路径。
一个细节:实验里用的是/sbin/nologin而非/bin/false。两者功能几乎相同,但前者会礼貌地返回一句"This account is currently not available",后者彻底沉默。在需要排查问题的场景下,nologin的反馈能帮你区分"账号不存在"和"账号存在但被拒绝"——这在凌晨3点的故障排查中,可能省下20分钟。
![]()
非交互式用户有个反直觉的特性:它确实能"执行"东西。当Cron定时任务或者Systemd服务以这个用户身份运行时,进程正常启动,文件权限正常生效。只是没有人类能坐在键盘前驱动它。
这就形成了一个有趣的安全模型——攻击者即使拿到了账号密码,也无法建立交互式会话;但如果他找到了以该用户身份运行的服务漏洞,提权路径依然存在。2022年某云厂商的数据泄露事件,源头正是一个配置错误的非交互式用户,其关联的NFS共享权限过于宽松。
KodeKloud的实验到此为止,但真实世界的配置远未结束。你还需要检查/etc/shadow是否设置了强密码(即使没人能登录)、确认用户主目录权限为700、审计sudoers文件有没有意外授权。这些后续步骤,课程没讲,但生产环境不会原谅遗漏。
那个金融公司的运维团队,最终在审计报告里补充了一条备注:所有非交互式用户的创建,现在必须通过Terraform代码审查,且/etc/passwd的变更会实时同步到SIEM系统。幽灵账号依然存在,只是不再无人知晓。
你现在的生产环境里,有多少个/sbin/nologin结尾的账号?最近一次清点是什么时候?
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.