在我的 Linux 服务器上登录的用户应该能够使用默认帐户 ssh 到特定的远程计算机。远程机器上的认证使用公钥,所以在服务器上对应的私钥是可用的。
我不希望服务器用户实际上能够读取私钥。基本上,他们可以访问服务器这一事实允许他们使用 ssh 权限,并且从服务器中删除它们也应该禁止连接到远程计算机。
如何允许用户打开 ssh 连接而不授予他们对私钥的读取权限?
到目前为止我的想法:显然 ssh 可执行文件必须能够读取私钥,因此它必须在具有这些权限的服务器上的另一个用户下运行。建立 ssh 连接后,我可以将其“转发”给用户,以便他可以输入命令并与远程机器交互。
- 这是一个好方法吗?
- 我应该如何实现转发?
- 用户如何发起连接(即对密钥具有读取权限的用户执行 ssh)?
- 是否存在安全漏洞?- 如果用户可以作为另一个用户执行 ssh,那么他们可以做其他用户可以做的所有事情(包括读取私钥)吗?
这是
sudo
存在的原因之一。只需允许您的用户仅使用预先授权的命令行选项运行 1 个命令,即可解决最明显的规避问题。例如设置,
sudo
因此组的所有成员都users
可以在运行时以用户 some_uid 运行 ssh 命令,而无需输入自己的密码(或 some_uid 帐户的密码):删除
NOPASSWD:
强制用户在登录远程主机之前输入自己的密码的选项。可能设置别名或包装脚本以方便您的用户,因为
sudo
对使用正确的参数非常挑剔。这似乎是基于主机的身份验证的一个很好的用例。这是一种身份验证方法,其中 SSH 不使用本地计算机(在本例中为您的服务器)上的单个用户密钥进行身份验证;取而代之的是,它使用主机的私钥,该私钥存储在
/etc/ssh/
其中并且只能由root
.要进行设置,您需要
.shosts
在远程计算机上创建一个名为的文件,该文件位于您希望人们登录的用户的主目录中(而不是~/.ssh
)。该文件应该有内容where
server-hostname
是您的服务器的名称,+
是一个文字加号,用作通配符,意思是“任何用户”。您还需要确保远程计算机可以验证服务器的主机密钥,这意味着服务器的主机密钥需要列在远程计算机中
/etc/ssh/ssh_known_hosts
或~/.ssh/known_hosts
远程计算机上。如果还不是这种情况,您可以通过登录远程计算机并运行来设置它一旦你设置了这些步骤,你可以完全删除服务器上的私钥,如果你不需要它来做其他事情。(如果你这样做了,你总是可以将它设置为只能被其他人读取
root
。)您还可以轻松地执行诸如允许或拒绝某些用户访问远程计算机之类的操作。
ssh
有关详细信息,请参见和的手册页hosts.equiv
。此设置的一个问题是登录到远程计算机的用户可以修改
.shosts
. 他们无法做任何事情来让他们以不同的用户身份登录到远程计算机,但他们可以切断自己或其他人对远程计算机的访问。如果这是一个问题,您可能只能使.shosts
byroot
或其他东西可写 - 我不确定这是否有效,但您可以尝试看看。(其他方法,如 与sudo
一样容易受到同样的风险,因为用户总是可以删除~/.ssh/authorized_keys
。)