> For the complete documentation index, see [llms.txt](https://rpicn.bsdcn.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://rpicn.bsdcn.org/an-quan/an-quan-jia-gou.md).

# 安全架构

本页从高层概念层面概述树莓派设备在启动和存储访问期间如何保护自身。本页概述：

* 在配置后，树莓派**安全（验证）启动**（Secure Boot）过程中使用的信任链。
* 当与安全启动一起启用时，**磁盘加密**如何集成到启动过程中。
* 树莓派系统中可提供安全功能的**软件组件**。

> **注意**
>
> 要实施**安全启动**和**加密**，我们建议使用安全启动配置器，它可以在多台设备上配置和部署安全启动与磁盘加密。更多信息和操作说明，请参阅[安全启动配置器](/an-quan/an-quan-qi-dong-pei-zhi-qi.md)。

## 安全启动信任链

与所有计算机一样，树莓派启动时会经历一个启动过程：它首先运行底层固件，然后加载操作系统（OS）。

安全启动通过建立信任链，确保在此过程中只运行经过身份验证的软件。信任链中的每个阶段（环节）都会在下一阶段运行前对其进行密码学验证。这确保启动期间只运行由受信任来源签名的代码。

我们建议使用树莓派安全启动配置器为设备配置安全启动，并选择性地启用磁盘加密。更多信息和操作说明，请参阅[安全启动配置器](/an-quan/an-quan-qi-dong-pei-zhi-qi.md)。

### 密码学组件

安全启动信任链始于不可变的硬件，并延伸至客户软件。它由以下密码学组件组成：

* **Boot ROM 公钥。** Boot ROM 是不可变的硬件信任根，其中包含烧录在硅片中的树莓派公钥。此密钥用于验证由树莓派签名的固件。
* **客户生成的 RSA 密钥对。** 在配置树莓派设备之前，你（客户）要生成自己的 RSA 公私钥对。私钥用于为操作系统的启动镜像签名。使用树莓派安全启动配置器时，你把公钥的身份标识（哈希值）存储在设备的 OTP 中，从而定义启动时信任哪个密钥。
* **设备唯一的磁盘密钥。** 安全启动配置器生成设备唯一的密钥，用于在启动时解锁加密的根文件系统。该密钥存储在 OTP 中，并受软件机制保护。

### 启动流程时间线

使用树莓派安全启动配置器设置的安全启动过程建立了信任链，该信任链始于不可变硬件，并一直延伸到操作系统。以下各节概述此过程的每个阶段，以及启用磁盘加密后它如何集成到启动流程中。

如果所有验证步骤都成功，内核开始运行，然后挂载根文件系统；如果同时也通过安全启动配置器启用了[磁盘加密](#磁盘加密启动流程)，则会先解密根文件系统。

如果任一验证步骤失败，信任链即被破坏，EEPROM 引导加载程序不会继续运行不受信任的软件；相反，EEPROM 引导加载程序会转而使用你配置的下一种启动方式，例如另一个分区、镜像或恢复模式。

#### 第一阶段：boot ROM 信任根

第一阶段是嵌入每台树莓派设备 SoC 中的 Boot ROM。由于它永久烧录在硅片中，制造后无法修改，并且按设计即受信任；因此它构成了安全启动过程的硬件信任根。

Boot ROM 会读取存储在一次可编程（OTP）存储器中的 **RSA 2048 位公钥**哈希值。在使用 BCM2712 SoC 的树莓派设备上，该密钥对还用于为 EEPROM 引导加载程序签名，详见[第二阶段](#第二阶段eeprom-引导加载程序验证)。这扩展了 BCM2711 SoC 的检查，还要求使用客户密钥签名来验证 EEPROM 引导加载程序。

#### 第二阶段：EEPROM 引导加载程序验证

第二阶段是 EEPROM 引导加载程序，它存储在树莓派设备的 SPI 闪存 EEPROM 中，并由树莓派安全启动配置器更新。此引导加载程序的数字签名使用嵌入 Boot ROM 的树莓派公钥进行验证。然后，EEPROM 引导加载程序会根据存储在 OTP 中的哈希值检查客户的公钥，确保只有经过授权的客户密钥才能用于后续阶段。

#### 第三阶段：内核与操作系统

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

随后，内核初始化硬件并挂载根文件系统。如果启用了磁盘加密，启动过程将按照[第四阶段](#第四阶段加密根文件系统解锁)中概述的流程继续。否则，内核挂载根文件系统，正常的操作系统启动过程继续。

#### 第四阶段：加密根文件系统解锁

当磁盘加密作为安全启动配置器设置的一部分启用时，就会进入第四阶段。

`initramfs` 会从 OTP 中取出设备唯一的密钥，用它解密根文件系统，然后再挂载，之后正常的操作系统启动过程继续。

有关磁盘加密以及加密根文件系统如何解锁的更多详细信息，请参阅[磁盘加密](#磁盘加密启动流程)。

## 磁盘加密启动流程

树莓派设备上的磁盘加密通过 LUKS 加密根文件系统，并使用 OTP 将磁盘专属口令绑定到设备，从而保护根文件系统，详见[启动流程时间线](#启动流程时间线)。

默认情况下，树莓派系统不支持加密的根文件系统；如果需要磁盘加密，你必须自行构建加密存储，或使用树莓派**安全启动配置器**工具在配置过程中启用加密。有关此工具的信息，请参阅[安全启动配置器](/an-quan/an-quan-qi-dong-pei-zhi-qi.md)。

对于使用 `rpi-image-gen` 创建的操作系统镜像，可以加密根文件系统以及任意数量的额外分区。对于使用 `pi-gen` 创建的镜像，只能加密根文件系统。无论使用哪种镜像生成方法，都需要一个受信任但未加密的预启动身份验证环境，以便设备启动并解锁加密存储。此环境包括树莓派固件、Linux 内核、设备树文件和最小用户空间，并且通过使用客户签名密钥的数字签名进行验证，而不是通过加密来验证。

对于配置了磁盘加密的树莓派设备，启动过程从启动流程时间线中的[第三阶段](#第三阶段内核与操作系统)继续，因此它本质上是建立完整信任链的第四步。引导加载程序将（未加密的）Linux 内核和 `initramfs`（临时根文件系统）从**预启动身份验证环境**加载到 RAM。由于真正的根文件系统仍处于加密状态且尚无法访问，内核最初从 `initramfs` 运行。`initramfs` 中的早期启动脚本会调用 `rpi-fw-crypto` 派生磁盘专属口令、解锁 LUKS 卷并挂载真正的根文件系统。随后内核切换到该已解锁的根文件系统，Linux 的正常启动过程继续。

`initramfs` 必须包含实现你所选加密算法的内核模块。为优化性能，默认的加密算法建议因树莓派 SoC 或 SiP 而异，如下表所示。

*不同树莓派 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 以获得更好的性能。 |

## 树莓派系统中的软件组件

树莓派系统是 Debian 的衍生版本，提供了一系列免费开源的安全组件，可用于保护你的设备。标准的 Debian 软件包包括：

* OpenSSL，一个安全套接字和密码学库。
* PAM，可插拔身份验证模块系统。
* LUKS，Linux 统一密钥设置系统，用于配置和使用存储加密。
* AppArmor，强制访问控制系统，用于约束程序和用户。
* [Fail2Ban](https://rpicn.bsdcn.org/an-quan/pages/zf0nlaz1V1yMmgrv17UV#使用-fail2ban-阻止可疑活动)，一个可选软件包，用于监控系统日志并封禁表现出恶意活动的 IP 地址。
* [UFW](/an-quan/ufw-fang-huo-qiang.md)，简单防火墙（Uncomplicated FireWall），用于配置网络防火墙。

除了 Debian 项目提供的各种组件外，树莓派系统还提供 `rpi-fw-crypto`，这是一个库和程序，用于借助 VideoCore 协处理器，以设备唯一的密钥加密和签名数据。
