如果使用基于密钥的身份验证,禁用 SSH 主机密钥检查是否安全?

信息安全 SSH 中间人
2021-08-22 11:22:38

我有一些任务是这样的:

  1. 启动一些新的 EC2 实例(亚马逊网络服务)
  2. 让他们执行任务
  3. 杀了他们

问题是它们(似乎)被随机分配了一个 IP 地址,并且偶然一台新机器重用了以前使用过的地址。

这显然会导致以下错误,并且我的脚本失败了:

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the RSA key sent by the remote host is 
Please contact your system administrator.
Add correct host key in /home/ec2-user/.ssh/known_hosts to get rid of this message.
Offending RSA key in /home/ec2-user/.ssh/known_hosts:595
RSA host key for 127.0.0.1 has changed and you have requested strict checking.
Host key verification failed.

我在连接到这些机器时使用了密钥对,而不是使用密码身份验证。这会防止中间人攻击,因为攻击者不会拥有相同的密钥对吗?

我可以安全地禁用 SSH 主机密钥检查吗?

2个回答

简短的回答:是和不是。

首先,让我们把事情弄清楚。无论如何,基于密钥的身份验证如何在 SSH 中工作?一旦 SSH 连接到达身份验证阶段,客户端会使用其私钥对一堆数据(包括会话标识符)进行签名,然后将签名发送到服务器进行验证。

签名验证通过 -> 认证成功。

那么在这种情况下,中间人如何攻击呢?攻击者位于您和服务器之间。对于成功的攻击,他需要您与他开始会话,并且他需要与服务器开始会话。无论您发送到服务器,实际上都会发送给他,他有能力对其进行修改并将其发送到服务器,而服务器发送给您的任何内容实际上都会发送给攻击者,攻击者可以对其进行修改并将其发送给您.

你有没有注意到一些有趣的事情?这里有两个会话(记住这一点)。每个会话都有自己的会话标识符,因为会话标识符的生成不是由服务器或客户端单独确定的。换句话说,您用于向攻击者进行身份验证的签名将不同于攻击者必须用于向真实服务器进行身份验证的签名。

攻击者没有客户端的私钥,这意味着它无法提供真实服务器将接受的签名。这就是为什么这种完整的 MiTM 是不可能的。

中间人 SSH

所以禁用主机密钥/指纹检查是安全的,对吧?不完全是。确实,由于攻击者无法对服务器进行身份验证,因此他将无法在其上执行恶意命令。

还记得我告诉过你这两次会议的事吗?攻击者将无法与真实服务器建立会话,但他可以轻松地让您与他建立会话。攻击者将简单地接受你给他的任何签名并欺骗你以为你现在连接到了真实的服务器。你会向他发送命令(可能还有一些特定于进程的密码),他会很高兴地回复任何让你开心的东西。

当然,这里的服务器并没有真正的危险,因为这些命令并没有真正到达服务器。只是不知道您实际上将向服务器发送什么(现在是攻击者)。您可能会发送密钥、密码(想一想,当您修改密码时,服务器会要求您提供当前密码)和其他敏感信息。

底线是:如果您愿意接受连接到知道您发送到真实服务器的内容的假服务器的风险,请禁用主机密钥/指纹检查。否则,保持启用。

参考:

如果您在相关服务器的配置中启用了 SSH 代理转发,那将是不安全的。

如果您使用 SSH 代理来管理基于密钥的身份验证,并且您使用ssh -A或者如果您的~/.ssh/config:

Host example.com
    ForwardAgent yes

或者如果您已ForwardAgent全局启用,则跳过或忽略主机密钥检查是不安全的。

公认的答案非常好,但忽略了这个非常重要的警告。

启用代理转发,并假设您的代理拥有被 MITMed 的服务器的密钥,那么攻击者可以允许您按照接受的答案中所述连接到它,然后使用您的密钥与真实服务器建立新连接转发代理。大多数(全部?)代理都会默默地允许这样做。结果将是现在您拥有与真实服务器的完全 MITMed 连接。

在某些方面,这类似于密码验证 MITM 攻击。在密码身份验证场景中,MITM 窃取您的密码并使用它对服务器进行身份验证,这样您就不会更聪明了。在公钥身份验证场景(使用代理转发)中,攻击者利用您的代理进行身份验证。因此,尽管攻击者不会获得您的密钥,但攻击者可以通过代理使用您的密钥对服务器进行身份验证,并且还可以冒充您到接受您的密钥的其他主机(但仅限于会话期间)。

这种情况和非 MITM 情况下的SSH 代理劫持情况是非常小心将代理转发到哪些主机的两个原因。想想攻击者可以通过访问您的代理已加载的密钥所做的一切。例如,如果您的工作站配置为接受其中一个密钥,则攻击者可以通过 ssh 回到您的工作站并检索 SSH 私钥。如果私钥有密码,攻击者可以安装一个键盘记录器并耐心等到你下次解密它。