SSH 私钥认证客户端,但它并不告诉客户端到达的是哪台服务器。服务器的主机密钥与本地 known_hosts 数据库,提供身份检查的后一半。

把首次接触与轮换分开

StrictHostKeyChecking=yes 下,SSH 拒绝未知主机与变化的密钥。对于一个固定生产端点,只要期望密钥通过可信渠道安装,这就是最安全的默认值。accept-new 是面向预期会出现新主机的、更窄的方便选项:它接受一个从未见过的密钥,但仍拒绝被更改的密钥。

Host production-site
    HostName www.example.test
    User deploy
    IdentityFile ~/.ssh/site_ed25519
    StrictHostKeyChecking yes
    UserKnownHostsFile ~/.ssh/known_hosts

不要通过给部署脚本加 StrictHostKeyChecking=no 来"修复"警告。那会把有用的信号变成静默接受。如果主机被重建,请记录替换后的指纹,并复核旧密钥为何不再有效。

让指纹可复核

在首次连接之前,从主机所有者或控制台获取指纹,再与客户端看到的值比较。密钥变更应有工单、维护说明或其他他人可检视的解释。

同一规则适用于自动化:known-hosts 文件是带有安全后果的配置,不是可丢弃的缓存数据。把它与部署记录一起备份,但不要把私钥或复制的凭据随站点制品一起公开。

来源