NVDIMM 安全性¶
1. 简介¶
随着 Intel 设备特定方法 (DSM) v1.8 规范 [1] 的引入,引入了安全 DSM。该规范添加了以下安全 DSM:“获取安全状态”、“设置密码”、“禁用密码”、“解锁单元”、“冻结锁定”、“安全擦除”和“覆盖”。为了支持安全操作,在结构体 dimm 中添加了 security_ops 数据结构,并公开了通用 API 以允许供应商中立操作。
2. Sysfs 接口¶
“安全”sysfs 属性在 nvdimm sysfs 目录中提供。例如:/sys/devices/LNXSYSTM:00/LNXSYBUS:00/ACPI0012:00/ndbus0/nmem0/security
该属性的 “show” 属性将显示该 DIMM 的安全状态。以下状态可用:已禁用、已解锁、已锁定、已冻结和覆盖。如果不支持安全,则 sysfs 属性将不可见。
当写入 “store” 属性时,它接受几个命令,以支持一些安全功能:update <旧密钥 ID> <新密钥 ID> - 启用或更新密码。disable <密钥 ID> - 禁用已启用的安全并删除密钥。freeze - 冻结安全状态的更改。erase <密钥 ID> - 删除现有用户加密密钥。overwrite <密钥 ID> - 擦除整个 nvdimm。master_update <密钥 ID> <新密钥 ID> - 启用或更新主密码。master_erase <密钥 ID> - 删除现有用户加密密钥。
3. 密钥管理¶
密钥通过 DIMM ID 与有效负载关联。例如:# cat /sys/devices/LNXSYSTM:00/LNXSYBUS:00/ACPI0012:00/ndbus0/nmem0/nfit/id 8089-a2-1740-00000133。DIMM ID 将与密钥有效负载(密码)一起提供给内核。
安全密钥是基于每个 DIMM 单个密钥进行管理的。密钥“密码”的长度应为 32 字节。这类似于 ATA 安全规范 [2]。密钥最初是在 nvdimm 解锁期间通过 request_key() 内核 API 调用获取的。用户有责任确保所有密钥都位于内核用户密钥环中以进行解锁。
格式为 enc32 的 nvdimm 加密密钥的描述格式为:nvdimm:<总线提供商特定的唯一 ID>
有关创建 enc32 格式的加密密钥,请参阅文件 Documentation/security/keys/trusted-encrypted.rst
。首选将 TPM 与主受信任密钥一起使用来密封加密密钥。
4. 解锁¶
当内核枚举 DIMM 时,内核将尝试从内核用户密钥环检索密钥。这是唯一可以解锁锁定 DIMM 的时间。解锁后,DIMM 将保持解锁状态,直到重新启动。通常,一个实体(即 shell 脚本)会在 initramfs 阶段将所有相关的加密密钥注入内核用户密钥环。这为解锁功能提供了对所有相关密钥的访问权限,这些密钥包含相应 nvdimm 的密码。还建议在 modprobe 加载 libnvdimm 之前注入密钥。
5. 更新¶
进行更新时,应从内核用户密钥环中删除现有密钥,并以不同的(旧)密钥重新注入。旧密钥的密钥描述是什么并不重要,因为我们在进行更新操作时只对密钥 ID 感兴趣。还应使用本文档前面描述的描述格式注入新密钥。写入 sysfs 属性的更新命令格式为:update <旧密钥 ID> <新密钥 ID>
如果由于启用了安全而没有旧密钥 ID,则应传入 0。
6. 冻结¶
冻结操作不需要任何密钥。具有 root 特权的用户可以冻结安全配置。
7. 禁用¶
安全禁用命令格式为:disable <密钥 ID>
与 nvdimm 关联的当前密码有效负载的密钥应在内核用户密钥环中。
8. 安全擦除¶
执行安全擦除的命令格式为:erase <密钥 ID>
与 nvdimm 关联的当前密码有效负载的密钥应在内核用户密钥环中。
9. 覆盖¶
执行覆盖的命令格式为:overwrite <密钥 ID>
如果未启用安全,则可以在没有密钥的情况下进行覆盖。可以传入密钥序列 0 来表示没有密钥。
可以轮询 sysfs 属性 “security” 以等待覆盖完成。覆盖可能持续数十分钟或更长时间,具体取决于 nvdimm 的大小。
应注入与 nvdimm 关联的具有当前用户密码的加密密钥,并应通过 sysfs 传入其密钥 ID。
10. 主更新¶
执行主更新的命令格式为:update <旧密钥 ID> <新密钥 ID>
主更新的操作机制与更新相同,只是将主密码密钥传递给内核。主密码密钥只是另一个加密密钥。
仅当禁用安全时,此命令才可用。
11. 主擦除¶
执行主擦除的命令格式为:master_erase <当前密钥 ID>
此命令具有与擦除相同的操作机制,只是将主密码密钥传递给内核。主密码密钥只是另一个加密密钥。
只有在启用主安全时,此命令才可用,这由扩展的安全状态指示。
[1]: https://pmem.io/documents/NVDIMM_DSM_Interface-V1.8.pdf
[2]: http://www.t13.org/documents/UploadedDocuments/docs2006/e05179r4-ACS-SecurityClarifications.pdf