Linux的ssh:允许公钥authentication,而不授予用户对私钥的读取权限

login到我的Linux服务器上的用户应该能够使用默认帐户ssh到特定的远程机器。 远程机器上的validation使用公钥,因此在服务器上相应的私钥是可用的。

我不希望服务器用户真正能够读取私钥。 基本上,他们有权访问服务器的事实允许他们正确的SSH,并从服务器中删除他们也应该禁止连接到远程机器。

我怎样才能允许用户打开一个SSH连接,而不给他们读取访问私钥?

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

  • 这是一个好方法吗?
  • 我应该如何执行前进?
  • 用户如何启动连接(即用户对密钥具有读权限的情况下执行ssh)?
  • 有没有安全漏洞? – 如果用户可以作为另一个用户执行ssh,那么他们可以做其他用户可以做的所有事情(包括读取私钥)吗?

这是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命令,而不必在运行时input自己的密码(或some_uid帐户的密码):

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

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

这对于基于主机的authentication来说似乎是一个很好的用例。 这是一种身份validation方法,SSH不会在本地计算机(在这种情况下是您的服务器)上使用单个用户的密钥进行身份validation; 而是使用主机的私钥,即存储在/etc/ssh/的私钥,只能由root读取。

要进行设置,您需要在远程计算机上,在您希望用户login的用户的主目录(不在~/.ssh )中创build一个名为.shosts的文件。 该文件应该有内容

 server-hostname + 

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

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

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

一旦你设置了这些步骤,你可以完全删除服务器上的私钥,如果你不需要它的话。 (如果你这样做,你可以将它设置为只能被root或者其他东西读取。)

您也可以轻松地做某些事情,如允许或拒绝某些用户访问远程计算机。 有关详细信息,请参阅sshhosts.equiv的手册页。

此设置的一个问题是login到远程计算机的用户可以修改.shosts 。 没有任何事情可以让他们以不同的用户身份login到远程机器,但他们可以切断自己或他人对远程机器的访问。 如果这是一个问题,你可能可以使.shosts只能写入root或其他东西 – 我不知道这是否工作,但你可以试试看。 (像sudo这样的其他方法容易受到同样的风险,因为用户总是可以删除~/.ssh/authorized_keys 。)