如何在Linux上最妥善地管理加密密钥?

存储SSH加密密钥和牢记密码可能是一件让人很头痛的事儿。不过遗憾的是,在如今恶意黑客和漏洞猖獗的年头,做好基本的安全防范措施是必不可少的做法。对于许多普通用户来说,这就意味着只是牢记密码,可能还要找到一款存储密码的优秀软件,因为我们提醒普通用户不要每个网站都使用一样的密码。但是对于从事不同IT行业领域的我们这些人来说,我们就需要在此基础上更进一步。我们还要处理SSH密钥之类的加密密钥,而不仅仅是密码。

一种场景如下:我在云上运行一台服务器,用于我的主git软件库。我有好多台办公用的计算机。所有那些计算机都需要登录进入到那台中央服务器,以便推送和获取内容。我设置了git以便使用SSH。git使用SSH时,git登录进入到服务器的方式实际上与启动命令行、使用SSH命令接入到服务器一样。为了配置一切,我在.ssh目录中创建了一个配置文件,里面含有的Host项提供了服务器名称、主机名称、登录用户以及密钥文件路径。然后,我只要输入下列命令,就可以测试一下这个配置:

ssh gitserver

很快我就看到了服务器的bash外壳。现在,我可以配置git,使用这同一个项,用存储的密钥登录进去。容易得很,除了有一个问题:对于用来登录进入到那台服务器的每台计算机而言,我都需要有一个密钥文件。这意味着会有不止一个密钥文件。我在这台计算机上有几个这样的密钥,在其他计算机上有几个这样的密钥。正如普通用户有无数个密码那样,我们IT人员到头来很容易会有无数个密钥文件。这该如何是好?

清理乱局

在开始使用一款软件帮助管理密钥之前,你得做好一些基础工作,弄清楚应该如何处理密钥、我们提出的问题到底是否合理。而这首先需要你明白自己的公钥放在哪里、私钥又放在哪里。假设你已知道下列这些:

1. 公钥与私钥的区别

2. 为什么无法利用公钥生成私钥,但是却可以利用私钥生成公钥。

3. authorized_keys文件的用途以及它放在何处。

4. 你如何使用私钥,登录进入到在authorized_keys文件中有对应公钥的服务器。

这里有个例子。你在亚马逊网络服务(AWS)平台上创建一台云服务器时,就得提供一个SSH密钥,用来连接到你的服务器。每把密钥都有公开部分和私密部分。因为你希望自己的服务器保持安全,乍一看,你似乎把私钥放在那台服务器上,并将公钥贴身带着。毕竟,你不希望那台服务器可以公开访问,不是吗?但其实正好相反。

如何在Linux上最妥善地管理加密密钥?

保管那把私钥,并放在身边,而不是放在某台远程服务器上。

你把公钥放在AWS服务器上,牢牢保管用来登录进入到服务器的私钥。你保管那把私钥,并放在身边,而不是放在某台远程服务器上,如上图所示。

原因如下:即便公钥被别人知道了,他们也无法登录进入到服务器,因为他们没有私钥。此外,如果有人确实设法闯入了你的服务器,他们发现的只是公钥。无法利用公钥生成私钥。所以,如果你在其他服务器上使用同样这个密钥,他们无法用该密钥来登录进入到其他那些计算机。

这就是为什么你把公钥放在自己的服务器上,用来通过SSH登录进入到服务器。私钥是你贴身带着的。你不允许那些私钥落到别人手里。

但是仍然有问题。以我的git服务器为例。我要做几个决定。有时候,我登录进入到托管在别处的开发服务器。在那台开发服务器上,我需要连接到我的那台git服务器。开发服务器如何才能连接到git服务器?通过使用私钥。而这里就存在问题。这种场景需要我把私钥放在托管在别处的服务器上,这么做可能很危险。

现在看看进一步的场景:如果我使用单一密钥登录进入到多台服务器,会怎样?如果入侵者设法弄到了这样一把私钥,他有了该私钥后可以进而访问整个服务器虚拟网络,准备搞一些严重的破坏。这可不是什么好事。

而这当然引出了另一个问题:我是否应该对另外那些服务器使用同一把密钥?就像我刚才描述的那样,这可能很危险。

最后,这听起来一团糟,不过有一些简单的解决办法。不妨逐一介绍。

(注意:除了仅仅登录进入到服务器外,还有许多地方要用到密钥,不过我介绍这一种场景是为了表明你在处理密钥时面临的问题。)

重视通行码

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/2135ffdd4b7b7b66f7092a052599cd40.html