我有一个临时 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 攻击)。ssh
StrictHostKeyChecking
是否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