允许没有密码的账户使用 chsh 的正确方法是什么?

允许没有密码的账户使用 chsh 的正确方法是什么?

我希望我正确地表述了这个问题,这是一个有点奇怪的问题。

我有一台 Ubuntu 18.04 主机,上面有许多用户。所有用户都通过 SSH 公钥登录主机上的帐户。所有帐户都没有密码。这意味着/etc/shadow每个用户的条目都是!。(我不要意味着任何账户都有空的密码,这意味着任何人都可以输入用户名,然后在密码提示符下按 Enter 键登录。密码和帐户空的密码是完全不同的东西!)

在这种情况下,用户无法为他们的帐户设置密码,passwd因为更改密码需要输入当前密码,而他们无法输入。这其实没问题。

然而,他们无法做的另一件事是更改他们的 shell,因为这样做需要输入密码,而账户没有密码。

我发现的一个解决方案建议在此行中替换required为:sufficient/etc/pam.d/cshs

# This will not allow a user to change their shell unless
# their current one is listed in /etc/shells. This keeps
# accounts with special shells from changing them.
auth       required   pam_shells.so

这是可行的,但我担心的是:

  1. 我不明白为什么在我的情况下这是可行的,因为用户的 shell 是已经在 中/etc/shells。那么为什么修改这个会突然允许用户无需密码使用呢chsh?(需要明确的是,在所有情况下,用户当前的 shell 和所需的 shell 都列在 中/etc/shells。)
  2. 我不一定希望服务帐户能够更改其自己的特定于服务的 shell,尽管这并不那么重要。

我觉得 PAM 可以以某种更优雅的方式解决这个问题。

答案1

这种改变在某种程度上是有效的,但您首先要担心的是,它在某种程度上是无意中起作用的。PAMrequired身份验证的控件会检查某些内容,然后,如果检查成功,则转到下一个检查。控件sufficient会检查某些内容,如果检查成功(并且之前的检查都没有失败),则 PAM 立即成功。因此,/etc/shells对于您来说,shell 是否在位并不重要。shell 始终存在,检查也始终成功:更改requiredsufficient意味着成功会跳过后面的所有内容,包括密码输入。

因此,为了获得更合理的chsh访问权限,您需要做的就是保留pam_shells.so原样required,然后添加一些其他检查之后,检查内容为sufficient。一些选项包括:

  • 如果用户不是系统用户,则允许无密码更改:(auth sufficient pam_usertype.so isregular请参阅 pam_usertype.so 手册页了解如何决定用户类型)。
  • 如果用户属于该users组,则允许无密码更改:(auth sufficient pam_wheel.so trust group=users改编自这里)。

相关内容