为什么 Linux 装完服务都要建一个 nologin 用户?最小权限的设计账
为什么装完一个服务,系统里就多了一个不能登录的用户?
结论先说:这是最小权限设计,让服务用专属账户跑,而不是用 root 跑。 装完数据库、Web 服务、消息队列这类软件后,安装流程往往会自动建一个与软件同名的用户,你去看它的 shell 配置,会发现是 nologin——不能交互登录。很多运维新手会疑惑:一个登不上去的账户有什么用?答案是:它不是给人用的,是给程序用的。
这笔设计账要算三层
- root 跑服务的风险。 如果服务以 root 身份运行,一旦服务本身被攻破——比如一个有漏洞的 Web 应用被拿下——攻击者拿到的就是整台机器的权限,所有数据、所有配置、甚至横向攻击的跳板全部暴露。
- 专属账户=把爆炸半径圈起来。 服务改用自己的低权限账户运行后,同样的攻破事件,攻击者能碰到的只有这个账户名下的文件和目录,读写范围、可执行的目录都被压到很小,损害被限制在单个应用层。这就是「爆炸半径限位」的思路。
- nologin 的确切语义:不能交互登录,不等于不能运行程序。 nologin 挡的是「人坐到终端前敲密码登进去」这条路;程序以该用户身份执行、后台常驻、对外提供服务,一点都不受影响。需要临时以该账户身份执行命令时,管理员可以用 su 或 runuser 指定用户运行,不需要真能登录。
怎么查看和审计
- 想知道某个服务正以哪个账户在跑,用
ps -u 用户名一眼看清该用户名下的所有进程;反过来在进程列表里看到陌生用户名,对照/etc/passwd里它的 shell 字段是不是 nologin,基本就能判断是某个软件的服务账户。 - 审计建议:服务器上定期清点一遍「哪些账户是服务账户、分别归属哪个软件」,没有归属的陌生账户要查来源;这比事后追认安全得多。
- 服务目录的属主保持与服务账户一致,避免为了省事把目录放开给其他用户,否则最小权限的圈又被拆了。
相关提示
- 这套设计思路在 Windows 上同样存在:系统服务也推荐用专属服务账户而非管理员账户运行,两边逻辑一致。
- 中小企业自建服务器时,服务账户规划、目录权限、防火墙这三件事建议在部署之初一次做对,后期补救的成本远高于开始时多花的半小时。诚鑫在做服务器部署与安全加固交付时,会把服务账户清单和权限边界写进交付文档,方便后续运维接手。
本文涉及:Linux、nologin、服务账户、最小权限、服务器安全