关于SSH,几乎每个人都同意密钥要优于密码,更安全,并且更先进,但我并不同意这个观点。
虽然密钥的确可以更好,但它有着还没被意识到的严重风险,并且我认为比得到妥善管理的密码更不安全。
通常密钥更好的理由是多数人使用了弱密码,并且系统之间共享密码,所以一旦发生密码泄漏就会同时危害到多个系统。既然密钥可以设置口令,那么同时拥有两者(密钥和口令)的它当然就更安全了。
这的确没错,但是在大多数得到妥善管理的环境中事实上并非如此,他们没明白真正的风险到底源自哪里,来自哪一步。
举个例子,如果我们在每个地方都使用硬性的随机密码,并且不在两个系统、服务,等等之间共享任何密码,在系统搭建的时候就使用工具和流程来这么做,那么由于密码很少变更,系统将会长期安全。一个关键问题是大部分的安全设置应该在第一次安装系统时由某种机制自动完成。
密钥是完全不同的。的确,一个好的系统应该生成好的密钥,并且不共享它,哪怕管理这么多的密钥文件要比管理同样多的密码困难得多地多。密钥很难去移动(特别是要走ssh网关的时候)、存储、命名、组织和共享,等等。这些都是缺点,并且会产生风险。
密钥要做到安全,就需要口令,但是很少密钥有口令,即便有,工程师也常常为了使工作轻松而移除它们,而且每一次使用都可能有机会被移除口令或者被拷贝到其他地方,一旦发生这种事情,安全性就会永久性地降低了。
更严重的是,密钥文件提供访问所需的一切,如果用户没有常识那么就可能被盗,通常是坐不受保护的位置,并以明文的形式从他们的机器上被盗。理论上来说,用户可以为密钥设置口令,但是他们很少这么做,这也是风险的所在 —— 如果我黑进了你的电脑或者ssh网关,那么我就可以在你不知道的情况下登录到你的所有系统,而密码不可能。这正是我反对使用密钥的核心问题 —— 你所有服务器的安全性,其实和你最弱的客户和工程师的机器安全性是一样的,那可能只是台个人笔记本,智能手机,或者家用电脑,并且感染了各种各样的木马和病毒,哪一种都可以读取你的密钥!
好的密码则相反,被保存在类似Keepass的工具里,基本上不可能被盗,特别是大批量的。
解决密钥安全问题的唯一办法是设置口令,但是不太可能,忙到要死的工程师会经常去除口令的。理论上来说ssh协议可以被增强到报告密钥种类和是否使 用了口令,但是因为这是在客户端做的检查,所以服务器无法信任它。不存在一个简单的办法来强制设置口令,因此多数的密钥是不受保护的,并且不安全。
更进一步,对于大型系统,当我们拥有5,000台服务器的时候,哪种方式更加易于管理,是密钥还是密码?当然,LDAP是一种解决方案,但只能用于一些特性系统,而且我们也不可能强制所有客户都使用LDAP,所以我们还是得面对管理密钥还是密码的问题,显然,管理密码要容易得多。我们知道各种类型和用途的密码系统,但很少听说有哪个密钥系统 —— Keepass可以处理密钥文件,进行剪切粘帖,但没有任何实际有用的大规模处理方式。
最后,归结为一个问题,哪一种方式更容易得到正确地管理,是带口令的密钥,还是复杂的随机密码。对我来说,密码赢了。如果您使用了密钥,那么现在请为它加上口令。