“无人”用户的目的是什么?


93

阅读完“列出所有人类用户”后,我注意到Ubuntu系统中有一个名为“ nobody”的用户帐户。

另外,我注意到我可以使用以下命令和密码从终端登录此帐户:

sudo su nobody

苏没人

根本不介意我,但是我想知道这个用户的目的是什么?它是默认在全新安装的Ubuntu上创建还是通过安装特定软件包创建的?


8
请注意,使用密码登录时,您将密码用于sudo步骤,而不是无人帐户(并且起作用的原因是,超级用户无需输入密码即可对任何人提出诉讼(尽管如下所述,我相信至少在RH派生类上,如果没有人的shell设置为/ sbin / nologin,即使使用超级用户(也称为root),您仍然无法登录
Foon 2013年

现在默认情况下就是这种情况(18.04+?)。sudo su nobody返回此帐户当前不可用。因为用户的外壳nobody 设置为/usr/sbin/nologingetent passwd nobody)。
Pablo A

@sarnold-请参阅我对我所认为的答案的评论。这是一个很差的答案,因为它没有理由或没有引用来源。此外,它与我对Nobody帐户以及NFS的工作方式了解的所有信息背道而驰:root_squash它将根目录映射到远程系统上的Nobody。这与该答案所陈述
维达尔洛

Answers:


85

它在那里运行不需要任何特殊权限的事物。它通常是为易受攻击的服务(httpd等)保留的,因此,如果它们被黑客入侵,它们对系统其余部分的损害将最小。

与以实际用户身份运行某些程序相反,如果该服务受到损害(有时会利用Web服务器来运行任意代码),它将以该用户身份运行并可以访问该用户拥有的所有内容。在大多数情况下,这和扎根一样糟糕

您可以在Ubuntu Wiki上了解有关nobody用户的更多信息:

要回答您的后续问题:

为什么我不能使用su nobody

sudo grep nobody /etc/shadow会告诉您没有人没有密码,您也无法su没有帐户密码。最干净的方法是sudo su nobody改为。这会让您陷入一个非常荒凉的sh外壳中。

当指示使用该帐户时,您可以举一个具体的例子吗?

当程序的操作不需要权限时。当永远不会有任何磁盘活动时,这是最值得注意的。

一个真实的例子是memcached(一个键值内存缓存/数据库/事物),它位于我的计算机上,我的服务器在nobody帐户下运行。为什么?因为它不需要任何权限,并且为它提供对文件具有写访问权的帐户,这将是不必要的风险。


如果您能解释的话,只需再做两件事:1)为什么我不能使用来访问此帐户,su nobody以及2)当指示使用该帐户时,您可以举一个特定的示例吗?
RaduRădeanu13年

@RaduRădeanu1)我猜这是因为它没有设置密码,因此当您su作为普通用户时,必须提供目标用户的密码。sudo -i然后su nobody从root shell(不需要密码)尝试。
2013年

2
Network File System映射rootnobody本地根无法像远程根可以那样访问所有内容。
Sylwester

1
@RaduRădeanu请注意编辑历史记录。当我测试原始命令(不是那里的命令)时,最初是在破折号(/ bin / sh)外壳中结束的,但现在无法复制。您的原始编辑很好。不是我更改了它。
奥利(Oli)

1
我一直认为nobodyNFS实际上/主要是作为linuxstandardbase状态使用的。
dgonzalez,

29

在许多Unix变体中,“ nobody”是用户帐户的常规名称,该用户帐户不拥有文件,没有特权组并且除所有其他用户具有的能力外没有其他功能。

通常,不要以任何人(尤其是服务器)身份运行守护程序,以限制获得控制它们的恶意用户可能造成的损害。但是,如果像这样运行多个守护程序,则会降低该技术的实用性,因为如果获得对一个守护程序的控制权,则将提供对所有这些守护程序的控制权。原因是没有人拥有的进程能够相互发送信号甚至相互调试,从而允许它们读取甚至修改彼此的内存。

信息来自http://en.wikipedia.org/wiki/Nobody_(用户名)


-1:nobody严格用于NFS,不应由其他服务使用,当然也不应由系统管理员使用。谢谢。
萨尔诺德

22

用户nobody只保留给NFS。

上面的答案非常错误,因为它们假定这nobody是一个“通用”匿名/来宾风格的用户ID。

在UNIX / Linux访问控制模型中,不存在匿名/来宾风格的用户ID,这是错误的建议:

  • 共同运行的守护程序为nobody,特别是服务器,以限制可能由谁获得了他们的控制恶意用户可能造成的损害。 ”因为是如下:“ 然而,这项技术的有用性,如果超过减少这样运行一个守护程序,因为如果获得对一个守护程序的控制权,则将全部控制它们
  • 一个真实的例子是memcached(一个键值内存缓存/数据库/事物),它位于我的计算机上,我的服务器在该nobody帐户下运行。为什么?因为它不需要任何权限就可以给它拥有对文件的写访问权的帐户只是不必要的风险。

