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

我从手册页中看到/sbin/nologin打印一条消息向用户说该帐户已被禁用,然后退出。大概/bin/false不会打印任何内容。

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

手册页说FTP将禁止具有以下内容的用户访问一个在/etc/shells中未列出的shell,表示其他程序也可以这样做。这是否意味着有人可以使用以/sbin/nologin作为外壳的帐户进行FTP登录?

这里有什么区别?我应该使用其中哪一个来禁用用户帐户,在什么情况下? /etc/shells中的列表还会产生什么其他影响?

评论

unix.stackexchange.com/questions/10852/…

作为有效的一般信息。我是从系统管理的角度专门考虑的。

只是作为背景。

#1 楼

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

您所标识的/bin/false的紧急使用对于用户而言是空壳,允许登录。在这种情况下,系统将完全像外壳程序无法运行那样运行。

POSIX(尽管我可能错了,可能是SUS)限制了这两个命令的执行

/sbin/nologin是一个BSD实用程序,其行为与/bin/false类似(返回布尔值false),但也打印输出,因为/bin/false被禁止这样做。这样做可以帮助用户理解发生了什么,尽管实际上许多终端仿真器会在shell终止时简单地关闭,在某些情况下反而使消息几乎不可读。 /sbin/nologin中的/etc/shells/etc/shells的标准效果是列出用户更改自己的shell时允许与chsh一起使用的程序(并且没有可信的理由将自己的shell更改为/sbin/nologin)。超级用户可以将任何人的外壳更改为任何东西。但是,您可能希望在/sbin/nologin中列出/bin/false/etc/rsh,这将禁止具有这些shell的用户在不幸的情况下使用chsh更改其shell。

FTP守护程序可能禁止使用不在/ etc / shells中的shell的用户访问,或者它们可以使用他们希望的任何其他逻辑。在任何情况下都应避免运行FTP,因为sftp(提供相似的功能)相似但安全。一些站点使用/sbin/nologin禁用外壳程序访问,同时通过将其放入/etc/shells来允许sftp访问。如果允许用户创建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中的password字段设置为!,由crypt保证该字段对于没有密码有效。考虑以相同的方式在/etc/shadow中设置散列,以避免出现错误。 passwd -l将为您执行此操作。

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

评论


尽管此答案完美地总结了不同的选择(并回答了问题),但我感到有必要为该用例指出一个有用的资源,至少在股票Debian存储库中的titantools软件包:noshell中可以找到该资源。该伪Shell提供了审核功能,将使用noshell作为外壳的帐户记录到syslog的尝试,同时仍然禁止访问。

–dawud
13年6月28日在8:13

它绝不是伪造的,但实际上在一定时期(咳嗽)的系统管理员中很普遍,使用/ bin / false作为不应该登录的人的登录外壳。

– MadHatter
13年6月28日在8:23



从某种意义上说它不是最初的预期用途。我不是说过时的。我每天都看到它:)

–猎鹰Momot
13年6月28日在8:24

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

– joshudson
2014年9月12日19:24

记录sshd可以检查是否以某些方式(即使使用pubkey auth)锁定了以某些方式锁定的帐户(特别提到了以!开头的密码散列)。

–猎鹰Momot
2014年9月13日下午5:14

#2 楼

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

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

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

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

#3 楼

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

我刚刚将用户的shell更改为/ bin / false,并且能够正常使用FTP。

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

评论


您在/ etc / shells中有它吗? FTP服务器如何配置?

–迈克尔·汉普顿
2013年9月1日在2:27

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

–字母H
2013年9月1日在7:49

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

–猎鹰Momot
2013年9月3日在9:38