pipe理SSH密钥的最佳系统?

我有几台客户端计算机(即笔记本电脑,台式机等),并连接到我pipe理的多台服务器,并通过SSHlogin。 我可以想象出几个pipe理ssh密钥的scheme,而且我很好奇别人的做法。

选项1:一个全球公共/私人密钥对。

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

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

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

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

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

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

完全过度?

哪一个最好? 还有其他的select吗? 你用什么标准来评估正确的configuration?

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

  • 如果客户端受到攻击,那么该密钥(只有该密钥)需要从服务器上删除。
  • 它足够灵活,可以决定我可以从哪里访问,而不用全部访问所有客户端的所有服务器。
  • 很方便。 ssh-add只有一个关键字,不会造成混淆。
  • 方便的设置和pipe理选项4

选项4很好,但工作太多了。 选项3让你有98%的麻烦。

我使用的解决scheme稍微复杂一些,但function非常多,因为我希望在用于家庭networking服务器,办公室服务器,咨询客户端networking服务器和其他各种系统的SSH身份密钥中保持一定的分离。

现在说我从Linux工作站几乎完全工作,所以我有一个使用LUKSencryption安装的USB密钥,我的X11窗口pipe理器和HAL守护进程检测LUKSencryption的驱动器,并提示input解密密码,并尝试被安装。 通过将其存储在encryption驱动器上,我永远不会将我的SSH密钥存储在任何工作站上。

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

 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 

通过OpenSSH将%d转换为用户的主目录,并在〜/ .ssh目录中创build了keys.d,作为encryptionUSB驱动器上的目录path的符号链接。

%lexpression式被翻译成本地客户机主机名, %u将被翻译成本地客户机的用户名。

这个configuration的作用是允许SSH使用3个不同的expression式来查找关键字。 例如,如果我的本地客户端的用户名是jdoe而我的本地客户端机器名是examplehost ,它将按以下顺序查找,直到find一个既存在又被远程服务器接受的密钥。

 /home/jdoe/.ssh/keys.d/id_rsa.examplehost /home/jdoe/.ssh/keys.d/id_dsa.examplehost /home/jdoe/.ssh/keys.d/jdoe@examplehost 

甚至可以使用%rexpression式来查找特定于远程服务器用户名的密钥,或者使用%u%l来查找远程服务器主机名的%h

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

我会消除你的select1(其中我怀疑其中一个应该是选项2 ;-),因为私人密钥是敏感的数据,它是有意义的,让他们在尽可能less的地方。 我个人绝不会将私钥从一台计算机复制到另一台计算机(甚至从同一台计算机上的另一台计算机上的另一台计算机上的另一台计算机上),除了备份之外。 虽然与大多数encryption密钥不同,但如果SSH密钥丢失,则不是世界末日(只要创build一个新密钥,就不会丢失任何数据)。

选项3并使用类似Puppet的东西来处理密钥pipe理。

选项3。

这也允许您控制客户端可以访问哪些服务器。 例如,如果客户端X需要访问服务器A和B,但C或D,则只需将其公钥复制到那些主机。