Linux ssh:允许公钥身份验证而不授予用户对私钥的读取权限

Phi*_*ipp 14 linux permissions ssh public-key

登录到我的 Linux 服务器上的用户应该能够使用默认帐户通过 ssh 连接到特定的远程机器。远程机器上的认证使用公钥,所以在服务器上有相应的私钥可用。

我不希望服务器用户实际上能够读取私钥。基本上,他们有权访问服务器这一事实允许他们拥有 ssh 权限,并且将他们从服务器中删除也应该禁止连接到远程机器。

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

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

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

HBr*_*ijn 31

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

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

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

sudo -u some_uid /usr/bin/ssh -i /home/some_uid/.ssh/remote-host.key username@remotehost
Run Code Online (Sandbox Code Playgroud)

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


Dav*_*d Z 10

这似乎是基于主机的身份验证的一个很好的用例。这是一种身份验证方法,其中 SSH 不使用本地计算机(在本例中为您的服务器)上的单个用户的密钥进行身份验证;相反,它使用主机的私钥,该私钥存储在/etc/ssh/并且只能由 读取root

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

server-hostname +
Run Code Online (Sandbox Code Playgroud)

whereserver-hostname是您的服务器的名称,+是一个文字加号,用作通配符,意思是“任何用户”。

您还需要确保远程机器可以验证服务器的主机密钥,这意味着服务器的主机密钥需要在远程机器中/etc/ssh/ssh_known_hosts~/.ssh/known_hosts远程机器上列出。如果还不是这种情况,您可以通过登录远程机器并运行来设置它

ssh-keyscan server-hostname >> /etc/ssh/ssh_known/hosts
Run Code Online (Sandbox Code Playgroud)

设置完这些步骤后,如果您不需要其他任何东西,就可以完全删除服务器上的私钥。(如果你这样做了,你总是可以将它设置为只能被root其他人读取。)

您还可以轻松执行诸如允许或拒绝某些用户访问远程计算机之类的操作。见手册页sshhosts.equiv详细信息。

这种设置的一个问题是登录到远程机器的用户可以修改.shosts. 他们无法做任何事情来允许他们以不同的用户身份登录到远程机器,但他们可以切断自己或其他人对远程机器的访问。如果这是一个问题,您可能.shosts只能将其设置为可写root或其他东西 - 我不确定这是否有效,但您可以尝试一下看看。(其他方法像 withsudo一样容易受到同样的风险,因为用户总是可以删除~/.ssh/authorized_keys。)