/ sbin / nologin和/ bin / false之间有什么区别?


69

我经常听到它建议通过将其shell设置为来禁用用户帐户/bin/false。但是,在我现有的Linux系统上,我看到大量的现有帐户(所有这些帐户都是服务帐户)使用的是Shell /sbin/nologin

我从手册页看到,该页/sbin/nologin面向用户显示一条消息,指出该帐户已被禁用,然后退出。大概/bin/false不会打印任何东西。

我还看到/sbin/nologin列出了/etc/shells,而/bin/false没有列出。

手册页说,FTP将禁止外壳在其中列出的用户访问,/etc/shells并暗示其他程序也可以这样做。这是否意味着某人可以使用具有/sbin/nologin外壳程序的帐户登录FTP ?

这里有什么区别?我应该使用其中哪一个来禁用用户帐户,在什么情况下?商家信息/etc/shells有什么其他影响?



1
作为有效的一般信息。我是从系统管理的角度专门考虑的。
迈克尔·汉普顿

只是作为背景。
dmourati

Answers:


70

/bin/false是一个实用程序,是的附属程序,/bin/true从某种抽象意义上讲,它可以确保unix功能完整。但是,已经发现这些程序的紧急用途。考虑一下BASH语句/some/program || /bin/true$? = 0无论返回,它始终将布尔值评估为true()/some/program

/bin/false如所确定的,紧急使用用作不允许登录的用户的空外壳。在这种情况下,系统的行为将与外壳无法运行一样。

POSIX(尽管我可能是错的,而且可能是SUS)限制了这两个命令除了返回适当的布尔值外什么也不做。

/sbin/nologin是一个BSD实用程序,其行为类似于/bin/false(返回boolean false),但也打印输出,这/bin/false是禁止的。尽管实际上在外壳终止时,许多终端仿真器将简单地关闭,这在某些情况下使消息几乎始终无法读取,但这可以帮助用户理解发生了什么。

很少有目的上市/sbin/nologin/etc/shells。的标准作用/etc/shells是列出chsh用户更改自己的shell时允许使用的程序(并且没有可信的理由将自己的shell更改为/sbin/nologin)。超级用户可以将任何人的外壳更改为任何东西。但是,您可能要在/sbin/nologin/bin/false中都列出/etc/rsh,这将禁止具有这些shell的用户chsh在不幸的情况下使用它们来更改shell。

FTP守护程序可能不允许使用不在/ etc / shells中的shell的用户访问,或者它们可以使用他们希望的任何其他逻辑。在任何情况下都应避免运行FTP,因为sftp(提供相似的功能)相似但安全。某些站点用于/sbin/nologin禁用外壳程序访问,同时通过将sftp允许访问来禁用它/etc/shells。如果允许用户创建cronjob,则可能会打开后门。

无论哪种情况,scp都不会在无效的shell中运行。 scponly在这种情况下可以用作外壳。

另外,外壳的选择会影响su -(AKA su -l)的操作。特别是,/sbin/nologin如果是外壳,则将输出输出到stdout;情况并非如此/bin/false。无论哪种情况,使用命令运行su -cl都会失败。

最后的答案:

要禁用帐户,请不要依赖于这两种方法,而应将shell设置为/sbin/nologin出于参考目的(除非/sbin/nologin位于中/etc/shells,此时应使用/bin/false,不应使用)。而是将密码字段设置/etc/passwd!,以确保crypt没有密码有效。考虑/etc/shadow以相同的方式设置哈希以避免错误。 passwd -l将为您做到这一点。

禁用帐户的第三种方法是将帐户到期日期字段设置为古代日期(例如usermod --expiredate 1)。万一您的设置允许用户在不使用密码的情况下通过其unix帐户进行身份验证并且所使用的服务不需要外壳程序,这将防止登录。


9
虽然这个答案总结完美的不同选择(和回答了这个问题),我觉得有必要指出这个用例一个有用的资源,这是可以至少在股票Debian仓库,在titantools包:noshell。该伪外壳程序提供了审核功能,可以将使用帐户noshell作为外壳程序的日志记录到syslog ,同时仍然禁止访问。
dawud

1
它绝不是伪造的,但实际上在某个特定年份(咳嗽)的系统管理员中很普遍,它/bin/false用作不应该登录的用户的登录外壳
。– MadHatter

2
在某种意义上说它不是最初的预期用途。我不是说过时的。我每天都看到它:)
Falcon Momot 2013年

1
用无效的密码禁用帐户在ssh中不能很好地工作。如果用户以前设法设置了公共密钥身份验证,则无论如何他都可以进入。
joshudson 2014年

3
记录sshd可以检查以某些方式锁定的帐户(特别是提到了以!开头的密码哈希),即使使用pubkey auth也是如此。
Falcon Momot 2014年

13

在对此进行了一些研究之后,您使用的方法取决于您必须锁定的内容。如果用户使用此设置登录到Shell,那么他们将收到一条消息,显示为This account is currently unavailable.注意:您可以通过/etc/nologin.txt至少在RHEL派生文件上创建文件来更改此设置。

如您所知/bin/false不是shell。它们的工作方式是返回false,在二进制退出后立即注销。注意,/bin/true将达到相同的效果。

关于您的FTP问题:是的,您的正确做法是将shell设置为,/sbin/nologin将允许用户同时登录FTP /bin/false/bin/true完全阻止用户登录任何服务。

因此,/bin/false/bin/true最好是防止用户登录任何服务,同时/sbin/nologin仍将允许用户登录SSH或本地控制台以外的服务,同时向用户提供该帐户处于非活动状态且仅在SSH /本地时最好使用的反馈。控制台需要锁定。


2

嗯,有人试图证明/ bin / false会禁止FTP访问吗?

我只是将用户的shell更改为/ bin / false,并且能够正常进行FTP传输。

我使用/ dev / null 完全锁定了用户(好吧,除了电子邮件,他们仍然可以POP3)。


你有/etc/shells吗?FTP服务器如何配置?
迈克尔·汉普顿

没有规则说用户需要外壳程序才能登录FTP服务器。
Petter H

它将在某些FTP守护程序上(而不是其他)禁止它。各个功能之间的功能差异很大。经典的实现将禁止访问没有shell的任何人,但这并不意味着所有实现都必须这样做。
Falcon Momot 2013年
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.