×

使用ZYMKEY加密Raspberry Pi上的根文件系统

消耗积分:0 | 格式:zip | 大小:0.00 MB | 2023-06-16

周棠亨

分享资料个

描述

为什么要加密?

对 Raspberry Pi 上的根文件系统 (RFS) 进行加密的原因有很多,从保持 WiFi 凭证不可变到防止专有软件和敏感数据被克隆。对于许多 Raspberry Pi 配置,仅存在两个分区:

  • /启动 /dev/mmcblk0p1
  • /上/dev/mmcblk0p2

因此,将根分区加密作为加密所有内容的一种方式是有意义的。

介绍卢克斯

LUKS ( L inux Unified Key S etup ) 是 dm - crypt的流行密钥管理设置,它是 Linux 块设备加密的事实标准。

LUKS 为多个用户(和服务)提供了一个强大而灵活的机制来连接和访问 Linux 的“ dm-crypt ”基础设施。

dm-crypt是 Linux 内核 2.6 及更高版本中的透明磁盘加密子系统,是设备映射器基础架构的一部分,并使用来自内核 Crypto API 的加密例程。两者都在 IT 社区中被广泛使用和理解。

单一万能钥匙的缺点

dm-crypt 有一个主密钥,用于加密/解密块内/外的数据。为了确保长期安全并应对不断变化的授权用户/服务,有必要经常更改主密钥,并可能定期与多个用户/服务共享它。主密钥的每一次新迭代都需要每次都对底层数据块进行重新加密。在实际系统中,由不同的用户/服务接触,这是不切实际的。

分级密钥管理

一个更实用的解决方案是进行分层密钥管理设置,其中为用户/服务提供用于释放 MasterKey 的用户密钥。用户密钥可以很容易地更改和撤销,而无需重新加密底层数据块。这样一个分层密钥管理器的管理就是 LUKS 的角色。

在这篇文章中,我们将展示如何使用 Zymkey 锁定用户密钥,该用户密钥随后用于解锁主密钥并提供对根文件系统的访问。如果您想了解更多关于 LUKS 的信息,请参阅本文底部的参考资料。

 
poYBAGNy4A-AObsFAAEZdYr0sSQ767.png
 

LUKS 用户密钥的安全存储

LUKS 加密 RFS 的安全效力很大程度上取决于用户密钥的生成方式和存储位置。

Pi SD 卡不是安全的存储位置

不断壮大的 Raspberry Pi 家族很棒,我们喜欢它!它价格低廉,具有令人难以置信的嵌入式设备计算能力,并且具有非常强大的软件开发生态系统。

然而,Raspberry Pi 有一个致命弱点:SD 卡是主要的软件部署媒体,它可以很容易地移除和操作。

自然倾向是使用 dm-crypt 上的 LUKS 加密文件系统,但对于许多部署单元的无人值守使用,显而易见的问题是:LUKS 密钥存储在哪里?当然是文件系统。即使您尝试通过各种程序化手段对其进行混淆,密钥仍然很容易受到攻击。

使用 Zymkey 安全模块保护 LUKS 用户密钥。

 
pYYBAGNy4BKAf64eAADN2fzsJko198.png
 

Zymkey 提供了一种通用的“锁定”服务,通过该服务对纯文本数据块进行加密和签名。

当与 LUKS 一起使用时,用户密钥被发送到 Zymkey 以在文件系统创建时被锁定(加密和签名)。当系统启动并需要解密根文件系统时,锁定的 LUKS 密钥被“解锁”(签名验证和内容解密)并呈现给 dm-crypt。如果密钥已成功解锁,则启动过程会正常继续。以下是 LUKS/dm-crypt 文件系统的启动顺序,其中密钥受 Zymkey 保护:

  • 内核初始化initramfs
  • initramfs 将锁定的 LUKS 密钥提供给 Zymkey
  • Zymkey 验证签名并解密密钥 *
  • 解密后的密钥被提交给 LUKS,然后根文件系统被解密

