Skip to main content

SSH行为

Fabric目前使用纯Python SSH重新实现来管理连接,这意味着有时候会受到库的能力的限制。以下是需要注意的地方,其中Fabric将展示与 ssh 命令行程序的行为不一致或不灵活的行为。

未知主机

SSH的主机密钥跟踪机制保持您尝试连接到的所有主机上的选项卡,并维护一个 ~/.ssh/known_hosts 文件,其中包含标识符(IP地址,有时还包含主机名)和SSH密钥之间的映射。 (有关工作原理的详情,请参阅 OpenSSH文档。)

paramiko 库能够加载您的 known_hosts 文件,然后将其连接到的任何主机与该映射进行比较。设置可用于确定当看到未知主机(在 known_hosts 中找不到其用户名或IP的主机)时会发生什么:

  • 拒绝:主机密钥被拒绝,并且不进行连接。这将导致一个Python异常,这将终止您的Fabric会话与主机未知的消息。

  • :新的主机密钥被添加到已知主机的内存列表中,进行连接,并且事情继续正常。注意这就是 修改你的磁盘上的 known_hosts 文件!

  • :在Fabric级别尚未实现,这是一个 paramiko 库选项,将导致提示用户提示未知密钥以及是否接受它。

是否拒绝或添加主机,如上所述,在Fabric中通过 env.reject_unknown_hosts 选项进行控制,为了方便起见,它默认为False。我们认为这是方便和安全之间的有效权衡;任何人谁感觉否则可以轻松地修改他们的fabfiles在模块级设置 env.reject_unknown_hosts = True

已更改密钥的已知主机

SSH的密钥/指纹跟踪的要点是,可以检测到中间人攻击:如果攻击者将您的SSH流量重定向到他控制下的计算机,并假装是您的原始目标服务器,则主机密钥将不匹配。因此,SSH(及其Python实现)的默认行为是当先前记录在 known_hosts 中的主机突然开始向我们发送不同的主机密钥时立即中止连接。

在某些边缘情况下,例如某些EC2部署,您可能想忽略此潜在问题。在编写本书时,我们的SSH层不能控制这个确切的行为,但是我们可以通过跳过 known_hosts 的加载来避开它 - 如果被比较的主机列表是空的,那么没有问题。当您想要此行为时,将 env.disable_known_hosts 设置为True;默认情况下为False,以保留默认的SSH行为。

警告

启用 env.disable_known_hosts 将使您对中间人进行攻击。请谨慎使用。