添加到 SSH 已知主机

Travis CI 可以在克隆 Git 存储库之前将条目添加到 ~/.ssh/known_hosts,如果存在来自 github.comgist.github.comssh.github.com 以外域名的 Git 子模块,则需要此操作。

主机名和 IP 地址都受支持,因为密钥是通过 ssh-keyscan 添加的。可以像这样指定单个主机

addons:
  ssh_known_hosts: git.example.com

可以将多个主机或 IP 添加为列表

addons:
  ssh_known_hosts:
  - git.example.com
  - 111.22.33.44

还可以指定带端口的主机

addons:
  ssh_known_hosts: git.example.com:1234

安全影响 #

请注意,ssh_known_hosts 选项可能会为您的构建引入中间人攻击的风险。(另请参阅 ssh-keyscan 手册页 的“安全”部分。)例如,它可能会阻止构建检测到非法第三方尝试将修改后的 Git 存储库或子模块注入到构建中。这种可能性在 Travis CI 构建输出用于发布包或生产部署时可能特别相关。

缓解措施和解决方法 #

目前,Travis CI 仅针对 github.comgist.github.comssh.github.com 上的存储库开箱即用地检测上述攻击。如果您在其他域上托管代码,目前没有使用 ssh_known_hosts 选项及其安全影响的简单替代方法。

但是,您可以保护构建阶段中克隆阶段后发生的其它 SSH 连接,例如,在部署构建输出时。要使您的构建拒绝此类连接的伪造 SSH 服务器,您可以使用已知的良好 SSH 密钥配置它们。假设您的构建实例连接到 SSH 服务器 ssh.example.com

  1. 删除 ssh.example.comssh_known_hosts 选项。

  2. 获取 ssh.example.com 上 SSH 服务器的公钥

    • 理想情况下(但很少见),ssh.example.com 的所有者可以通过电子邮件或其他受信任的渠道为您提供服务器的 SSH 公钥。

    • 如果您以前从受信任的本地计算机连接到 ssh.example.com,请运行 ssh-keygen -F ssh.example.com 以显示其公钥。

    • 如果您尚未连接到 ssh.example.com,请运行 ssh-keyscan ssh.example.com 以检索它,并运行 ssh-keygen -F ssh.example.com 以显示它。理想情况下,您需要与 ssh.example.com 的所有者仔细核实,以确保它确实是服务器的公钥,而不是 ssh.example.com 的伪造实例的密钥。

  3. 配置 Travis CI 以使用 SSH 服务器的公钥:将密钥服务器的公钥 KEY 添加到 SSH known_hosts 文件中,例如,在安装阶段添加以下内容

install:
  - echo 'KEY' >> $HOME/.ssh/known_hosts

确保将 KEY 替换为包含 SSH 服务器公钥的完整文本行,如上一步中获取的那样。