管理 ssh 密钥的最佳系统?

管理 ssh 密钥的最佳系统?

我拥有多台客户端计算机(即笔记本电脑、台式机等),并且连接到我管理的几台服务器计算机,并通过 SSH 登录到所有服务器。我可以想象出几种管理 ssh 密钥的合理方案,我很好奇其他人会怎么做。

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

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

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

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

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

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

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

太过分了吗?

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

答案1

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

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

选项 4很好,但是工作量太大了。选项 3让您轻松实现 98% 的目标。

答案2

我使用的解决方案稍微复杂一些,但用途非常广泛,因为我想在我的家庭网络服务器、办公服务器、咨询客户网络服务器和我有帐户的其他各种系统上使用的 SSH 身份密钥之间保持一定的分离。

既然我几乎只在 Linux 工作站上工作,所以我有一个使用 LUKS 加密设置的 USB 密钥,并且我的 X11 窗口管理器以及 HAL 守护进程会检测 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

%日被 OpenSSH 转换为用户的主目录,并且在〜/.ssh我已经创建的目录键.d当正确安装时,作为加密 USB 驱动器上的目录路径的符号链接。

%升表达式被翻译为本地客户端机器的主机名和%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

你甚至可以使用%r表达式来查找特定于远程服务器用户名的密钥或%H对于远程服务器主机名,就像%u%升被使用。

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

答案3

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

答案4

选项 3。

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

相关内容