你在创建密钥时,可以选择添加通行码(passphrase),使用私钥时需要通行码。有了这个通行码,私钥文件本身使用通行码来加密。比如说,如果你将公钥存储在服务器上,使用私钥登录进入到该服务器,就会看到输入通行码的提示。要是没有通行码,密钥就没法使用。另外,你可以配置私钥,一开始没有通行码。那样,你只需要登录进入到服务器的密钥文件。
对用户来说通常不用通行码更容易,但是我强烈建议在许多情况下使用通行码,一个理由是,如果私钥文件被偷,偷走文件的人还是没法使用它,除非他能查明通行码。从理论上来说,这可以为你赢得时间,因为你可以在攻击者发现通行码之前将公钥从服务器上删除,因而保护系统。使用通行码还有其他理由,不过光这个理由就值得我在许多情况下使用它。(举例说,我在安卓平板电脑上装有VNC软件。平板电脑存有我的私钥。如果平板电脑被偷了,我可以立即从平板电脑登录进入的服务器废除公钥,让私钥毫无用处,有没有通行码都没有关系。)不过在一些情况下,我并不使用通行码,因为我登录进入的服务器可能没有太多的宝贵数据在上面。这要看具体情况。
服务器基础设施
你如何设计服务器基础设施将影响到如何管理密钥。比如说,如果你有多个用户要登录,就需要确定每个用户是否获得单独的密钥。(通常来说,他们应该获得单独的密钥;你不希望用户共享私钥。那样一来,如果某个用户离开了企业或者失去了信任,你就可以废除该用户的密钥,没必要为另外每个用户生成新密钥。同样,如果共享密钥,他们就能以彼此的身份登录进去,这同样不好。)但是另一个问题是,你如何分配服务器。比如说,你使用某种工具(比如Puppet)来分配许多服务器吗?是否基于自己的映像来创建多台服务器?如果你复制服务器,每台服务器是否需要有同样的密钥?不同的云服务器软件让你可以配置这方面,具体看你怎么选择了。可以让服务器获得同一密钥,也可以为每台服务器生成新的密钥。
如果你处理的是复制的服务器,要是用户需要使用不同的密钥登录进入到两台其他方面相似的不同服务器,就会让人犯晕。但是另一方面,让几台服务器共享同一密钥存在安全风险。或者另一方面,如果你的密码需要用于登录之外的用途(比如挂载加密的驱动器),那么你就需要同一密钥在多个地方。正如你所见,是否需要在不同的服务器上使用同一密钥不是我可以为你做出的决定;有一些地方需要取舍,你要自行决定什么最合适。
最后,你可能会有:
•需要登录进入的多台服务器;
•登录进入不同服务器的多个用户,每个用户有各自的密钥;
•每个用户有多把密钥,以便登录进入到不同的服务器。
(如果你在其他情况下使用密钥――你可能会这样,说到如何使用密钥,需要多少密钥,是否共享密钥以及你如何处理密钥的公共部分和私密部分,同样的基本概念仍会适用。)
安全方法
知道自己的基础设施和独特情况后,你就需要制定一项密钥管理方案,帮助你指导如何分发和存储密钥。比如说,正如前文所述,如果我的平板电脑被偷,但愿平板电脑被用来访问服务器之前,我可以从服务器上废除公钥。正因为如此,我在总体计划中需要考虑到下列情况:
1. 私钥存放在移动设备上没关系,但是它们必须包通行码。
2. 必须有一种方法可以从服务器迅速废除公钥。
在你的情况下,你可能决定根本不想要为频繁登录的系统使用通行码;比如说,系统可能是开发人员每天登录好多次的测试机器。那很好,但是那样的话你就需要稍微调整一下规则。你可能要添加一条规则,规定不得从移动设备登录进入到该机器。换句话说,你需要根据自己的情况来制定规程,而不是想当然地认为有一应俱全的做法。
软件
再来说说软件。奇怪的是,没有许多优秀而可靠的软件解决方案用来存储和管理你的私钥。考虑这一点:如果有一款软件为你的所有服务器存储所有密钥,该软件又由一个快捷密码所保护,你的密钥果真安全吗?或者类似的是,如果你的私钥放在硬驱上以便SSH软件快速访问,密钥管理软件果真提供得了任何保护吗?
但是就整个基础设施和创建及管理公钥而言,还是有一些解决方案。我已经提到了Puppet。在Puppet界,你可以创建模块,以不同的方式来管理服务器。其想法在于,服务器是动态的,未必是彼此的精确副本。这里有一种巧妙的方法:,在不同服务器上使用同一密钥,但是为每个用户使用不同的Puppet模块。这种解决办法可能适合你,也可能不适合你。
或者,另一种办法就是完全改弦易辙。在Docker界,你可以采取一种不同的方法,关于SSH和Docker的这篇博文作了详细介绍:。