我正在开发一个可以在多个平台上运行的嵌入式 Linux 项目。一个使用 e.MMC 进行存储,另一个使用 NAND 闪存。我想加密所有文件系统(主要是为了防止有人拆下闪存芯片并将它们放入阅读器中)。我想尝试并尽可能在这两种硬件类型上保持一种通用方法。两者之间的一大区别是磨损均衡是在 e、MMC 的硬件中,而对于 NAND,我将使用 UBI。
对于根文件系统,我正在考虑使用使用 dm-crypt 保护的 squashfs。对于 NAND 设备,我已经尝试过了,我可以在 ubiblock 之上分层 dm-crypt,然后使用设备映射器加载 squashfs。这很好地映射到 e.MMC 世界,唯一的区别是设备映射器位于 gpt 分区而不是 ubiblock 设备上。
我的挑战是其他读/写文件系统。我想在只读根和数据分区之上安装一个覆盖文件系统。我希望这两个也被加密。我一直在研究 fscrypt 如何帮助我。(我相信 dm-crypt 不适用于 ubifs)。
对于 e.MMC 上的文件系统,我将使用 ext4 和 NAND ubifs。文档说这两个都支持 fscrypt。我很难找到有关如何将其与 ubifs 一起使用的详细文档(ext4 有更多),但我认为在每个文档的实现方式之间存在一些差异,我希望那些了解更多以确认这一点。
在 NAND 方面,我只能通过使用 fscryptctl 工具(https://github.com/google/fscryptctl )而不是功能更全面的 fscrypt 工具( https://github.com/google )来使其工作/fscrypt )。这是按照我在补丁中找到的将 fscrypt 支持添加到 mkfs.ubifs 的说明:
https://patchwork.ozlabs.org/project/linux-mtd/cover/20181018143718.26298-1-richard@nod.at/
这似乎使用提供的密钥加密分区上的所有文件。当我在 ext4 上查看 fscrypt 时,您似乎无法做到这一点。根目录本身不能加密,只有子目录。在这里阅读: https ://www.kernel.org/doc/html/v4.17/filesystems/fscrypt.html它说:
“请注意,ext4 文件系统不允许对根目录进行加密,即使它是空的。想要用一个密钥加密整个文件系统的用户应该考虑改用 dm-crypt。”
所以这是不同的。似乎使用 ubifs 我不能像在 ext4 中那样对子目录应用加密。这里的 README.md https://github.com/google/fscryptctl给出了一个使用 ext4 的例子。这会加密一个名为 test 的子目录。我看不到如何使用 ubifs 做同样的事情。有人可以帮助我吗?
我一直在使用 NANDSIM 内核模块进行测试。这篇文章的最后是一个用于构建加密覆盖 ubifs 文件系统的脚本。如您所见,mkfs.ubifs 直接获取密钥,并且似乎将其应用于分区上的所有文件。您不能将策略应用到任何子目录,因为它们已经加密。
我想使用用户空间 fscrypt 工具提供的其他一些功能,例如保护器(所以我不需要直接使用主密钥)。但是,我看不到任何方法可以让用户空间 fscrypt 工具在 ubifs 上设置加密。用户空间 fscrypt 命令在分区的根目录中创建一个 .fscrypt 目录来存储有关策略和保护程序的信息。这似乎更适合根本身未加密的 ext4 实现。
当我尝试使用“fscrypt setup”设置未加密的 ubifs 时,我遇到了麻烦,因为制作标准 ubifs 似乎创建了 v4 ubifs 格式版本,而不是所需的 v5。这意味着“fscrypt encrypt”命令失败。(在 dmesg 输出中可以看到这样的错误
[12022.576268] UBIFS error (ubi0:7 pid 6006): ubifs_enable_encryption
[ubifs]: on-flash format version 5 is needed for encryption).
有没有办法让 mkfs.ubifs 创建一个未加密的 v5 格式文件系统?还是 v5 意味着加密?
这是我使用 fscryptctl 工具创建加密 ubifs 的脚本:
#!/bin/bash
MTD_UTILS_ROOT=../../mtd-utils
FSCRYPTCTL=../../fscryptctl/fscryptctl
MOUNTPOINT=./mnt
dd if=/dev/urandom of=overlay.keyfile count=64 bs=1 # XTS needs a 512bit key
descriptor=`$FSCRYPTCTL get_descriptor < overlay.keyfile`
$MTD_UTILS_ROOT/mkfs.ubifs --cipher AES-256-XTS --key overlay.keyfile
-m 2048 -e 129024 -c 32 -r ./overlay -o overlay.enc.img
$MTD_UTILS_ROOT/ubiupdatevol /dev/ubi0_6 overlay.enc.img
# Try it out
$FSCRYPTCTL insert_key < overlay.keyfile
key=`keyctl show | grep $descriptor | awk '{print $1}'`
mount -t ubifs /dev/ubi0_6 $MOUNTPOINT
ls $MOUNTPOINT
umount $MOUNTPOINT
keyctl unlink $key
注意我一直在 5.4 内核上使用 mtd-utils v2.1.2。