nobody创建并保留了具有用户ID 65534 的用户名用于特定目的,并且仅应将其用于该目的:作为NFS树导出中“未映射”用户和用户ID的占位符。

也就是说,除非为NFS树导出设置了用户/标识映射,否则导出中的所有文件将显示为所拥有nobody。这样做的目的是防止导入系统上的所有用户访问这些文件(除非他们具有“其他”权限),因为它们(除之外root)都不能成为/ become nobody

因此,将其nobody用于任何其他用途是一个非常糟糕的主意,因为其用途是成为任何人都不能访问的文件的用户名/用户ID。

Wiki条目也是非常错误的。

UNIX / Linux的做法是为每个需要单独访问控制域的“应用程序”或应用程序区域创建一个新帐户,并且永远不要nobody在NFS之外重用


此答案未引用任何来源,并且与其他确实引用来源的答案相矛盾。目前的赏金表明这个答案特别好,在这种情况下,它应该引用一些消息来源,或者列出一些理由。
vidarlo


@ mook765那部分很好。但是,关于NFS的段落,我并不理解。例如,root_squashon root映射到user nobody,因此拥有所有者的文件nobody绝对没有意义。另外,由于在UNIX中文件权限与所有权是分开的,因此声明没有人拥有的文件意味着任何人都无法访问的说法毫无意义。我并不是说答案中的所有内容都是错误的,只是它的元素对我而言几乎没有意义:)
vidarlo

1
@vidarlo,此答案并不建议您将文件设置为nobody。它告诉您nobodyNFS在映射权限时要使用,这对我来说是最重要的一点。如何 NFS使用nobody比事实不感兴趣使用nobody。谢谢。
萨诺德

在我看来,@ sarnold的答案在这件事上仍然是完全错误的。如果用户阅读了答案和man exports,他可能会很困惑。
vidarlo

17

nobody用户默认情况下,在全新安装(在Ubuntu桌面13.04检查)创建的。

在许多* nix变体中,nobody是用户帐户的常规名称,该用户帐户不拥有文件,不具有特权组并且除其他用户具有的能力之外没有其他功能(该nobody用户和组在/etc/sudoers文件中没有任何条目) 。

通常,将守护程序作为nobody,特别是服务器运行,以限制由控制它们的恶意用户可能造成的损害。但是,如果像这样运行多个守护程序,则会降低该技术的实用性,因为如果获得对一个守护程序的控制权,则将提供对所有这些守护程序的控制权。原因是nobody拥有的进程能够相互发送信号,甚至相互调试,从而允许它们读取甚至修改彼此的内存。

来源维基百科-没人(用户名)


nobody股权的过程中能够将信号发送到每个人,甚至PTRACE在Linux中对方,这意味着没有人拥有的进程可以读取和写入另一个人拥有的进程的内存。

这是文件中nobody用户的示例条目/etc/passwd

alaa@aa-lu:~$ grep nobody /etc/passwd
nobody:x:65534:65534:nobody:/nonexistent:/bin/sh

您可能会注意到,nobody用户具有/bin/sh登录外壳程序和/nonexistent主目录。顾名思义,/nonexistent默认情况下该 目录不存在。

如果您偏执狂,则可以将nobody的默认shell 设置为 /usr/sbin/nologin等等,从而拒绝nobody用户的ssh登录。

来源LinuxG.net-Linux和Unix没人用户


如果从Wikipedia中删除了不正确的段落,则此答案应为+1。谢谢。
萨尔诺德

3

没有人是特殊的用户和组帐户。因为它是一个实际的用户名(和组名),并且可以供进程甚至用户使用,所以它实际上不是。例如,某些Apache配置没有任何人作为拥有网站文件和目录的用户/组。当多个进程可能使用无人用户(例如NFS目录和Web服务器)时,就会出现问题。


0

对' 细微修改' 用户nobody只保留给NFS。回答。此时,该nobody用户还用于具有绑定安装的非特权容器。

这取自systemd-nspawn,特别是--bind挂载选项:

请注意,当此选项与--private-users结合使用时,生成的安装点将归nobody用户所有。这是因为装载及其文件和目录继续由相关的主机用户和组拥有,而这些主机用户和组在容器中不存在,因此显示在通配符UID 65534(没人)下。如果创建了这样的绑定安装,建议使用--bind-ro =将它们设置为只读。

systemd-nspawn

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.