二、Key per IO功能设置的流程
设置Key Per I/O功能需要对NVMe存储设备进行一系列配置,涉及多个步骤和能力要求。以下是一个简化的流程概述:
-
硬件支持:首先,NVMe固态硬盘支持Key Per I/O技术,并且了解相关的NVM Express规格、TCG Key Per I/O SSC v1.00标准以及其他行业规范。
-
初始化检测:
-
-
通过NVMe Identify控制器命令获取设备的Key Per I/O支持信息,如KPIOS(Key Per I/O Supported)位以及Key Per I/O Scope(KPIOSC)位来确认设备是否支持并能够按命名空间或整个NVM子系统管理密钥。
-
进行Level 0特性发现,以确定设备支持哪些关键特性,如支持的密钥数量、密钥唯一标识符长度、数据访问对齐和粒度等。
-
-
一次性设置:
-
-
利用NVMe Security Send/Receive命令同步主机与固态硬盘之间的通信属性,并执行Level 0发现以获取关于Key Per I/O特性的详细描述,包括支持的通信ID(ComIDs)、可选功能以及加密密钥传输的安全算法等。
-
当将Media加密密钥(MEKs)的所有权从存储设备(SD,如自加密驱动器)转移到主机时,这意味着对于那些由Key Per I/O管理的命名空间来说,存储设备自身生成的MEK将不再使用。在采用Key Per I/O技术进行数据加密管理的情况下,一旦将MEK的所有权转移给主机,主机将负责生成、管理和使用这些MEK来加密和解密相关命名空间中的数据。而那些未被Key Per I/O管理的命名空间,其仍然保留由存储设备自动生成和维护的MEK,即继续沿用原有的加密机制。这种区分处理使得系统能够根据需要选择不同的加密管理模式,以适应不同级别的安全策略和控制要求。
-
在启用Key Per I/O功能并进行MEK所有权转移后,对于受Key Per I/O管控的命名空间而言,原先由存储设备生成的MEK将失效,转而采用主机提供的MEK;而对于不受Key Per I/O管理的命名空间,则继续保留和使用存储设备自产的MEK进行数据保护。
-
启用与配置Key Per I/O:
使用NVMe Security Send/Receive命令序列激活Key Per I/O功能,包括与设备交换密钥管理控制权和激活Key Per I/O模式。
-
更新管理凭证从默认设置:这是指在初始化或启用Key Per I/O功能之前,需要先将存储设备的管理员凭据从出厂预设值或者当前默认状态更改为符合安全策略和用户需求的新凭证。这一步骤确保了系统的安全性,因为默认凭据可能容易被攻击者利用。
-
配置Key Per I/O策略表:这部分涉及定义Key Per I/O操作的具体安全政策和机制。例如:
-
-
启用重放保护:防止恶意用户重复使用以前捕获的数据包进行未经授权的访问。
-
启用RSA封装的KEKs:表示要求密钥加密密钥(KEKs)在传输和存储时采用RSA公钥加密算法进行安全封装,提高密钥的安全性。
-
禁用明文KEKs:避免密钥以未加密形式存在,以降低密钥泄露的风险。
-
-
配置Key Tag分配表:Key Tag是用于标识特定媒体加密密钥(MEK)的标签,用于关联每个I/O操作与相应的加密密钥。在此步骤中,需要:
-
-
为每个Key Per I/O命名空间分配Key Tag的数量:确定每个支持Key Per I/O功能的命名空间可以使用的不同密钥标签数量,从而决定可并行使用多少个不同的MEK
-
为Key Per I/O启用额外的命名空间:如果需要增加更多命名空间来支持Key Per I/O功能,就需要在分配表中对其进行设置和授权。
-
-
加载加密密钥:
初始加载KEKs(密钥加密密钥)和MEKs(Media加密密钥)是启用Key Per I/O功能的关键步骤之一,具体流程如下:
-
获取密钥信息:首先,主机从安全存储库中检索所需的KEKs及其唯一标识符(UID),以及用于对MEKs进行加密的密钥包装规范。
-
加密传输与导入:
-
-
主机使用KEK对MEK进行加密。这里提到的加密方式可以采用RSA等算法进行密钥封装。
-
将加密后的所有KEKs和MEKs以单一KMIP(Key Management Interoperability Protocol)消息的形式批量发送到NVMe固态硬盘。
-
-
注入SD的密钥缓存:
-
-
自加密驱动器(SED)接收到加密的密钥后,将其解密并注入到自身的易失性密钥缓存或表中。
-
每个MEK都会被分配一个由主机软件指定的“Key Tag”,以便后续I/O操作通过该标签快速定位相应的MEK进行数据加密/解密。
-
-
独立管理每个命名空间:
-
-
如果Key Per I/O作用范围为单个命名空间,则每个命名空间将拥有自己的Key Tag及对应的MEK集。
-
如果Key Per I/O作用于整个NVM子系统,则所有命名空间共享一套Key Tag和MEK资源。
-
-
I/O过程中指定密钥:
NVMe规范 TP4055提案引入了一种新的与Key Per I/O(KPIO)相关的命令扩展类型(Command Extension Type, CETYPE)和命令扩展值(Command Extension Value, CEV),它们分别位于I/O读写命令的DWORD12和DWORD13字段中,用于向存储设备指示以下信息:
-
Key Tag Presence:通过设置CETYPE字段不为零(CETYPE != 0)来表示当前I/O命令包含了密钥标签信息。这意味着该I/O操作将使用特定的加密密钥进行数据加密或解密。
-
Key Tag Value:在CEV字段中设置一个具体的值(CEV == KEYTAG),这个值代表了与该I/O命令关联的Media加密密钥(MEK)的标识符,即“Key Tag”。当存储设备执行这个I/O命令时,会根据Key Tag找到对应的MEK来对传输的数据进行加密或解密处理。
-
密钥缓存管理:
更新Key Cache是指在支持Key Per I/O功能的NVMe设备上,根据需求动态地向设备加载新的加密密钥,并将其应用到指定的命名空间下,同时确保原有数据的安全性和完整性。这一过程旨在提高存储系统的灵活性、安全性和管理效率。
更新Key Cache的过程涉及NVMe设备中的密钥管理机制,具体包括以下几个关键步骤和要点:
-
获取新的KEKs和MEKs:
-
-
主机首先从安全存储的Key UID Key Store中检索到新的加密密钥(KEK)及其对应的唯一标识符(UID)。
-
根据这些信息,主机使用已经注入至设备的KEK来加密新的或已更新的媒体加密密钥(MEK)。
-
-
批量导入密钥:
-
-
将所有新生成或更新后的、经过KEK加密的MEK以单一的KMIP(Key Management Interoperability Protocol)消息的形式发送给NVMe固态硬盘。
-
这样做的目的是将新的MEKs添加至设备内部的易失性密钥缓存(Volatile Key Cache)中。
-
-
更新Key Cache状态:
-
-
更新操作会替换或者增加在Key Cache中特定命名空间下的MEKs,并且不影响之前由这些密钥所保护的数据。
-
更新过程并不会清除那些用旧密钥写入的数据;而是当使用新的MEK进行读写操作时,对新数据采用新的加密密钥。
-
-
锁定与清除密钥:
在NVMe存储设备中,锁定Key Cache是一种管理加密密钥缓存的机制,确保在特定条件下密钥不会被更改或删除。Key Cache通常包含Media加密密钥(MEKs),用于对存储在设备上的数据进行加密和解密。
如果需要,可以执行针对整个命名空间或单个密钥槽位的Key Cache锁定操作,防止进一步的密钥变更。
-
All NSes Locking:当执行整个非易失性命名空间(Namespace,NS)范围内的Key Cache锁定时,意味着所有与该NVMe设备关联的命名空间中的密钥缓存都将被锁定。这可以防止任何未经授权或计划外的密钥更新或清除操作,从而保障了所有命名空间内数据的安全性和一致性。例如,在系统维护、安全审计或灾难恢复等场景下,这种全局锁定功能尤为关键。
-
Per NS Locking:而按单个命名空间锁定Key Cache则更加细粒度地控制了密钥管理。这种方式允许管理员针对每个独立的命名空间分别进行密钥缓存锁定。这意味着可以在不影响其他命名空间的情况下,仅保护特定命名空间的数据不受密钥变更的影响。这对于多租户环境或者具有不同安全需求的多个存储区域非常适用。
当不再需要某个MEK时,可以通过删除该MEK从Key Manager和SSD密钥缓存中移除,实现类似Crypto Erase的效果。