为 SSH 设置公钥身份验证后是否应该删除用户密码?

为 SSH 设置公钥身份验证后是否应该删除用户密码?

最好使用 SSH 公钥。所以我的sshd_configPasswordAuthentication no

有些用户从不登录,例如使用 shell 的 sftp 用户/usr/sbin/nologin。或者系统帐户。

所以我可以创建这样一个没有密码的用户adduser gary --shell /usr/sbin/nologin --disabled-password

这是一个好/坏主意吗?是否有我没有考虑到的后果?

答案1

如果您拥有服务器的 root 访问权限,并且可以为您的用户重新生成 ssh 密钥,以防他们丢失

你确定一个用户(作为一个人)不会有多个用户帐户他们需要在 SSH 会话之间切换(好吧,他们也可以打开多种的SSH 会话(如果需要)

他们会绝不需要“物理”(通过键盘+显示器或通过虚拟机的远程控制台)访问服务器

没有用户具有密码控制的sudo访问权限(即他们根本没有 sudo 访问权限,或者具有 sudo 访问权限NOPASSWD

我想你会很好的。

我们工作中的许多服务器都是这样配置的(只有一些帐户需要通过 vmware 远程控制台访问虚拟机,其他帐户仅通过 SSH 和 pubkey 身份验证进行连接)。

答案2

这个问题最初提到passwd --delete <username> 这是不安全的: 这样,中的加密密码字段/etc/shadow将完全为空。

username::...

如果您已经配置了sshd拒绝密码身份验证,那么使用 SSH 是安全的...但是如果任何其他您系统上的服务使用密码身份验证并且未配置为拒绝空密码,这无需密码即可访问!你不想要这个。


adduser --disabled-passwd将生成一个/etc/shadow条目,其中加密的密码字段只是一个星号,即

username:*:...

这是“永远无法成功输入的加密密码”,即这意味着该帐户有效并且技术上允许登录,但它通过密码进行身份验证不可能成功。因此,如果您的服务器上有任何其他基于密码身份验证的服务,则该用户将被阻止使用它们。

对于该用户以及使用该系统中的系统密码文件的任何服务,只有使用标准帐户密码(例如 SSH 密钥)以外的身份验证方法才有效。当您需要一个只能使用 SSH 密钥登录的用户时,这就是您想要的。

如果需要将现有帐户设置为该状态,可以使用以下命令:

echo 'username:*' | chpasswd -e

加密密码字段还有第三个特殊值:adduser --disabled-login,则该字段将仅包含一个感叹号。

username:!:...

与星号一样,这使得密码身份验证不可能成功,但它还有一个额外的含义:它将密码标记为对某些管理工具“锁定”。passwd -l通过在现有密码散列前添加感叹号来达到相同的效果,这再次使得密码身份验证无法使用。

但对于粗心的人来说,这里有一个陷阱: passwd2008年,来自旧软件包的命令版本被更改,从“锁定帐户”shadow重新定义为“锁定密码”。passwd -l声明的原因是“为了与其他 passwd 版本兼容”。

如果你(像我一样)很久以前就知道了这一点,这可能会让人大吃一惊。对于那些adduser(8)显然还没有意识到这种区别的事情来说,这也没有什么帮助。

禁用的部分帐户对于所有身份验证方法,实际上是将帐户的到期日期值设置为 1:usermod --expiredate 1 <username>。 2008 年之前,passwd -l源自shadow用于执行此操作的源套件此外在密码前添加感叹号 - 但不再这样做。

Debian 软件包变更日志说:

  • debian/patches/494_passwd_lock-no_account_lock:恢复 passwd -l 之前的行为(在 #389183 中更改):仅锁定用户的密码,而不锁定用户的帐户。还明确记录差异。这将恢复以前版本的 passwd 和其他实现的常见行为。关闭:#492307

错误历史记录Debian 错误 492307错误 389183可能有助于理解这背后的想法。

相关内容