在我的/etc/passwd
文件中,我可以看到www-data
Apache 使用的用户以及各种系统用户都具有/usr/sbin/nologin
或/bin/false
作为其登录 shell。例如,以下是行的选择:
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin sys:x:3:3:sys:/dev:/usr/sbin/nologin games:x:5:60:games:/usr/games:/usr/sbin/nologin www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin syslog:x:101:104::/home/syslog:/bin/false whoopsie:x:109:116::/nonexistent:/bin/false mark:x:1000:1000:mark,,,:/home/mark:/bin/bash
因此,如果我尝试切换到这些用户中的任何一个(我有时想这样做来检查我对他们的权限的理解,并且可能还有其他至少一半理智的原因),我会失败:
mark@lunchbox:~$ sudo su www-data
This account is currently not available.
mark@lunchbox:~$ sudo su syslog
mark@lunchbox:~$
当然,这并没有太大的不便,因为我仍然可以通过这样的方法为它们启动 shell:
mark@lunchbox:~$ sudo -u www-data /bin/bash
www-data@lunchbox:~$
但这让我想知道什么目的通过拒绝这些用户登录 shell 来提供服务。在互联网上寻找解释,许多人声称这与安全有关,并且每个人似乎都同意更改这些用户的登录 shell 在某种程度上是一个坏主意。以下是引用的集合:
将 Apache 用户的 shell 设置为非交互式的通常是良好的安全实践(实际上,所有不需要交互式登录的服务用户都应该将其 shell 设置为非交互式)。
--https://serverfault.com/a/559315/147556
用户 www-data 的 shell 设置为 /usr/sbin/nologin,并且已设置这是有充分理由的。
--https://askubuntu.com/a/486661/119754
[系统账户]可能是安全漏洞,特别是如果他们启用了 shell:
坏的
bin:x:1:1:bin:/bin:/bin/sh
好的
bin:x:1:1:bin:/bin:/sbin/nologin
--https://unix.stackexchange.com/a/78996/29001
出于安全原因我创建了一个没有登录 shell 的用户帐户来运行 Tomcat 服务器:
# groupadd tomcat # useradd -g tomcat -s /usr/sbin/nologin -m -d /home/tomcat tomcat
--http://www.puschitz.com/InstallingTomcat.html
虽然这些帖子一致认为不向系统用户提供真正的登录 shell 有利于安全,但没有一个帖子能够证明这一说法的合理性,而且我在任何地方都找不到对此的解释。
通过不向这些用户提供真正的登录 shell,我们试图保护自己免受哪些攻击?
答案1
如果您查看nologin
手册页,您将看到以下描述。
摘抄
nologin 显示帐户不可用的消息并以非零值退出。它旨在作为替代 shell 字段来拒绝帐户的登录访问。
如果文件
/etc/nologin.txt
存在,nologin
则向用户显示其内容而不是默认消息。返回的退出代码
nologin
始终为 1。
因此, 的实际意图nologin
只是这样,当用户尝试使用使用该帐户的帐户登录时,/etc/passwd
他们会看到一条用户友好的消息,并且任何尝试使用该帐户的脚本/命令都会被拒绝。此登录收到退出代码 1。
安全
关于安全性,您通常会看到/sbin/nologin
或 有时/bin/false
,以及该领域的其他内容。它们都有相同的目的,但/sbin/nologin
可能是首选方法。无论如何,他们都会限制作为该特定用户帐户对 shell 的直接访问。
为什么这在安全方面被认为是有价值的?
“为什么”很难完全描述,但以这种方式限制用户帐户的价值在于,login
当您尝试使用所述用户帐户获取访问权限时,它会阻止通过应用程序进行直接访问。
使用nologin
or/bin/false
可以实现此目的。限制系统的攻击面是安全领域的一种常见技术,无论是禁用特定端口上的服务,还是限制系统登录的性质。
使用 仍然有其他合理化理由nologin
。例如,scp
将不再使用未指定实际 shell 的用户帐户,如标题为以下的 ServerFault 问答中所述:/sbin/nologin 和 /bin/false 之间有什么区别?。
答案2
毫无疑问,它是出于安全目的。例如,看看下面的漏洞为拥有 shell 的系统用户提交。
我的 debian 服务器由于守护进程帐户具有有效的登录 shell 并打开 samba 进行互联网访问而受到损害。入侵是通过 samba 为守护进程帐户远程设置密码并通过 ssh 登录来实现的。然后一些本地 root 漏洞被用来拥有我的服务器。
我推荐你读一下这篇精彩的文章回答作者是 Gilles,他还提供了一些错误的链接。
Debian 中已针对此问题提交了错误(274229、330882、581899),当前已打开并分类为“愿望清单”。我倾向于同意这些都是错误,系统用户应该将 /bin/false 作为他们的 shell,除非看起来有必要这样做。
答案3
添加@slm和@ramesh的优秀答案:
是的,正如您所指出的,您仍然可以通过sudo
使用定义的 shell 运行来切换到以 nologin 作为默认 shell 的用户,但在这种情况下,您必须:
- 以具有有效 shell 的另一个用户身份登录
- 为该用户配置 sudo 权限以运行
su
命令,并且 - 您的 su 尝试是否已记录到 sudoers 日志(当然假设已启用 sudo 日志记录)。
与普通用户相比,将 nologin 定义为默认 shell 的用户通常拥有更高的权限/能够对系统造成更大的损害,因此让他们无法直接登录可尝试限制系统遭到破坏时可能遭受的损害。
答案4
除了已经给出的出色答案之外,它还有另一个目的。
如果您在服务器上运行 FTP 守护程序,它会检查尝试登录的用户的登录 shell。如果 shell 未在 中列出/etc/shells
,则不允许他们登录。因此,为守护程序帐户提供特殊的 shell 可以防止有人通过 FTP 修改帐户。