安全方法
知道自己的基础设施和独特情况后,你就需要制定一项密钥管理方案,帮助你指导如何分发和存储密钥。比如说,正如前文所述,如果我的平板电脑被偷,但愿平板电脑被用来访问服务器之前,我可以从服务器上废除公钥。正因为如此,我在总体计划中需要考虑到下列情况:
1. 私钥存放在移动设备上没关系,但是它们必须包通行码。
2. 必须有一种方法可以从服务器迅速废除公钥。
在你的情况下,你可能决定根本不想要为频繁登录的系统使用通行码;比如说,系统可能是开发人员每天登录好多次的测试机器。那很好,但是那样的话你就需要稍微调整一下规则。你可能要添加一条规则,规定不得从移动设备登录进入到该机器。换句话说,你需要根据自己的情况来制定规程,而不是想当然地认为有一应俱全的做法。
软件
再来说说软件。奇怪的是,没有许多优秀而可靠的软件解决方案用来存储和管理你的私钥。考虑这一点:如果有一款软件为你的所有服务器存储所有密钥,该软件又由一个快捷密码所保护,你的密钥果真安全吗?或者类似的是,如果你的私钥放在硬驱上以便SSH软件快速访问,密钥管理软件果真提供得了任何保护吗?
但是就整个基础设施和创建及管理公钥而言,还是有一些解决方案。我已经提到了Puppet。在Puppet界,你可以创建模块,以不同的方式来管理服务器。其想法在于,服务器是动态的,未必是彼此的精确副本。这里有一种巧妙的方法:http://manuel.kiessling.net/2014/03/26/building-manageable-server-infrastructures-with-puppet-part-4/,在不同服务器上使用同一密钥,但是为每个用户使用不同的Puppet模块。这种解决办法可能适合你,也可能不适合你。
或者,另一种办法就是完全改弦易辙。在Docker界,你可以采取一种不同的方法,关于SSH和Docker的这篇博文作了详细介绍:http://blog.docker.com/2014/06/why-you-dont-need-to-run-sshd-in-docker/。
但是管理私钥怎么样?如果你搜索一下,找不到许多软件方案,我在上面提到了原因;私钥放在你的硬驱上,管理软件可能无法提供太多的额外安全。但是我确实使用这种方法来管理密钥:
首先,我在.ssh/config文件中有多个Host项。我有一个项用于登录的主机,但是有时候我有多个项用于单个主机。如果我要多次登录,就会出现这种情况。我有两种不同的机制来登录托管git软件库的那台服务器;一种完全用于git,另一种用于一般用途的bash访问。用于git的那种登录大大限制了那台机器上的权限。还记得我前面说的放在远程开发机器上的git密钥吗?虽然那些密钥可以用来登录进入到我的其中一台服务器,但使用的帐户受到了严重限制。
其次,大多数这些私钥包括通行码。(如果遇到非要多次输入通行码,可以考虑使用ssh-agent。)
第三,我确实有一些服务器想更认真一点地得到保护,我在Host文件中没有对应的项。这更像是社会工程学层面,因为密钥文件仍在那里,但是需要入侵者花更长一点的时间来找到密钥文件,弄清楚对哪台机器下手。那种情况下,我只要手动输入长长的ssh命令(这其实不是那么差劲)。
你能看到,我并不使用任何特殊软件来管理这些私钥。
没有一应俱全的做法
我们偶尔会接到读者抛出的问题,问有什么好的软件可用于管理密钥。但是不妨先冷静想一想。这个问题其实需要用不同的方式来表达,因为根本不存在一应俱全的解决方案。你应该根据自己的情况提出问题。你只是试图找个地方来存储密钥文件?还是在寻找一种办法来管理多个用户,每个用户有各自的公钥,这些公钥又需要插入到authorized_keys文件?
我在这篇文章中介绍了基本方面,但愿现在你能明白,只有你提出了正确的问题,才知道如何管理密钥,以及应该寻找什么样的软件(如果你果真需要额外软件的话)。
英文:How to Best Manage Encryption Keys on Linux
(责任编辑:安博涛)