我正在开发一个在 Linux 上运行的嵌入式设备。该设备与服务器通信并使用证书和私钥向其发送数据。
当我们分发设备时,我担心一些邪恶的人可能会通过侵入嵌入式设备的文件系统来窃取私钥,并试图篡改我们服务器上的数据。
即使我加密该私钥,由于正在运行的程序需要解密该密钥,他们仍然可以在文件系统上的某个位置找到解密密钥。
更改文件的权限并不是解决方案,因为我们本质上必须分发设备,因此任何人都可以对其进行物理访问。
我很高兴听到任何保护私钥而不阻止正在运行的程序使用它的建议。谢谢。
编辑:我们使用在 Intel Edison 上运行的 Yocto。
答案1
如果您的硬件在物理上不安全,那么您在软件中所做的任何操作都不会为您提供物理安全。
除非你有一个单独的,否则不要费心加密,安全的钥匙的位置。当有人在启动时输入(用于派生密钥的密码)密钥时,计算机上的全盘加密非常有用。如果密钥位于单独的、受物理保护的存储区域(例如 TPM 或智能卡)上,也可以进行全盘加密。
据我所知,Intel Edison 没有这样的独立存储区域。此外,Edison 开发板可以从 SD 卡或 USB 记忆棒启动,因此任何能够物理访问 USB 端口的人都可以从 eMMC 中提取所有数据。
USB 启动似乎依赖于 U-Boot,因此用禁用 USB 的自定义映像替换官方 U-Boot 映像可能会强制从 eMMC 上的操作系统启动。我实际上不知道这是否有可能,我只是没有足够的信息来反驳它。
即使使用自定义引导加载程序,该板也可以通过 USB 连接进行刷新。这会覆盖 eMMC 的一部分,但不会覆盖整个 eMMC,至少在闪存中断的情况下是如此。无论您尝试将密钥放在 eMMC 上的哪个位置,细心的攻击者都可以避免覆盖它。
如果您的服务器需要信任来自设备的数据,您正在寻找的功能称为“安全启动”(或“可信启动”或“验证启动”或其他一些名称,术语未标准化)。对于 Intel 处理器,这是通过 TPM 实现的(但嵌入式主板很少有 TPM)。对于 ARM 处理器,这是通过 TrustZone 加上一些制造商相关的工具来实现的。这两种技术都无法抵御可以花费大量资金的对手,但破解它们至少需要一个烙铁,而不仅仅是一个 USB 记忆棒。