浅析NVMe key per IO加密技术-2

2024-01-11 21:28
文章标签 key 浅析 io nvme per 加密技术

本文主要是介绍浅析NVMe key per IO加密技术-2,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

二、Key per IO功能设置的流程

设置Key Per I/O功能需要对NVMe存储设备进行一系列配置,涉及多个步骤和能力要求。以下是一个简化的流程概述:

  1. 硬件支持:首先,NVMe固态硬盘支持Key Per I/O技术,并且了解相关的NVM Express规格、TCG Key Per I/O SSC v1.00标准以及其他行业规范。

  2. 初始化检测

    • 通过NVMe Identify控制器命令获取设备的Key Per I/O支持信息,如KPIOS(Key Per I/O Supported)位以及Key Per I/O Scope(KPIOSC)位来确认设备是否支持并能够按命名空间或整个NVM子系统管理密钥。

      图片

    • 进行Level 0特性发现,以确定设备支持哪些关键特性,如支持的密钥数量、密钥唯一标识符长度、数据访问对齐和粒度等。

    • 图片

  1. 一次性设置

    • 利用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进行数据保护。

  1. 启用与配置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功能,就需要在分配表中对其进行设置和授权。

  1. 加载加密密钥

初始加载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资源。

  1. 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来对传输的数据进行加密或解密处理。

  1. 密钥缓存管理

更新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的效果。

图片

这篇关于浅析NVMe key per IO加密技术-2的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/595748

相关文章

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

浅析CSS 中z - index属性的作用及在什么情况下会失效

《浅析CSS中z-index属性的作用及在什么情况下会失效》z-index属性用于控制元素的堆叠顺序,值越大,元素越显示在上层,它需要元素具有定位属性(如relative、absolute、fi... 目录1. z-index 属性的作用2. z-index 失效的情况2.1 元素没有定位属性2.2 元素处

MySQL中Next-Key Lock底层原理实现

《MySQL中Next-KeyLock底层原理实现》Next-KeyLock是MySQLInnoDB存储引擎中的一种锁机制,结合记录锁和间隙锁,用于高效并发控制并避免幻读,本文主要介绍了MySQL中... 目录一、Next-Key Lock 的定义与作用二、底层原理三、源代码解析四、总结Next-Key L

浅析Python中的绝对导入与相对导入

《浅析Python中的绝对导入与相对导入》这篇文章主要为大家详细介绍了Python中的绝对导入与相对导入的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1 Imports快速介绍2 import语句的语法2.1 基本使用2.2 导入声明的样式3 绝对import和相对i

浅析如何使用Swagger生成带权限控制的API文档

《浅析如何使用Swagger生成带权限控制的API文档》当涉及到权限控制时,如何生成既安全又详细的API文档就成了一个关键问题,所以这篇文章小编就来和大家好好聊聊如何用Swagger来生成带有... 目录准备工作配置 Swagger权限控制给 API 加上权限注解查看文档注意事项在咱们的开发工作里,API

浅析Rust多线程中如何安全的使用变量

《浅析Rust多线程中如何安全的使用变量》这篇文章主要为大家详细介绍了Rust如何在线程的闭包中安全的使用变量,包括共享变量和修改变量,文中的示例代码讲解详细,有需要的小伙伴可以参考下... 目录1. 向线程传递变量2. 多线程共享变量引用3. 多线程中修改变量4. 总结在Rust语言中,一个既引人入胜又可

深入理解Redis大key的危害及解决方案

《深入理解Redis大key的危害及解决方案》本文主要介绍了深入理解Redis大key的危害及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一、背景二、什么是大key三、大key评价标准四、大key 产生的原因与场景五、大key影响与危

python 字典d[k]中key不存在的解决方案

《python字典d[k]中key不存在的解决方案》本文主要介绍了在Python中处理字典键不存在时获取默认值的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录defaultdict:处理找不到的键的一个选择特殊方法__missing__有时候为了方便起见,

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti