工控网首页
>

应用设计

>

Yocto meta-toradex-security layer 创建加密数据分区应用说明

Yocto meta-toradex-security layer 创建加密数据分区应用说明

简介

上一篇文章中我们已经介绍如何使用 meta-toradex-securitylayer 创建一个单独的分区。接下来我们将说明,如何在该分区上使用加密功能,读写性能测试,如果你还感兴趣,最后部分内容将阐述分区加密背后的原理。技术实现细节隐藏在 meta-toradex-security 的 recipes 里面,用户能够仅使用几行简单的配置即可开启分区加密。

Yocot Project 配置 和之前的文章一样,首先需要搭建 Yocto Project 编译环境。这里我们将以 Verdin iMX8MP 为例进行介绍。在 local.conf 的结尾添加下面两行配置即可。INHERIT += "tdx-tezi-data-partition tdx-encrypted" TDX_ENC_STORAGE_LOCATION = "/dev/mmcblk2p3"tdx-encrypted被添加后,所编译的镜像中就能够使用分区加密。'TDX_ENC_STORAGE_LOCATION' 用于配置需要加密的分区。在 Verdin iMX8MP 上 eMMC 会被挂载到 /dev/mmcblk2 下面,mmcblk2p3 是需要新创建的第三个分区。'TDX_ENC_STORAGE_LOCATION' 也可以设置为 /dev/sda1 或者 /dev/mmcblk0p1,分别对应外部的 U 盘、SD 卡等。 为了提供加密的安全性和效率,meta-toradex-security 可以利用加密运算单元,例如 iMX8M Plus SoC 上的 CAAM(Cryptographic Accelerator and Assurance Module)模块。当然也支持外部的 TPM,例如在 Verdin AM62 上由于没有 SoC 内置的加密运算单元,meta-toradex-security 则能够使用底板上的 TPM,如 Mallow 底板。对于使用 TPM 的模块,local.conf 中还需要添加 TDX_ENC_KEY_BACKEND = "tpm"。 然后使用 bitbake 命令编译镜像即可。 bitbake tdx-reference-minimal-image当安装完系统并重启后,可以看到 /dev/mapper/encdata,这就是 /dev/mmcblk2p3 分区 DATA 对应的加密设备,它被挂载到 /run/encdata 目录下。在 local.conf 文件中 TDX_ENC_STORAGE_MOUNTPOINT 参数可以用来更改挂载路径。 ~# mount -l /dev/mapper/encdata on /run/encdata type ext4 (rw,relatime) Linux 的文件系统 RFS 使用非加密分区,我们将分别往加密的 /run/encdata 和非加密的 /home/root 目录下写入和读取 1GB 的文件,对比加密操作对读写文件的影响。

#write fio --name=test --filename=testfile.tmp --size=1G --bs=256k --iodepth=64 \   --readwrite=write --direct=1 --ioengine=libaio --gtod_reduce=1 

#read  fio --name=test --filename=testfile.tmp --size=1G --bs=256k --iodepth=64 \ --readwrite=read --direct=1 --ioengine=libaio --gtod_reduce=1

测试结果如下:

/run/encdata/home/root
写入 1GB 文件32.8MB/s61.9MB/s
读取 1GB 文件32.6MB/s314MB/s

实现原理 如前面介绍,借助 meta-toradex-security 开启和使用加密分区是非常简单的,对于应用程序来讲,底层的加密是透明的。如果你还对实现原理感兴趣,请继续阅读下面的内容。

i.MX8 SoC 上有一个 CAAM 模块可以用于密钥生成、加密和解密运算。通常用户不会直接调用 CAAM API 进行相关操作。为了更好地保护密钥,我们使用 Linux 的一个内核功能Trusted Keys。Trusted Keys 能够在内核空间中生成和维护一个密钥,而在用户空间中则是该密钥的加密文件(encrypted blobs),用户空间中无法直接访问到密钥。密钥的加密和解密是在 CAAM 上完成,而 CAAM 就是 Trusted Keys 的 Trust Source。对于没有 CAAM 作为 Trust Source 的平台,例如 Verdin AM62,我们还可以使用外部的 TPM,甚至是 TEE (Trusted Execution Environment)。这些在 meta-toradex-security 中均得到支持。

另外一个内核功能dm-crypt实现了透明的分区加密。dm-crypt 会使用一个密钥用于加密需要写入到 /run/encdata 目录下文件。该密钥可以存储在文件系统分区 RFS 的一个目录下,默认配为 /var/local/private/.keys/tdx-enc-key.blob。如果 RFS 是只读文件系统,tdx-enc-key.blob 也可以直接存放在 eMMC 上。但 tdx-enc-key.blob 并是直接用于加密和解密的密钥。如前面提到的,密钥的维护是由 Trusted Keys 实现。

在 CAAM 中首先生成一个密钥 encryption key,该密钥不会离开 CAAM。该密钥通过同样位于 CAAM 的 Test key 或者 OTPMK Key 加密后,交给位于 kernel space 的 Trust Keys 维护。Trust Keys 为 dm-crypt 映射一个密钥,并存放在 /var/local/private/.keys/tdx-enc-key.blob。当位于 user space 的应用程序需要读写 /run/encdata 的文件时,dm-crypt 将 tdx-enc-key.blob 提交给 Trusted Keys。Trusted Keys 在 kernel space 中找到对应的密钥,然后将该密钥交给 CAAM。在 CAAM 中可以使用 Test key 或者 OTPMK Key 解密出 encryption key。并在 CAAM 中使用 encryption key 完成加密或者解密数据。这个过程中 Test key/OTPMK Key 和 encryption key 始终不会离开 CAAM,并且加密和解密操作也均在 CAAM 中进行。由于 /var/local/private/.keys/tdx-enc-key.blob 并不是直接用于加密和解密的密钥。因此,即使该密钥泄漏,也不会导致原来位于 /run/encdata 的数据被破解。

对于使用 CAAM 的模块,例如 Verdin iMX8MM、Verdin iMX8MP、Apalis iMX8QM 等,如果没有开启 Secure Boot 功能,如前面提到,CAAM 会使用预制的 Test key 来加密密钥,这是不安全的,也不推荐在生产环境中使用。开启 Secure Boot 功能后,CAAM 则使用 OTPMK Key 来加密密钥。这是一个 256bit 随机生产的密钥,在 fuse 设备的时候烧录到 CAAM 中。因此该密钥必须妥善保管。

总结 借助 meta-toradex-security,用户能够轻松而安全地使用加密分区,保护数据和应用。更多来自 meta-toradex-security 实用功能,我们将在后续文章介绍,敬请关注。

审核编辑(
王静
)
投诉建议

提交

查看更多评论
其他资讯

查看更多

NXP iMX8MP ARM 平台多屏幕克隆显示测试

Yocto meta-toradex-security layer 创建独立数据分区

NXP iMX8MP ARM 平台 EMQX 部署测试

NXP iMX8QM 通过 SCFW 隔离 AP_M4 核资源

上手测试 Hailo:在 Toradex 模块上加速边缘 AI