似乎SSH
设计者非常关心中间攻击的人。
他们的方法是,在您第一次连接到服务器时保存服务器的公钥指纹(并希望用户在第一次连接时不要从中毒的网络连接,例如如果他有病毒在计算机)。然后,用户在下次连接到此服务器时使用指纹验证服务器的公钥。
在实践中,我发现许多用户只是忽略了有关指纹不匹配的警告,并认为这是由于重新安装服务器造成的。只是 MITM 攻击很难进行而且很少见,你永远不用担心。此外,很多时候用户想要在许多不同的计算机上使用 ssh,并且他不会费心将所有指纹导入他可能想要使用的任何计算机SSH
(嘿,你能看看我的网站为什么关闭,我很恐慌!我不在办公室,我去最近的网吧看看)。
公平地说,人们可以使用DNSSEC
和使用DNS
服务器作为CA
. 但是我从来没有看到在实践中使用过。无论如何,它不是协议的强制性部分。
多年来,我认为没有预先共享的秘密就无法避免 MITM,但我最近一直在阅读 Bruce Schneir 出色的“实用密码学”,其中他提到了互锁协议。
- Alice 将她的公钥发送给 Bob。
- Bob 将他的公钥发送给 Alice。
- Alice 使用 Bob 的公钥加密她的消息。她将一半的加密消息发送给 Bob。
- Bob 使用 Alice 的公钥加密他的消息。他将一半的加密消息发送给 Alice。
- 爱丽丝将她加密信息的另一半发送给鲍勃。
- Bob 将 Alice 的两半信息放在一起,并用他的私钥解密。Bob 将另一半加密消息发送给 Alice。
- 爱丽丝将鲍勃的两半信息放在一起,并用她的私钥解密。
现在,Mallory 必须在协议的第 (3) 步中向 Bob 发送一些东西,在他收到 Alice 的一半消息之后,即使在 (5) 中他从 Alice 那里得到所有信息之前他无法解密它。他必须向 Bob 编造一条消息,并且 Bob 可能会注意到他正在编造,例如,在他ls
的主目录之后。
为什么不SSH
使用这样的方案?它似乎真的符合它的目标。它不需要任何其他实体,它使 MITM 攻击变得更加困难。
是与生俱来的吗?我对问题的理解有缺陷?或者只是设计者认为额外的安全性不值得使协议复杂化?
PS:
如果你认为这样会造成太大的开销,你可以强制协议的用户只对10K
连接中的第一个数据使用互锁,所以在实践中并没有太大的关系,但 MITM 会更多困难永远不会少。
更新:此处 描述的对联锁协议的攻击,并不意味着 MITM 攻击是可能的,它确实意味着如果在通信期间发送单个密码,MITM 可以拦截它并且用户只会看到超时错误。
更新 2:
Eugene, raise 点是有效的。联锁协议不允许身份验证。也就是说,你仍然不能确定如果你连接到example.com
,它确实是example.com
,而不是malicious.com
冒充到example.com
。如果没有,比如说,你不能肯定地知道这一点DNSSEC
。因此,例如,如果您正在SSH
访问导弹发射井并写入launch_missile -time now
(例如,没有使用ls
来验证服务器确实是导弹发射井中的服务器),那么您可能实际上是在恶意服务器中编写的,并且现在敌人知道你要向他发射导弹了。联锁协议确实无法阻止这种类型的攻击。
但是,如果我正确理解协议,则可能会阻止更危险的攻击和非常实用的攻击。如果使用联锁协议,即使你对 . 一点都不了解example.com
,也不可能SSH
对你的服务器进行任何操作,并且有人会窃听整个SSH
会话。我认为这种类型的攻击更有可能。
也许SSH
不关心 MITM 攻击?我不认为,例如看腻子常见问题解答:
那些烦人的主机密钥提示是 SSH 的重点。没有它们,SSH 用来保护会话安全的所有加密技术只不过是让攻击者的工作更加困难。攻击者不必使用数据包嗅探器坐在您和服务器之间,而是必须实际破坏路由器并开始修改来回的数据包。但这并不比嗅探要难得多。并且没有主机密钥检查,它将完全未被客户端或服务器检测到。
他显然是在谈论 MITM 攻击而不是服务器身份验证。我认为使用联锁协议可以清楚地防止 Putty FAQ 中提到的攻击,但我仍然不明白他们为什么不使用它。