工控網首頁
>

應用設計

>

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