我经常听到有人建议将用户帐户的 shell 设置为 来禁用它/bin/false
。但是,在我现有的 Linux 系统上,我发现很多现有帐户(它们都是服务帐户)的 shell/sbin/nologin
都是 。
我从手册页中看到,它/sbin/nologin
会向用户打印一条消息,说明该帐户已被禁用,然后退出。大概/bin/false
不会打印任何内容。
我还看到/sbin/nologin
在中列出了/etc/shells
,但/bin/false
没有列出。
手册页说 FTP 将禁用具有 shell 的用户的访问不是列出/etc/shells
并暗示其他程序也可以这样做。这是否意味着有人可以使用具有作为其 shell 的帐户通过 FTP 进入/sbin/nologin
?
这里有什么区别?我应该使用其中哪一个来禁用用户帐户,以及在什么情况下?列表还有哪些其他效果/etc/shells
?
答案1
/bin/false
是一个实用程序,与 配套/bin/true
,在某种抽象意义上,它有助于确保 unix 功能齐全。然而,这些程序的新兴用途已经发现;考虑 BASH 语句,无论 的返回结果如何/some/program || /bin/true
,它始终会布尔评估为 true ( ) 。$? = 0
/some/program
正如您指出的,的一个紧急用途/bin/false
是作为不允许登录的用户的空 shell。在这种情况下,系统的行为将与 shell 运行失败完全一样。
POSIX(尽管我可能错了并且可能是 SUS)限制这两个命令除了返回适当的布尔值之外不执行任何操作。
/sbin/nologin
是一个 BSD 实用程序,其行为与/bin/false
(返回布尔值 false) 类似,但也会打印输出,这/bin/false
是被禁止的。这是为了帮助用户了解发生了什么,但实际上,许多终端仿真器会在 shell 终止时关闭,在某些情况下导致消息几乎无法读取。
/sbin/nologin
在 中列出没有什么用处/etc/shells
。 的标准效果/etc/shells
是列出chsh
当用户更改自己的 shell 时允许使用的程序(并且没有可信的理由将您自己的 shell 更改为/sbin/nologin
)。超级用户可以将任何人的 shell 更改为任何内容。但是,您可能希望在 中列出/sbin/nologin
和,这将禁止使用这些 shell 的用户在他们不幸获得 shell 时使用 更改他们的 shell 。/bin/false
/etc/rsh
chsh
FTP 守护进程可能会禁止使用 /etc/shells 中没有的 shell 的用户进行访问,或者它们可能会使用它们希望的任何其他逻辑。无论如何都应避免运行 FTP,因为sftp
(提供类似功能)类似但安全。一些站点使用/sbin/nologin
来禁用 shell 访问,同时允许 sftp 访问,方法是将其放入 中/etc/shells
。如果允许用户创建 cronjobs,这可能会打开后门。
在任何一种情况下,scp
都不会使用无效的 shell 进行操作。 scponly
在这种情况下可以用作 shell。
su -
此外,shell 的选择会影响(又称)的操作su -l
。具体来说,如果是 shell, 的输出/sbin/nologin
将打印到 stdout; 则不会出现这种情况/bin/false
。无论哪种情况,使用 运行的命令su -cl
都将失败。
最后,答案是:
要禁用帐户,您应该做三件事。
- 将 shell 设置为
/sbin/nologin
- 将 中的密码字段设置
/etc/passwd
为适合您的 UNIX 的锁定值(!
在 Linux 上为,但*LOCKED*
在 FreeBSD 上为)。除非UsePAM yes
在 中设置了 ,否则这将阻止使用密钥进行 SSH 登录sshd_config
。 - 将帐户到期日期设置为遥远的过去日期(例如
usermod --expiredate 1
)。如果使用 PAM 处理登录,此步骤将阻止使用任何方法进行 SSH 登录。
如果是服务帐户,只需确保其主目录中没有 SSH 授权密钥,并执行上述前两个步骤即可。如果您担心有人可能会为其获取 SSH 证书或其他东西,您可以随时在 和 中列出您的服务帐户DenyUsers
和DenyGroups
组sshd_config
。
答案2
在对此进行一些研究之后,您使用的方法取决于您要锁定的内容。 如果用户使用此项设置登录到 shell,则他们将收到一条消息,显示以下内容:请注意,您至少 This account is currently unavailable.
可以在 RHEL 衍生产品上通过创建文件来更改此设置。/etc/nologin.txt
如您所知,/bin/false
这不是 shell。它的工作方式是返回 false,即在二进制文件退出后立即注销。请注意,这/bin/true
将达到相同的效果。
关于您的 FTP 问题:是的,您说得对,将 shell 设置为/sbin/nologin
将允许用户登录 FTP,而/bin/false
将/bin/true
完全阻止用户登录任何服务。
因此,/bin/false
或/bin/true
最好阻止用户登录任何服务,同时/sbin/nologin
仍允许用户登录 SSH 或本地控制台以外的服务,同时向用户提供帐户处于非活动状态的反馈,并且最好在只需要锁定 SSH/本地控制台时使用。
答案3
嗯,有人尝试证明 /bin/false 不允许 FTP 访问?
我刚刚将我的用户的 shell 更改为 /bin/false,并且能够正常进行 FTP 操作。
我使用 /dev/null 来完全地锁定用户(嗯,除了电子邮件,他们仍然可以使用 POP3)。