管理 ssh 密钥的最佳系统?

sla*_*acy 42 ssh authentication

我有几台客户端计算机(即笔记本电脑、台式机等),我连接到我管理的几台服务器计算机,并通过 SSH 登录到它们。我可以想象几种有意义的 ssh 密钥管理方案,我很好奇其他人的做法。

选项 1:一个全局公钥/私钥对。

我会生成一个公钥/私钥对,并将私钥放在每台客户端机器上,将公钥放在每台服务器机器上。

选项 2:每台服务器机器一个密钥对。

我会在每台服务器机器上生成一个密钥对,并将每个私钥放在我的客户端机器上。

选项 3:每台客户端机器一个密钥对。

每台客户端机器都有一个唯一的私钥,每台服务器机器都有我想要连接的每台客户端机器的公钥。

选项 4:每个客户端/服务器对一个密钥对

完全落伍了?

这些中哪个最好?还有其他选择吗?您使用什么标准来评估正确的配置?

dwc*_*dwc 33

我使用选项 3:每台客户端机器一个密钥对,这对我来说最有意义。以下是一些原因:

  • 如果客户端受到威胁,则需要从服务器中删除该密钥(并且仅该密钥)。
  • 它足够灵活,可以决定我可以从哪里访问什么,而无需授予所有客户端对所有服务器的全面访问权限。
  • 很方便。ssh-add 只有 1 个密钥,没有混淆。
  • 通过选项 4易于设置和管理

选项 4不错,但工作量太大。选项 3可以让您轻松完成 98% 的工作。

  • 我看不出选项 4 的意义。它没有任何意义。 (4认同)

Jer*_*use 28

我使用了一个稍微复杂一点但非常通用的解决方案,因为我想在用于我的家庭网络服务器、办公室服务器、咨询客户端网络服务器和我拥有帐户的其他各种系统的 SSH 身份密钥中保持一些分离。

既然说我几乎完全在 Linux 工作站上工作,所以我有一个使用 LUKS 加密和我的 X11 窗口管理器以及 HAL 守护程序设置的 USB 密钥,可检测 LUKS 加密驱动器并在插入时提示输入解密密码并尝试安装。通过以我的方式将其存储在加密驱动器上,我永远不会将我的 SSH 密钥存储在任何工作站上。

然后我的~/.ssh/config文件中有以下配置:

Host *
    Protocol 2
    IdentityFile %d/.ssh/keys.d/id_rsa.%l
    IdentityFile %d/.ssh/keys.d/id_dsa.%l
    IdentityFile %d/.ssh/keys.d/%u@%l
Run Code Online (Sandbox Code Playgroud)

%d转换为可通过OpenSSH的用户的主目录,并在的〜/ .ssh目录中,我创建keys.d作为一个符号链接的目录路径加密的USB驱动器上,当它被正确安装。

%L表达被转换为本地客户机的主机名和%U将被转换为本地客户端的用户名。

此配置的作用是允许 SSH 使用 3 种不同的表达式查找密钥。例如,如果我的本地客户端的用户名是jdoe,我的本地客户端机器名称是examplehost,它将按以下顺序查找,直到找到一个既存在又被远程服务器接受的密钥。

/home/jdoe/.ssh/keys.d/id_rsa.examplehost
/home/jdoe/.ssh/keys.d/id_dsa.examplehost
/home/jdoe/.ssh/keys.d/jdoe@examplehost
Run Code Online (Sandbox Code Playgroud)

您甚至可以使用%r表达式来查找特定于远程服务器用户名的密钥或%h用于远程服务器主机名,就像使用%u%l一样。

更新:现在我实际上使用 GnuPG gpg-agent 与 ssh-agent 兼容性来读取和使用我的 OpenPGP v2 智能卡上的身份验证密钥。


Dav*_*d Z 6

我会消除您的两个选项 1(我怀疑其中一个应该是选项 2 ;-),因为私钥是敏感数据,将它们保存在尽可能少的地方是有意义的。我个人永远不会将私钥从一台计算机复制到另一台计算机(甚至从一个文件复制到同一台计算机上的另一个文件),除非可能用于备份。尽管与大多数加密密钥不同,如果 SSH 密钥丢失,这并不是世界末日(只需创建一个新密钥,您就不会丢失任何数据)。