跳到主要内容

安全架构

本页面提供树莓派设备如何在启动和存储访问期间进行自我保护的高层概念架构概述。内容总结如下:

  • 树莓派 安全(验证)启动 过程中使用的信任链。
  • 启用时,磁盘加密 如何集成到启动过程中。
  • Raspberry Pi OS 中提供安全功能的 软件组件

要实现安全启动和加密,我们建议使用我们的安全启动配置工具 (Secure Boot Provisioner),它可以配置并在多台设备上部署安全启动和磁盘加密。更多信息和操作指南请参阅 安全启动配置

安全启动信任链

像所有计算机一样,当树莓派启动时,它会经历一个启动过程:首先运行低级固件,然后加载操作系统 (OS)。

安全启动通过建立信任链,确保在此过程中只有经过认证的软件运行。链中的每个阶段(环节)会在下一阶段运行之前对其进行加密验证。这确保了只有由可信来源签名的代码才能在启动期间运行。

我们建议使用树莓派的安全启动配置工具来配置设备的安全启动,并可选择启用磁盘加密。有关信息和说明,请参阅 安全启动配置

加密组件

安全启动链从不可变的硬件开始,一直延伸到客户的软件。它由以下加密组件组成:

  1. 启动 ROM 公钥。 启动 ROM 是不可变的硬件信任根,其中包含烧录在硅片中的树莓派公钥。该密钥用于认证树莓派签名的固件。
  2. 客户生成的 RSA 密钥对。 在配置您的树莓派设备之前,您(客户)需要生成自己的 RSA 公钥-私钥对。私钥用于签名您的 OS 启动镜像。使用树莓派的安全启动配置工具,您可以通过在设备 OTP 中存储公钥的身份(哈希值)来定义哪个密钥被信任用于启动。
  3. 设备唯一磁盘密钥。 安全启动配置工具生成一个设备唯一的密钥,用于在启动时解锁加密的根文件系统。该密钥存储在 OTP 中,并受软件机制保护。

启动流程时间线

树莓派的安全启动配置工具建立了一条从不可变硬件开始并延伸到操作系统的信任链。如果所有验证步骤都成功,内核将开始运行,然后挂载根文件系统,如果使用安全启动配置工具启用了磁盘加密,则先解密再挂载。

如果任何验证步骤失败,信任链将被破坏,EEPROM 启动加载器将继续执行您配置的下一个启动方法,例如另一个分区、镜像或恢复模式。

第一阶段:启动 ROM 信任根

第一阶段是嵌入在每个树莓派 SoC 中的 启动 ROM。由于它被永久烧录在硅片中,制造后无法修改,因此按设计是可信的;它因此构成了安全启动过程的硬件信任根。

启动 ROM 读取存储在一次性可编程 (OTP) 内存中的 RSA 2048 位公钥 的哈希值。在使用 BCM2712 SoC 的树莓派设备上,该密钥对还用于签名 EEPROM 启动加载器(参见 第二阶段)。这通过额外要求客户密钥签名来认证 EEPROM 启动加载器,从而扩展了 BCM2711 SoC 的检查。

第二阶段:EEPROM 启动加载器验证

第二阶段是 EEPROM 启动加载器,它存储在树莓派设备的 SPI flash EEPROM 中,并由树莓派的安全启动配置工具更新。该启动加载器的数字签名使用嵌入在启动 ROM 中的树莓派公钥进行验证。EEPROM 启动加载器随后根据存储在 OTP 中的哈希值检查客户的公钥,确保只有授权的客户密钥被信任用于后续阶段。

第三阶段:内核和操作系统

第三阶段是 内核和操作系统 的验证和加载。EEPROM 启动加载器从本地存储或通过网络加载启动镜像 (boot.img),并使用客户公钥验证其签名 (boot.sig)。经过验证的启动镜像通常包含内核、initramfs、设备树,以及在 BCM2711 SoC 设备上的 GPU 固件 (start.elf)。如果验证成功,启动加载器将运行内核。

然后,内核初始化硬件并挂载根文件系统。如果启用了磁盘加密,initramfs 将检索存储在 OTP 中的设备唯一密钥,并使用它在挂载之前解密根文件系统,之后正常的操作系统启动过程继续进行。更多信息请参见 磁盘加密启动流程

磁盘加密启动流程

树莓派设备上的磁盘加密通过使用 LUKS 加密根文件系统,并将解锁密钥绑定到使用 OTP 的设备上来保护根文件系统,如 启动流程时间线 中所述。

默认情况下,Raspberry Pi OS 不支持加密的根文件系统;如果您需要磁盘加密,则必须构建自己的加密存储,或使用树莓派 安全启动配置工具 在配置期间启用加密。有关此工具的信息,请参阅 安全启动配置

磁盘加密在配置期间进行设置。对于使用 rpi-image-gen 创建的操作系统镜像,根文件系统和任意数量的附加分区可以被加密。对于使用 pi-gen 创建的镜像,只有根文件系统可以被加密。无论使用哪种镜像生成方法,都需要一个受信任但未加密的预启动认证环境,以允许设备启动并解锁加密存储。该环境包括树莓派固件、Linux 内核、设备树文件和最小用户空间,并通过使用客户签名密钥的数字签名(而非加密)进行认证。

对于配置了磁盘加密的树莓派设备,启动过程从 启动流程时间线 的第三阶段继续,因此本质上是建立完整信任链的第四步。启动加载器从 预启动认证环境 中将(未加密的)Linux 内核和 initramfs(临时根文件系统)加载到 RAM 中。由于真正的根文件系统仍然被加密且无法访问,内核最初从 initramfs 运行。initramfs 中的早期启动脚本调用 rpi-fw-crypto 来派生磁盘专用密码短语,解锁 LUKS 卷,然后挂载真正的根文件系统。内核随后切换到此已解锁的根文件系统,正常的 Linux 启动继续进行。

initramfs 必须包含实现您选择使用的加密密码的内核模块。为了优化性能,默认的密码建议因树莓派芯片而异,如下表所示。

各树莓派 SoC 的默认 LUKS 加密密码:

芯片LUKS 加密说明
BCM2712 设备AES (aes-xts-plain64)BCM2712 SoC 具有 AES 加密的硬件加速功能,这意味着在配备 BCM2712 芯片的设备上加密速度更快,CPU 负载更低,存储吞吐量更大。
BCM2711 设备AES (aes-xts-plain64)BCM2711 SoC 也能高效处理 AES 加密。
BCM2837、BCM2837B0 和 RP3A0 设备Adiantum (ChaCha20)对于使用 BCM2837 和 BCM2837B0 SoC 以及 RP3A0 SiP 的旧款树莓派型号,建议使用 Adiantum 以获得更好的性能。

Raspberry Pi OS 中的软件组件

Raspberry Pi OS 是 Debian 的衍生版本,提供了一系列免费和开源的安全组件,可用于保护您的设备。标准的 Debian 软件包包括:

  • OpenSSL,一个安全套接字和密码学库。
  • PAM,可插拔认证模块系统。
  • LUKS,Linux 统一密钥设置系统,用于配置和使用存储加密。
  • AppArmor,一个强制访问控制系统,用于约束程序和用户。
  • UFW,Uncomplicated FireWall,用于配置网络防火墙。

除了 Debian 项目提供的各种组件外,Raspberry Pi OS 还提供 rpi-fw-crypto,这是一个库和程序,用于使用 VideoCore 协处理器以设备唯一密钥加密和签名数据。