题 使用相同的SSH服务器密钥的多个设备有多糟糕?


我正在开发一个运行FreeBSD和SSH的嵌入式设备。

如您所知,sshd喜欢在首次启动时随机生成一组服务器密钥。问题是我们将使用只读SD卡文件系统(不可协商)运送产品。

我看到它的两个选择是:

  • 在所有设备上发送相同的sshd服务器密钥
  • 挂载内存文件系统并在每次启动时生成服务器密钥(慢...)

在所有设备上运送相同的服务器密钥是否是一个主要的安全问题?这些物品不会直接在互联网上。偶尔会有多个设备由同一个人拥有并位于同一网络上。

大多数情况下,设备不会连接到互联网。

使用SSH登录不是正常操作的一部分。这主要是为了方便程序员和技术人员。客户不会使用SSH登录设备。

在多个硬件设备上使用相同服务器密钥的后果是什么?

PS有人可以请创建一个物联网标签吗?

编辑:我说的是在所有服务器(设备)上安装相同的主机私钥。就用户公钥/私钥而言,目前没有计划使用基于密钥的登录 - 它将是密码登录。同样,所有服务器(设备)上的密码相同。

我知道这可能是一个坏主意。我想知道为什么这是一个坏主意,尽管我可以理解权衡。


21
2017-12-04 17:44




如果您指的是主机密钥,则具有多个设备的用户可能会收到警告,具体取决于他们的ssh客户端配置。更大的问题是围绕实际的ssh身份验证密钥。希望您没有安装任何私钥,并希望您的公钥仅限于特定的源网络,并希望您的技术人员拥有的私钥对它们有强大的密码,并希望这些密钥永远不会被错误地检入回购。由于这些事情,物联网正在变得非常糟糕。不是说你愿意,只是说这是一个大问题。 - Aaron
我在谈论在所有服务器上安装相同的主机私钥,如果这是你的意思。 - NXT
在所有设备上使用相同的用户名/密码是一个非常糟糕的主意。这些比用于公钥认证的私钥更容易暴力破解。即使这些设备不应该直接连接到互联网,但无论如何都会有人这样做。如果“没有直接连接”意味着NAT,它们连接得足够...... - Tero Kilkanen
共享SSH密钥意味着可以在一台设备上访问私钥的人可以模拟所有这些设备。 - immibis
虽然这是一个有趣的问题,但我没有看到与系统管理相关的任何内容,因此对于服务器故障而言是偏离主题的。您要问的是为您提供的嵌入式设备设计调试/诊断接口,而不是与系统管理员相关的接口。这个问题可以迁移到 信息安全。 - 200_success


答案:


您可以将其存储在NVRAM中,而不是将主机特定数据(如ssh主机密钥)存储在SD卡或其他只读介质上,而NVRAM就是嵌入式系统上的内容。您需要在引导时执行一些自定义脚本来存储和检索密钥,但每个设备的脚本都完全相同。


27
2017-12-04 19:50





将相同密钥对与所有设备一起发送的影响与连接到它们的客户端的安全性直接相关,因为这意味着无法(从SSH客户端)唯一地识别它可能连接到的设备。如果您的密钥对被泄露,它可能会被用于MITM攻击。

另一方面,在每次启动时重新生成密钥,也会在客户端上触发警报。

供参考,来自 man ssh(1)

ssh 自动维护和检查包含其曾使用过的所有主机的标识的数据库。主机密钥存储在 ~/.ssh/known_hosts 在用户的主目录中。另外,该文件 /etc/ssh/ssh_known_hosts 自动检查已知主机。任何新主机都会自动添加到用户的文件中。如果主持人的身份发生变化, ssh 警告此并禁用密码身份验证以防止服务器欺骗或中间人攻击,否则可能会用于规避加密。该 StrictHostKeyChecking option可用于控制对主机密钥未知或已更改的计算机的登录。


12
2017-12-04 18:25



我不明白为什么他们不能只生成一次(在每个设备上,在第一次启动时)然后再也不生成(除非它们被删除)? - djsmiley2k
非常可行。但OP表示他/她想:'安装内存文件系统并在每次启动时生成服务器密钥'。所以我的回答是假设的。 - dawud
啊啊,当我第一次看到它时,我想念它。 - djsmiley2k


听起来像第一个选项,SD卡上可以使用SSH密钥。所以任何用户都可以拿走卡片并将其读出来。所以基本上你的私钥已经(大部分)公开了。

