NVDIMM 安全性¶
1. 簡介¶
隨著 Intel 裝置特定方法 (DSM) v1.8 規範 [1] 的引入,引入了安全 DSM。該規範添加了以下安全 DSM:“獲取安全狀態”、“設定密碼”、“停用密碼”、“解鎖單元”、“凍結鎖定”、“安全擦除”和“覆蓋”。為了支援安全操作,struct dimm 中添加了一個 security_ops 資料結構,並公開了通用 API 以允許供應商中立操作。
2. Sysfs 介面¶
在 nvdimm sysfs 目錄中提供了“security”sysfs 屬性。例如:/sys/devices/LNXSYSTM:00/LNXSYBUS:00/ACPI0012:00/ndbus0/nmem0/security
該屬性的“show”屬性將顯示該 DIMM 的安全狀態。以下狀態可用:已停用、已解鎖、已鎖定、已凍結和覆蓋。如果不支援安全性,則 sysfs 屬性將不可見。
當寫入“store”屬性時,它會接受幾個命令,以支援某些安全功能:update <old_keyid> <new_keyid> - 啟用或更新密碼。 disable <keyid> - 停用已啟用的安全性並刪除金鑰。 freeze - 凍結安全狀態的更改。 erase <keyid> - 刪除現有使用者加密金鑰。 overwrite <keyid> - 擦除整個 nvdimm。 master_update <keyid> <new_keyid> - 啟用或更新主密碼。 master_erase <keyid> - 刪除現有使用者加密金鑰。
3. 金鑰管理¶
金鑰透過 DIMM ID 與有效負載相關聯。例如:# cat /sys/devices/LNXSYSTM:00/LNXSYBUS:00/ACPI0012:00/ndbus0/nmem0/nfit/id 8089-a2-1740-00000133 DIMM ID 將與金鑰有效負載(密碼)一起提供給核心。
安全金鑰基於每個 DIMM 一個金鑰進行管理。金鑰“passphrase”預計為 32 位元組長。這類似於 ATA 安全規範 [2]。金鑰最初透過 request_key() 核心 API 呼叫在 nvdimm 解鎖期間獲取。使用者需要確保所有金鑰都在核心使用者金鑰環中以進行解鎖。
格式為 enc32 的 nvdimm 加密金鑰具有以下描述格式:nvdimm:<bus-provider-specific-unique-id>
請參閱檔案 Documentation/security/keys/trusted-encrypted.rst 以建立 enc32 格式的加密金鑰。首選使用帶有主可信金鑰的 TPM 來密封加密金鑰。
4. 解鎖¶
當核心列舉 DIMM 時,核心將嘗試從核心使用者金鑰環中檢索金鑰。這是可以解鎖鎖定的 DIMM 的唯一時間。解鎖後,DIMM 將保持解鎖狀態直到重啟。通常,實體(即 shell 指令碼)會在 initramfs 階段將所有相關的加密金鑰注入到核心使用者金鑰環中。這為解鎖函式提供了訪問所有相關金鑰的許可權,這些金鑰包含相應 nvdimm 的密碼。還建議在 modprobe 載入 libnvdimm 之前注入金鑰。
5. 更新¶
執行更新時,預計將現有金鑰從核心使用者金鑰環中刪除並作為不同的(舊)金鑰重新注入。舊金鑰的金鑰描述是什麼並不重要,因為我們在執行更新操作時只對 keyid 感興趣。還應使用本文件前面描述的描述格式注入新金鑰。寫入 sysfs 屬性的更新命令的格式為:update <old keyid> <new keyid>
如果由於安全啟用而沒有舊的 keyid,則應傳入 0。
6. 凍結¶
凍結操作不需要任何金鑰。具有 root 許可權的使用者可以凍結安全配置。
7. 停用¶
安全停用命令格式為:disable <keyid>
與 nvdimm 繫結的帶有當前密碼有效負載的金鑰應位於核心使用者金鑰環中。
8. 安全擦除¶
執行安全擦除的命令格式為:erase <keyid>
與 nvdimm 繫結的帶有當前密碼有效負載的金鑰應位於核心使用者金鑰環中。
9. 覆蓋¶
執行覆蓋的命令格式為:overwrite <keyid>
如果未啟用安全性,則可以在沒有金鑰的情況下完成覆蓋。可以傳入金鑰序列 0 以指示沒有金鑰。
可以輪詢 sysfs 屬性“security”以等待覆蓋完成。根據 nvdimm 的大小,覆蓋可能持續數十分鐘或更長時間。
應注入與 nvdimm 繫結的帶有當前使用者密碼的加密金鑰,並透過 sysfs 傳入其 keyid。
10. 主更新¶
執行主更新的命令格式為:update <old keyid> <new keyid>
主更新的操作機制與更新相同,只是將主密碼金鑰傳遞給核心。主密碼金鑰只是另一個加密金鑰。
僅當停用安全性時,此命令才可用。
11. 主擦除¶
執行主擦除的命令格式為:master_erase <current keyid>
此命令具有與擦除相同的操作機制,只是將主密碼金鑰傳遞給核心。主密碼金鑰只是另一個加密金鑰。
僅當啟用主安全性(由擴充套件安全狀態指示)時,此命令才可用。
[1]: https://pmem.io/documents/NVDIMM_DSM_Interface-V1.8.pdf
[2]: http://www.t13.org/documents/UploadedDocuments/docs2006/e05179r4-ACS-SecurityClarifications.pdf