我读完之后列出所有人类用户我注意到我的 Ubuntu 系统中有一个名为“nobody”的用户帐户。
我还注意到我可以使用以下命令和密码从终端登录该帐户:
sudo su nobody
我一点也不介意,但我想知道这个用户的目的是什么?它是在全新安装的 Ubuntu 上默认创建的,还是通过安装特定软件包创建的?
答案1
它用于运行不需要任何特殊权限的程序。它通常为易受攻击的服务(httpd 等)保留,这样如果它们被黑客入侵,对系统其余部分的损害将最小。
这与运行某些东西进行对比作为真实用户,如果该服务被入侵(Web 服务器偶尔会被利用来运行任意代码),它会以该用户的身份运行,并可以访问该用户拥有的所有内容。在大多数情况下,这是一样糟糕获得 root 权限。
您可以在 Ubuntu Wiki 上阅读有关 nobody 用户的更多信息:
回答您的后续问题:
为何我无法访问该帐户su nobody
?
sudo grep nobody /etc/shadow
会告诉你没有人没有密码,你su
没有账户密码就不能登录。最干净的方法是sudo su nobody
改为。这会让你陷入一个相当荒凉的sh
境地。
你能给我一个具体例子什么时候需要使用这个帐户?
当程序操作不需要权限时。当没有任何磁盘活动时,这种情况最为明显。
A真实世界例如memcached
(一个键值内存缓存/数据库/东西),位于我的电脑上,我的服务器在 nobody 帐户下运行。为什么?因为它不需要任何权限,而给它一个对文件有写权限的帐户只会带来不必要的风险。
答案2
nobody 是保留给用户的仅限 NFS。
上述答案相当错误,因为他们假设这nobody
是一个“通用”匿名/访客风格的用户 ID。
在 UNIX/Linux 访问控制模型中,匿名/访客风格的用户 ID 不存在,并且以下是糟糕的建议:
- “以守护进程的形式运行是很常见的
nobody
,尤其是服务器,目的是为了限制获得控制权的恶意用户可能造成的损害。“由于以下内容:”但是,如果像这样运行多个守护进程,这种技术的实用性就会降低,因为获得对一个守护进程的控制权将意味着获得对所有守护进程的控制权“。 - “一个真实的例子是
memcached
(一个键值内存缓存/数据库/东西),它位于我的电脑上,并且我的服务器以该nobody
帐户运行。为什么?因为它不需要任何权限,而给它一个对文件有写权限的帐户只会带来不必要的风险。“
用户 ID 为 65534 的用户nobody
名是为特定目的而创建和保留的,并且只能用于此目的:作为“未映射”用户和 NFS 树导出中的用户 ID 的占位符。
也就是说,除非为 NFS 树导出设置了用户/ID 映射,全部导出中的文件将显示为 所拥有nobody
。这样做的目的是防止导入系统上的所有用户访问这些文件(除非他们具有“其他”权限),因为除了 之外,没有一个文件root
可以是/成为nobody
。
nobody
因此,使用任何其他用途,因为它的用途是作为任何人都不能访问的文件的用户名/用户 ID。
通用的维基百科条目也非常错误。将其与Ubuntu 维基。
UNIX/Linux 的做法是为每个需要单独访问控制域的“应用程序”或应用程序区域创建一个新帐户,并切勿nobody
在 NFS 之外重复使用。
答案3
在许多 Unix 变体中,“nobody”是没有文件、不属于任何特权组、并且除了其他用户所具有的能力之外没有其他能力的用户帐户的常规名称。
以 nobody 身份运行守护进程是很常见的,尤其是服务器,以限制获得控制权的恶意用户可能造成的损害。但是,如果像这样运行多个守护进程,这种技术的实用性就会降低,因为获得对一个守护进程的控制权将提供对所有守护进程的控制权。原因是 nobody 拥有的进程能够相互发送信号,甚至相互调试,从而允许它们读取甚至修改彼此的内存。
答案4
nobody 是特殊的用户和组帐户。因为它是一个实际的用户名(和组名),并且可以由进程甚至用户使用,所以它并不是字面上的没有人。例如,某些 Apache 配置将 nobody 作为拥有网站文件和目录的用户/组。当多个进程可能使用 nobody 用户时,就会出现问题,例如 NFS 目录和 Web 服务器。