*要求 Zymkey 操作状态为“安全”

 
poYBAGNy4BSALBsNAAEAYZVTkAE842.png
 

Zymkey 在解锁 LUKS 密钥之前验证主机系统

Zymkey 的主要功能之一是根据测量特定系统组件的指纹为主机系统生成唯一身份 (ID)。此指纹识别过程用于将特定 Zymkey(信任根、密钥存储、加密服务)、特定主机和特定 SD 卡“绑定”在一起。一旦绑定,这些组件就形成了主机系统的永久且不可变的 ID。

每次 Pi 启动时,以及之后的随机间隔,Zymkey 都会重新检查 ID 指纹。如果任何系统组件更改了指纹更改并且系统被认为已被破坏,则身份验证失败并且所有安全服务都将关闭。

使用此 ID / 身份验证功能,Zymkey 可用于在无人看管的应用程序中保护 LUKS 用户密钥,在这些应用程序中,可以轻松删除和复制 SD 卡内容。(Zymkey 还具有其他物理安全功能,也可用于锁定/启用安全服务)

 
pYYBAGNy4BaATKcTAADjfPgKsQw816.png
 

在哪里存储您的 LUKS 加密 RFS

LUKS 用途广泛,可应用于 SD 卡和外部存储介质。让我们回顾一下每个选项的优缺点:

选项 1 - 将现有 SD 卡转换为 LUKS

转换 SD 卡上现有的根文件系统仍然需要一个外部设备(例如 USB 闪存驱动器)用作临时引导根文件系统:这为转换和复制原始内容提供了一种更简单、风险更低的方法。外部设备需要比现有的根文件系统大一点,以便存储旧的文件系统。

优点:

  • 更少的物理空间要求。
  • 所需的功率要少得多。

缺点:

  • 与迁移到外部驱动器相比,转换更加复杂和耗时。
  • 数据空间限制。
  • 写周期约束。
  • 访问速度限制。

工艺步骤:

  • 制作原始根文件系统的 tarball 并将其存储在外部设备上
  • 将原始根文件系统文件复制到外部设备,形成临时文件系统
  • 引导至临时文件系统。启动后,临时文件系统将
    创建一个 LUKS 密钥
    b. 用 zymkey
    c 锁定 LUKS 键。在原始根分区上创建一个 LUKS 卷
    d. 在原始根分区的 LUKS 卷上创建一个 ext4 分区
    e。将根文件系统 tarball 解压到转换后的分区中

选项 2 - 将现有 SD 卡迁移到外部 LUKS 存储设备。

现有的根文件系统可以迁移到外部 LUKS 加密的 USB 闪存、硬盘或 SSD。

优点:

  • 外部设备可以保存更多数据。
  • 迁移比 SD 卡转换方法更容易、更快捷。
  • 一些外部设备的数据访问速度比 SD 卡快得多。
  • 一些外部设备(例如 HDD)可以承受比 SD 卡更多的写入周期。

缺点:

  • 对于 HDD 和 SSD 以及非紧凑型 USB 闪存设备,还有额外的电源要求。
  • 除了紧凑型 USB 闪存设备外,物理空间需求也随之增加。这对于 Raspberry Pi Zero 系列来说可能尤其重要。

工艺步骤:

  • 创建 LUKS 密钥
  • 锁定 LUKS 键
  • 在外部 USB 设备上创建 LUKS 卷
  • 在 LUKS 卷上创建一个 ext4 分区
  • 将现有的根文件系统移动到外部设备上的 LUKS 卷
  • 引导到新的根文件系统并擦除以前的根卷

构建你的 LUKS 加密 RFS

先决条件

确保您的 Zymkey 软件套件已经在运行和运行,并确保您的 Zymkey 已绑定。此处的说明:(入门:ZYMKEY4i 与 RASPBERRY PI )。

