SSH 行为

Fabric 使用纯 Python 实现的 SSH 库管理连接,也就是说可能会因此由于库的兼容性限制出现问题。下面几种情况下不能保证 Fabric 一些正常,或者和 ssh 控制台命令一样灵活。

未知主机

SSH 的主机密钥 tracking 机制会纪录所有你打算连接的主机,并将主机的认证信息(一般是 IP 地址,但有时也可以是域名)和 SSH 密钥映射并保存在 ~/.ssh/known_hosts 文件中。(对其工作方式感兴趣请参阅 OpenSSH 文档 。)

paramiko 库会加载 known_hosts 文件,并尝试将它和你要连接的主机映射起来,并提供参数设置用于决定连接未知主机(主机名或者 IP 不存在于 known_hosts 文件中)时的行为:

  • Reject :在不安全时拒绝连接。它将抛出一个 Python 异常,因而终止 Fabric 会话,并输出“未知主机”信息。

  • Add :将新的主机密钥添加到内存中的已知主机列表,然后一切如常地继续 SSH 连接。注意,它并不会修改你的 known_hosts 文件。

  • Ask 并不是 Fabric 中实现的,而是 paramiko 库提供的选项,它会询问用户是否接受该未知主机的密钥。

在 Fabric 中控制究竟是拒绝连接韩式添加主机的选项是 env.reject_unknown_hosts ,方便起见其默认值是 False ,我们认为这是安全和便利之间合适的折中方案,对此有异议可以在 fabfile 中设置 env.reject_unknown_hosts = True 重设安全等级。

已知主机但更换了密钥

SSH 密钥/指纹认证机制的目的在于检测中间人攻击:如果攻击者将你的 SSH 流量转向他控制的计算机,并将其伪装为你的目的主机,将会检测到主机密钥不匹配。因此 SSH (及其 Python 实现)发现主机密钥与 known_hosts 文件中纪录不一致时,都默认立即拒绝连接。

在某些情况下,比如部署 EC2 时,你可能会打算忽略该问题,我们目前所采用的 SSH 层并没有提供对该操作的明确控制,但是可以通过跳过 known_hosts 文件的加载过程——如果 known_hosts 文件为空,则不会出现纪录不一致的问题。如果你需要这样做,可以设置 env.disable_known_hostsTrue ,其默认值为 False 以遵从 SSH 的默认设置。

警告

启用 env.disable_known_hosts 会使你暴露在中间人攻击中!请小心使用。