我希望我正确地表述了这个问题,这是一个有点奇怪的问题。
我有一台 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
这是可行的,但我担心的是:
- 我不明白为什么在我的情况下这是可行的,因为用户的 shell 是已经在 中
/etc/shells
。那么为什么修改这个会突然允许用户无需密码使用呢chsh
?(需要明确的是,在所有情况下,用户当前的 shell 和所需的 shell 都列在 中/etc/shells
。) - 我不一定希望服务帐户能够更改其自己的特定于服务的 shell,尽管这并不那么重要。
我觉得 PAM 可以以某种更优雅的方式解决这个问题。
答案1
这种改变在某种程度上是有效的,但您首先要担心的是,它在某种程度上是无意中起作用的。PAMrequired
身份验证的控件会检查某些内容,然后,如果检查成功,则转到下一个检查。控件sufficient
会检查某些内容,如果检查成功(并且之前的检查都没有失败),则 PAM 立即成功。因此,/etc/shells
对于您来说,shell 是否在位并不重要。shell 始终存在,检查也始终成功:更改required
为sufficient
意味着成功会跳过后面的所有内容,包括密码输入。
因此,为了获得更合理的chsh
访问权限,您需要做的就是保留pam_shells.so
原样required
,然后添加一些其他检查之后,检查内容为sufficient
。一些选项包括:
- 如果用户不是系统用户,则允许无密码更改:(
auth sufficient pam_usertype.so isregular
请参阅 pam_usertype.so 手册页了解如何决定用户类型)。 - 如果用户属于该
users
组,则允许无密码更改:(auth sufficient pam_wheel.so trust group=users
改编自这里)。