SSH 是否支持*真正的*预共享密钥?

SSH 是否支持*真正的*预共享密钥?

众所周知,sshd在公共机器上运行是一种极好的攻击媒介,因此应尽可能加以保护。除了“设置PermitRootLoginno”和“切换到公钥身份验证”等显而易见的建议外,我还发现了以下方法可以限制拥有以下权限的脚本小子访问我的机器nmap

  • 将端口更改为 22 以外的其他端口。上述操作并没有什么帮助nmap
  • 保持端口 22 开放,但删除那里的所有连接,改为使用以下方式接受来自另一个端口的 SSH 连接这根拐杖。比以前的方法好一些,但仍然只是一种阻碍。
  • 设置端口敲门。繁琐且仍然并不完全安全,因为“敲击”流量可以被拦截。

如果我要设计一个用于远程访问我的机器的系统,它将看起来像这样:

  1. 生成一个随机秘密。
  2. 手动将其复制到应该连接的两台机器上(甚至可以使用闪存驱动器来完成,以实现最大程度的肛门保留)。
  3. 第一个数据包客户端机器发送给服务器的(即 SSH 握手启动)是已经用这个秘密加密。
  4. 如果服务器收到未使用此密钥正确加密的数据包,它就会默默关闭 TCP 连接。

结果是从物理上不可能攻击者甚至可能发现服务器上正在运行 SSH 服务。在我看来正是“预共享密钥”的含义。

相反,当我尝试搜索“带有预共享密钥的 ssh”时,我只得到有关如何从 迁移到PasswordAuthentication的文章链接PubkeyAuthentication

答案1

不是。在协议级别,每个标准 SSHv2 连接始终以 1) 纯 ASCII 格式的协议版本“banner”和 2) 列出所有支持的密码和密钥交换方法的未加密数据包开头。

从第 3 步开始可以实现涉及 PSK 的自定义密钥交换方法(理想情况下此外SSH 密钥交换 (与通常的动态 DH 密钥交换不同),但这需要自定义的 sshd 守护进程以及自定义客户端。目前,OpenSSH、PuTTY、Bitvise WinSSHD 以及我迄今为止尝试过的任何其他 SSHv2 实现中都没有这样的功能。

最简单的替代方案是使用 VPN 系统,因为这些系统通常支持 PSK(但更常见的是作为 HMAC 密钥来保护初始密钥交换 - 而不是作为 AES 密钥来加密实际数据通道,因为那样会失去“前向保密”功能)。一旦您运行了 VPN 服务,您就可以完全禁用直接 SSH 连接:没有人可以发现实际上不再监听的 sshd。

例如,在流行的协议中,WireGuard 和 OpenVPN 都支持使用预共享 MAC 密钥来验证所有连接尝试。由于两者都使用 UDP 进行初始协商,因此它们根本不响应根本无法验证的数据包,导致服务无法被发现。(尽管我相信 WireGuard 即使没有 PSK 模式也已经这样做了……)请注意,OpenVPN 将此功能称为“tls-auth”模式 - 不要将其与“static-key”模式混淆。

这里也可以使用 IPsec AH – 如果您需要的只是一个完全静态的身份验证密钥,那么可以在两端手动配置 SA,而根本不需要任何动态 IKE 握手,只需使用命令即可ip xfrm。但这可能会很烦人。

作为另一种选择,一些操作系统支持TCP层使用 TCP-MD5 (RFC1321) 或 TCP-AO (RFC5925) 进行预共享密钥身份验证。这很容易入侵 SSH 软件,因为它只需要一个 sockopt,尽管这又进入了自定义客户端的领域。此外,操作系统级别的支持很差 - 虽然 TCP-MD5 仍然受支持,因为人们希望将其与 BGP 一起使用,但对 TCP-AO 的支持可能实际上不存在。

相关内容