在使用 linx-server 的时候,发现作者在 Dockerfile 中将存储文件的目录授予了 65534 这个用户权限,于是好奇为什么是 65534,于是有了这篇文章。

首先找到的是 Wikipedia 上关于 Linux 中用户 nobody 的 UID,历史上,用户 nobody 有多好几个不同的 UID,最早的时候一些操作系统使用 -2,还有一些操作系统,比如 OpenBSD 使用 2^(15) - 1 = 32767 ,为了兼容 16-bit 和 32-bit UID,现在许多 Linux 发行版将 nobody 的 ID 设置为 2^16-2 = 65534.

Ubuntu wiki 说 nobody 通常是 NFS 服务器中当不信任用户时使用的。

nobody 用户的作用

nobody 账户通常会用来运行一些不需要任何权限的程序。 nobody 账户是让一些守护程序以最小权限运行的。1 通常会用在一些容易受到攻击的服务上,比如 httpd 等,即使这些服务被 hack,这些服务也只会对系统造成最低的伤害。

相比于使用一个真正的用户执行程序,如果这些程序被攻破了(比如 web 服务器执行了恶意代码),那么这些程序以用户账户运行的话,就拥有了这个用户账号可以访问的一切资源。在某种程度上不使用 root 账户也是一样的道理。用一个隔离的账户来执行这些程序可以提高系统的安全性。

如何访问 nobody

执行 sudo grep nobody /etc/shadow 可以知道 nobody 账户是没有密码的,无法使用 su 输入密码登录。最简单的方法是使用 sudo su nobody

什么时候使用 nobody

当程序不需要任何权限的时候,比如在 linx-server 的 data 目录中保存的是用户上传的临时文件,这个文件不需要任何权限。

另外一个现实的例子就是 memcached 一个 k-v 的基于内存的存储,直接可以通过 nobody 运行,因为不需要任何写磁盘的操作。

reference