这将允许中间人攻击,如下所示:

  1. 用户使用从您的设备获取的私钥设置SSH服务器,并将该IP地址提供给您的技术人员。
  2. 您的技术人员通过SSH连接输入root密码。
  3. 用户现在知道对所有设备有效的root密码。

但是,您不应该首先使用root密码,而是使用ssh密钥进行身份验证。那么共享服务器密钥的影响非常小 如果 你只能从局域网登录。

SSH还提供前向保密,因此攻击者必须能够设置虚假服务器才能从密钥中受益;被动地嗅探流量将不允许解密它。


5
2017-12-05 13:00



有趣的是,我们的先入之见如何使我们失明(我)。 SD卡位于面板后面和电路板下方的单元内部,所以我从来没有想过有人会把它拉出来。但是,你是对的,任何人用螺丝刀都可以使用它。感谢提醒您考虑系统的物理安全性。 - NXT
WRT#2,不应通过SSH连接发送root密码。它应该被输入到终端客户端,并用于证明拥有秘密而不传输秘密的认证协议的本地一半(“知识证明”)。即使是几十年前的系统也知道发送密码的哈希值而不是密码本身。在挑战/响应协议中包含随机数,攻击者既不知道原始密码也不知道可以在其位置使用的任何令牌。 - Ben Voigt
@BenVoigt我认为大多数unix系统都会将密码传输到服务器。影子文件只存储一个哈希值,但你不想信任客户端生成的哈希值 - 因为否则任何人都可以使用被盗的哈希值登录,而不会反转它。因此,服务器必须知道实际密码才能运行bcrypt或类似密码。 - jpa


我惊恐地看了这个!我使用相同的ssh主机密钥在同一个集群中完成多台计算机的人永远不敢这样做。在任何情况下都不允许具有不同管理员组的计算机共享ssh主机密钥。当你因为缺乏安全性而被张贴时,那就是疯狂和尖叫的恐怖。

看哪,我说实话,妥协一台设备的人会妥协他们所有人。一旦获得一个,期望坏人随意跳到另一个,安全回滚,好像它是薄纸。


2
2017-12-06 03:56



您能否详细说明攻击者如何使用被盗的服务器私钥来破坏其他设备? - jpa
@jpa:对于主机密钥,通过拦截和窃取密码等。此外,这个设置似乎建议用用户密钥做同样的事情。 - joshudson


由于您提到最终用户/客户未使用SSH访问,因此您可能希望默认关闭SSH访问,并且仅在设备进入“调试”模式时暂时启用它。

然后,您可以使用相同的密钥发送所有设备,假设您已经保护了“调试”模式,因此尝试破解设备的人无法远程触发它。

或者,当设备进入“调试”模式时,您会生成一个新密钥 - 因此,每次设备启动时,您都不必浪费启动时间来生成密钥。


2
2017-12-06 11:44



我喜欢这个主意。 - NXT


以下是基于您拥有的约束的示例攻击情形:

如果您的设备是,例如Raspberry Pi。如果我走上去从一张SD卡中取出SD卡,我可以将SD卡粘在我自己的电脑上,找到sshd键并将其复制到我想要的任何地方。也许我抓住自己的覆盆子pi和USB以太网卡。现在我可以将它放在目标设备和他们去的任何地方之间并监视ssh连接。当我看到目标设备正在尝试建立ssh连接时,我这样做:

(target) <---> (my evil sshd <--> decrypted traffic <--> ssh) <---> (real server)
                                       |
                                       V
                                    log file

哦,那是什么?你的密码是“我喜欢猫”吗?男孩,这是你发给你妻子的一封有趣的电子邮件。我敢打赌,如果她读到你发给隔壁邻居妻子的这封电子邮件会更有趣。

可能性是 无穷。目标永远不会知道,因为sshd键与真实服务器上的密钥相同。根据接收设备的设施的物理安全性,这可能是 令人难以置信 不重要的。不要这样做。

相反,做你已经提出的建议但是 修理它。在你写你的图像之前运行这样的事情:

ssh-keygen -f some-new-server
cp some-new-server /path/to/the/mounted/image/sshd/key
cp some-new-server.pub /path/to/the/mounted/image/sshd/key.pub

现在每个服务器都有一个  键。因为你真的,  不想分发密钥的副本。我的意思是老实说它是在 最小 与拍摄房门钥匙的照片并将其上传到互联网上一样糟糕。


2
2017-12-06 12:39



如果某人对您的硬件具有物理访问权限并且您无法在静态加密数据,那么所有投注都将被取消。 - Iain