![多台设备拥有相同的 SSH 服务器密钥有多糟糕?](https://linux22.com/image/694687/%E5%A4%9A%E5%8F%B0%E8%AE%BE%E5%A4%87%E6%8B%A5%E6%9C%89%E7%9B%B8%E5%90%8C%E7%9A%84%20SSH%20%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%AF%86%E9%92%A5%E6%9C%89%E5%A4%9A%E7%B3%9F%E7%B3%95%EF%BC%9F.png)
我正在研究运行 FreeBSD 和 SSH 的嵌入式设备。
如您所知,sshd 喜欢在首次启动时随机生成一组服务器密钥。问题是我们将使用只读 SD 卡文件系统(不可协商)来运送产品。
我认为有两个选择:
- 在所有设备上发送相同的 sshd 服务器密钥
- 安装内存文件系统并在每次启动时生成服务器密钥(慢......)
在所有设备上发送相同的服务器密钥是否会带来重大安全问题?这些项目不会直接出现在互联网上。偶尔会有多个设备归同一个人所有,并位于同一个网络上。
大多数时候,设备不会连接到互联网。
使用 SSH 登录不是正常操作的一部分。这主要是为了方便程序员和技术人员。客户不会使用 SSH 登录设备。
在多个硬件设备上使用相同的服务器密钥会产生什么后果?
PS 有人可以创建物联网标签吗?
编辑:我指的是在所有服务器(设备)上安装相同的主机私钥。至于用户公钥/私钥,目前没有计划使用基于密钥的登录 - 它将是密码登录。同样,所有服务器(设备)上的密码相同。
我知道这可能是个坏主意。但我想知道为什么这是一个坏主意,这样我才能理解其中的利弊。
答案1
您无需将特定于主机的数据(例如 ssh 主机密钥)存储在 SD 卡或其他只读介质上,而是可以将其存储在 NVRAM 中,这是嵌入式系统上的用途。您需要编写一些自定义脚本来在启动时存储和检索密钥,但这些脚本对于每个设备都是完全相同的。
答案2
在所有设备上都使用相同的密钥对,其影响与连接到这些设备的客户端的安全性直接相关,因为这意味着无法(从 SSH 客户端)唯一地识别它可能连接到的设备。如果您的密钥对被泄露,则可能会被用于 MITM 攻击。
另一方面,每次启动时重新生成密钥也会在客户端上触发警报。
供参考,来自man ssh(1)
:
ssh
自动维护和检查包含所有曾经使用过的主机标识的数据库。主机密钥存储在~/.ssh/known_hosts
用户的主目录中。此外,还会自动检查文件中是否存在/etc/ssh/ssh_known_hosts
已知主机。任何新主机都会自动添加到用户的文件中。如果主机标识发生变化,则会ssh
发出警告并禁用密码验证,以防止服务器欺骗或中间人攻击,否则这些攻击可能会被用来绕过加密。该StrictHostKeyChecking
选项可用于控制登录到主机密钥未知或已更改的计算机。
答案3
听起来,在第一个选项中,SSH 密钥将保存在 SD 卡上。因此,任何用户都可以拿起卡并读取它们。因此,基本上您的私钥(大部分)已经公开。
这将允许中间人攻击,如下所示:
- 用户使用从您的设备获取的私钥设置 SSH 服务器,并将该 IP 地址提供给您的技术人员。
- 您的技术人员通过 SSH 连接输入 root 密码。
- 用户现在知道对所有设备有效的 root 密码。
但是,你首先不应该使用 root 密码,而是使用 ssh 密钥进行身份验证。这样,共享服务器密钥的影响就很小了如果您只能从 LAN 登录。
SSH 还提供前向保密性,因此攻击者必须能够设置虚假服务器才能从密钥中获益;被动嗅探流量将无法解密。
答案4
由于您提到最终用户/客户不使用 SSH 访问,您可能希望默认关闭 SSH 访问,并且仅在设备进入“调试”模式时暂时启用它。
然后,您可以使用相同的密钥运送所有设备,假设您已经保护了“调试”模式,因此它不会被试图破解设备的人远程触发。
或者,当设备进入“调试”模式时,您会生成一个新密钥 - 这样您就不必在每次设备启动时浪费启动时间来生成密钥。