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