/bin/false
来禁用用户帐户。但是,在我现有的Linux系统上,我看到大量现有帐户(所有服务帐户)都使用/sbin/nologin
的外壳。我从手册页中看到
/sbin/nologin
打印一条消息向用户说该帐户已被禁用,然后退出。大概/bin/false
不会打印任何内容。我还看到
/sbin/nologin
中列出了/etc/shells
,而/bin/false
中没有列出。手册页说FTP将禁止具有以下内容的用户访问一个在
/etc/shells
中未列出的shell,表示其他程序也可以这样做。这是否意味着有人可以使用以/sbin/nologin
作为外壳的帐户进行FTP登录?这里有什么区别?我应该使用其中哪一个来禁用用户帐户,在什么情况下?
/etc/shells
中的列表还会产生什么其他影响?#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
评论
unix.stackexchange.com/questions/10852/…作为有效的一般信息。我是从系统管理的角度专门考虑的。
只是作为背景。