注意:对于带有 eMMC 的 CM4/IO 模块,由于默认禁用 USB 2.0 端口,因此需要执行额外的步骤:

  • 升级引导加载程序版本:2021 年 1 月 16 日
  • 设置启动顺序以允许从 USB 启动:0xf15
  • 修改 /boot/config.txt 并在 [all] 下添加“otg_mode=1”行。如果添加,这将替换“dtoverlay=dwc2, dr_mode=host”行。

选项 1 - 将现有 SD 卡转换为 LUKS

要将您的根文件系统转换为 LUKS/dm-crypt,您需要连接一个外部 USB 磁盘(作为临时存储)。如前所述,这是必要的,因为不可能就地加密分区,因此在进行转换时需要外部磁盘作为临时存储和临时根文件系统。外部磁盘需要至少是根分区的两倍。接下来,运行以下脚本:

curl -G https://s3.amazonaws.com/zk-sw-repo/mk_encr_sd_rfs.sh | sudo bash

该脚本是参数化的,因此如果您有特殊要求(例如根文件系统位于 /dev/mmcblk0p4 上),您可以通过以下方式调用它:

curl -G https://s3.amazonaws.com/zk-sw-repo/mk_encr_sd_rfs.sh | sudo bash -s -- -x -m

在上面没有参数的调用中,默认值为:

  • 位于 /dev/mmcblk0p2 的原始根文件系统
  • 位于 /dev/sda 上的原始根 tarball 的临时根文件系统/存储
  • 临时根文件系统占用整个新设备

在新的临时外部 USB 磁盘上首次运行此脚本可能需要很长时间。此外,在脚本完成之前需要重新启动两次。

需要注意的一点是,如果外部存储设备上有一个带有原始根文件系统分区(例如 /dev/mmcblk0p2)的 ext4 格式化分区,此脚本将使用外部存储设备上已有的内容来转换 SD卡片。这减少了转换大量 Pi 根文件系统的时间,并允许在大规模生产部署中使用该脚本。

在带有连接 USB SSD 作为裸 Jessie “完整”版本 (~4GB) 的外部设备的 Pi3 上,此脚本的第一次运行需要大约一个小时才能完成第一阶段。第二阶段大约需要 15 分钟。

具有 Jessie“精简版”(约 1.6GB)的同一平台在第 1 阶段大约需要 20 分钟,在第 2 阶段需要 5 分钟。

综上所述,使用格式化后的外接设备转换后续单位只需 15/5 分钟。

选项 2 - 将现有 SD 卡迁移到外部 LUKS 存储设备。

要将根文件系统迁移到外部 USB 设备,可以运行以下脚本:

curl -G https://s3.amazonaws.com/zk-sw-repo/mk_encr_ext_rfs.sh | sudo bash

该脚本是参数化的,因此如果您有特殊要求,可以通过以下方式调用:

curl -G https://s3.amazonaws.com/zk-sw-repo/mk_encr_ext_rfs.sh | sudo bash -s -- -x -p -m

在上面没有参数的调用中,默认值为:

  • 位于 /dev/mmcblk0p2 的原始根文件系统
  • 位于 /dev/sda1 的新根文件系统
  • 新的根文件系统占用了整个新设备

请注意,新的根文件系统至少应该比原来的根分区大一点

在根分区约为 16GB(SanDisk Ultra Class 10)的 Pi Model 3 上运行此脚本,其中包含基本 Jessie 安装以及 Zymkey 软件套件(~1GB)到32GB SanDisk Cruzer Fit大约需要 30-40 分钟。Zymkey 的 LED 快速闪烁,直到该过程完成。

将 LUKS 集成到批量制造工作流程中

上面的示例旨在帮助您启动和运行单个和低容量的应用程序。

如果您在开发大批量制造加密工作流程方面需要支持,请联系我们讨论我们的 OEM 工程服务。

参考


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !