Linux ssh:允许公钥认证,但不授予用户读取私钥的权限

Linux ssh:允许公钥认证,但不授予用户读取私钥的权限

登录到我的 Linux 服务器的用户应该能够使用默认帐户 ssh 到特定的远程计算机。远程计算机上的身份验证使用公钥,因此服务器上有相应的私钥可用。

我不希望服务器用户真正能够读取私钥。基本上,他们有权访问服务器的事实使他们拥有 ssh 权限,将他们从服务器中删除也应该禁止连接到远程计算机。

我如何允许用户打开 ssh 连接但不授予他们对私钥的读取权限?

我目前的想法是:显然,ssh 可执行文件必须能够读取私钥,因此它必须在服务器上具有这些权限的另一个用户下运行。建立 ssh 连接后,我就可以将其“转发”给用户,以便他可以输入命令并与远程计算机交互。

  • 这是一个好方法吗?
  • 我该如何实现转发?
  • 用户如何发起连接(即由对密钥有读取权限的用户执行 ssh)?
  • 是否存在安全漏洞? - 如果用户可以以另一个用户的身份执行 ssh,那么他们可以做其他用户可以做的所有事情(包括读取私钥)吗?

答案1

这是存在的原因之一sudo。只需允许您的用户仅使用预授权的命令行选项运行 1 个命令,即可解决大多数明显的规避问题。例如

#/etc/sudoers
%users ALL = (some_uid) NOPASSWD: /usr/bin/ssh -i /home/some_uid/.ssh/remote-host.key username@remotehost

设置sudo以便组内的所有成员都users可以以用户 some_uid 的身份运行 ssh 命令,而无需在运行时输入自己的密码(或 some_uid 帐户的密码):

sudo -u some_uid /usr/bin/ssh -i /home/some_uid/.ssh/remote-host.key username@remotehost

删除NOPASSWD:强制用户在登录远程主机之前输入自己的密码的选项。
可能设置一个别名或包装脚本以方便用户,因为sudo对于使用正确的参数非常挑剔。

答案2

这似乎是基于主机的身份验证的一个很好的用例。这是一种 SSH 不使用个人身份验证的方法用户本地机器(在本例中为你的服务器)上的密钥进行身份验证;相反,它使用主持人的私钥,存储在 中/etc/ssh/,只有 可读root

要进行此设置,您需要.shosts在远程计算机上创建一个名为的文件,位于您希望人们以该用户身份登录的用户的主目录中(而不是~/.ssh)。该文件应包含以下内容

server-hostname +

其中,server-hostname是您的服务器的名称,+是一个文字加号,用作通配符,表示“任何用户”。

您还需要确保远程计算机可以验证服务器的主机密钥,这意味着服务器的主机密钥需要在远程计算机上列出。如果尚未这样做,您可以通过登录远程计算机并运行以下命令进行/etc/ssh/ssh_known_hosts设置~/.ssh/known_hosts

ssh-keyscan server-hostname >> /etc/ssh/ssh_known/hosts

完成这些步骤后,如果不再需要私钥,则可以将其从服务器上彻底删除。(如果需要,您可以随时将其设置为仅可由root他人读取。)

您还可以轻松执行允许或拒绝某些用户访问远程计算机等操作。有关详细信息,请参阅ssh和的手册页hosts.equiv

此设置的一个问题是,登录到远程计算机的用户可以修改.shosts。他们无法以其他用户身份登录到远程计算机,但他们可以切断自己或他人对远程计算机的访问。如果这是一个问题,您可能能够将 设置.shosts为仅可写root或类似的东西 - 我不确定这是否有效,但您可以尝试一下看看。(其他方法(例如 的方法)sudo也容易受到同样的风险,因为用户总是可以删除~/.ssh/authorized_keys。)

相关内容