在执行时而不是在 known_hosts 中提供 openssh 的主机指纹

在执行时而不是在 known_hosts 中提供 openssh 的主机指纹

我有一个临时 CI 运行器,需要在我拥有/管理的服务器上执行命令。每次 CI 运行都会构建和拆除此运行器,因此我试图限制运行器的状态,包括创建文件,例如~/.ssh/known_hosts。在 CI 运行器的执行脚本中,我提供了密钥,该ssh-add - <<< "${SSH_PRIVATE_KEY}"密钥将密钥添加到正在运行的进程而不是文件中。

我知道 openssh 具有StrictHostKeyChecking=no可以避免指纹/公钥检查的选项,但这是一个明显的安全问题,我想避免。

我在 openssh 工具套件中寻找一个选项,为该服务器提供指纹/公钥作为参数,ssh同时避免创建known_hosts文件。我知道,但在使用不安全选项运行实际命令之前ssh-keyscan remotehost,要么需要将其定向到known_hosts(理想情况下应避免),要么在 if/then 块中将其与已知公钥进行比较(在与服务器的第二次通信中仍容易受到 MITM 攻击)。sshStrictHostKeyChecking

是否ssh -o ExpectFingerprint=SHA256:KNOWNFINGERPRINT user@remotehost mycommand.sh存在类似的东西来指定“已知主机指纹”作为执行参数的一部分?考虑到我的安全目标,我是否必须known_hosts在短期 CI 运行器上使用该文件?

答案1

除了将主机指纹存储在DNS 中~/.ssh/known_hosts之外,还有一种替代方法/etc/ssh/ssh_known_hosts是在 DNS 中设置 SSHFP RR 记录。您需要在服务器上运行 ssh-keygen 来创建一组记录条目,然后需要将其添加到您的DNSSEC启用DNS服务器: ssh-keygen -r host.example.com

要检查区域是否正在回答指纹查询: dig -t SSHFP host.example.com

然后您可以在客户端执行以下操作来连接到服务器: ssh -o "VerifyHostKeyDNS=yes" host.example.com

也可以看看SSHFP:通过 DNSSEC 验证 SSH 指纹

相关内容