基于Intel SGX的Kerberos安全增强方案

2021-04-06 00:39苗艺雪
信息安全研究 2021年4期
关键词:解密票据内存

王 冠 苗艺雪

(北京工业大学信息学部 北京 100124)

(可信计算北京重点实验室 北京 100124)

(wangguan@bjut.edu.cn)

Kerberos协议[1]是由麻省理工学院在20世纪80年代末开发的公开源代码的分布式网络身份认证协议.Kerberos广泛应用于各主流操作系统以及云计算[2]、物联网[3]等场景.

Kerberos提供客户端和服务器端间的身份认证,身份认证机制是网络通信安全的重要保障机制,而身份认证信息一旦被窃取并篡改,将严重影响通信安全,进而损害各方利益.现有的研究表明Kerberos主要有以下安全问题:

1) 口令猜测问题.口令猜测会造成密钥泄露隐患.现有方案主要有将Diffie-Hellman密钥协商方法[4]和公钥密码体制[5-6]、虚拟密码机制[7]引入Kerberos协议认证的初始阶段来代替对称密钥.但这需要更多的计算资源和更大的通信负担,公钥密码本身也有安全性问题[8],且需要PKI(public key infrastructure)的支持,部署起来更困难,增加了Kerberos系统的复杂性.

2) 针对时间戳机制易受重放攻击问题.现有主要解决方法为通过引入随机值[9]等唯一标识来代替时间戳,防止重放攻击.取消时间戳机制,降低了Kerberos机制本身所具有的灵活性.

3) 密钥分发中心(key distribution center, KDC)本身的安全性[10].Kerberos认证系统基于可信第三方KDC,KDC负责核心的认证服务,其安全和性能直接决定了整个系统的安全和性能.

而KDC认证服务的安全性和机密性的核心是仅由KDC持有的票据授权服务器(ticket granting server, TGS)密钥,该密钥负责参加认证服务,用于在认证服务中加密和验证票据授权票据(ticket granting ticket, TGT),TGT包含会话密钥和票据信息等重要信息,用于防止票据信息被篡改.一旦TGS密钥被获取,那么网络通信过程中票据中的用户信息、时间戳以及会话密钥都可以随意获取和修改,进而破坏系统的安全性.涉及TGS密钥主要有以下2个安全问题:

1) 存储安全问题.相比短期的会话密钥,TGS密钥属于长期密钥,KDC提供认证服务时会涉及针对TGS密钥的读写,而该密钥明文存储在数据库中,因此更需要保障存储机密性.

2) 运行安全问题.KDC在认证服务过程中,会涉及到使用TGS密钥在内存中进行加密与解密,此时针对于内存的物理攻击与软件层面攻击都将威胁到密钥的安全.

针对TGS密钥的安全问题,Kerberos提供可选的软件层面安全策略:KDC可以设置数据库密钥,可用于将数据库加密,在加密后再进行持久化存储.但是这需要用户每次使用数据库时都提供密钥来解密,这将极大地降低Kerberos本身的便捷性.并且单纯依赖软件来保护密钥有以下缺陷:1)可信计算基础大,可信计算基础均为可攻击面,进而降低整个系统的安全性;2)无法抵御物理攻击,攻击者可能通过内存嗅探、磁盘读写等手段来窃取信息,除此之外,目前没有其他方法来保护TGS密钥信息.

因此,本文引入了Intel SGX(Intel software guard extensions)[11-12]硬件保护机制,相比软件层面的保护策略,Intel SGX具有较小的可信计算基础并能实现物理隔离.通过将密钥使用和存储的关键代码运行在Intel SGX提供的安全加密内存中,保证程序运行过程中,攻击者无法窥探内存.当需要将密钥持久化存储时,使用Intel SGX技术保护的程序会先在安全内存中用基于硬件提供的密钥将TGS密钥加密后再写入到磁盘.因此攻击者无法窃取到明文的密钥信息.

1 相关技术

1.1 Intel SGX

Intel SGX是通过对Intel体系扩展指令集[13]和维护基于硬件的访问控制策略来创建内存安全区Enclave[14],是一种可信计算技术[15],将程序需要保护的核心部分在内存安全区中执行,从而保证程序执行的安全性[16].

基于硬件的安全措施,Intel SGX的可信计算基础只有CPU和内存安全区Enclave本身[17],具有较小的可信计算基础.位于Enclave中的程序能够抵御外部的内存攻击[18].特权软件也无法获取到Enclave内部的信息和数据,也能保证避免来自操作系统[19]和VMM,BIOS,SMM层面的攻击.SGX创建的Enclave也可以理解为程序的可信执行环境(trusted execution environment, TEE),并能够提供远程认证服务[20].本文使用到的Intel SGX技术主要有以下2个方面.

1.1.1 内存隔离和访问控制

系统会为SGX技术分配1块预先保留的物理内存区域,这块区域被称为EPC(enclave page cache),EPC是通过访问控制策略来进行限制对其的访问,受SGX技术保护的应用程序将会在该区域中运行.而Enclave就是为应用程序所分配的逻辑地址,Enclave和EPC存在着映射关系,中央处理器会维护着1个EPCM(enclave page cache map)的硬件结构,用来存储这种映射关系,即存放了对EPC进行访问控制的信息.EPC以页为单位进行管理,EPCM相当于页表,可以保证1个EPC页只能与1个Enclave相关联,并只能由相关联的Enclave进行访问.

受SGX保护的应用程序会被划分成2个部分:可信部分和不可信部分.其中可信部分会被运行在安全内存中,当被加载至Enclave中时,也会进行完整性度量,从而保证运行时数据的完整性和机密性.程序的访问地址在Enclave中,而物理地址在EPC中,由EPCM来存储映射关系并实现访问控制.由于唯一映射关系,保证外部程序不能访问Enclave内存.SGX密封机制的根密钥为固化在CPU中的基于硬件安全的密钥,根密钥具有唯一性,只能由CPU通过扩展的指令来读取根密钥并派生加密密钥.数据密封机制保障作为磁盘上二进制文件的离线代码和数据的机密性,加密的数据只能在创建它的那台电脑上通过处理器扩展指令解密,从而防止反向工程.

1.1.2 密封机制

SGX提供2种密封策略:安全区标识(mrenclave)和密封标识(mrsigner),策略影响密钥的生成.安全区标识策略将生成1个安全区独有的密钥,这意味着只有同一台电脑的同一个安全区可以解封数据,而其他的安全区Enclave也无法获取该密钥,基于此策略,Enclave可以获取其专有密钥,将数据加密后再持久化存储,当需要使用数据时,可以通过专属密钥来解密数据.而密封标识策略下,密钥是基于平台的签名密钥产生的,这样一个安全区中的内容可以被同一台电脑的另一个安全区打开,只要同属于一个平台.

总结以上Intel SGX技术,其提供了以下保护措施:

1) 安全区内存不可从安全区外读写,无论当前的权限是何种级别,CPU处于何种模式.

2) 安全区不能通过软件或硬件调试器来调试.

3) 安全区环境不能通过传统函数调用、转移、注册操作或堆栈操作进入.调用安全区函数的唯一途径是完成可执行多道保护验证程序的新指令.

4) 安全区内存采用具有回放保护功能的行业标准加密算法进行加密,访问内存或将DRAM模块连接至另一系统只会产生加密数据.

5) 内存加密密钥会随着电源周期(例如,启动时或者从睡眠和休眠状态进行恢复时)随机更改,该密钥存储在CPU中且不可访问.

1.2 Kerberos

Kerberos身份认证系统由以下3个部分组成:KDC、客户端(client)和服务器(server).

Kerberos身份认证系统的核心是KDC.KDC有2个部件:认证服务器(authentication server,AS)和票据授权服务器TGS.AS负责进行密钥管理和控制,它维护1个保存所有主体密钥的密钥数据库,对应密钥只有对应的主体和KDC可知,对于Client和Service之间的通信,KDC会生成临时的会话密钥,供两者将交互信息加密.

Kerberos协议的特点是客户只需输入1次身份验证信息就可以凭借此验证信息来向KDC请求访问不同服务的票据,从而可以访问多个服务.由于在每个Client和Service之间建立了共享密钥,使得该协议具有相当的安全性.

Kerberos身份认证流程如图1所示:

图1 Kerberos身份认证流程

Kerberos协议共分为3个部分,对应6个步骤:

1) 客户端认证

步骤1. Client向AS发送明文消息,即自己的身份信息.

步骤2. AS检查该用户是否在本地数据库中,如果用户存在,AS会产生1个AS与Client之间的会话密钥.AS会返回2条消息给Client:消息A. Client/TGS会话密钥,通过存储在数据库的用户密钥进行加密.消息B.票据授权票据TGT,该票据使用TGS密钥进行加密,TGT用于和TGS服务器通信,Client收到消息后,正确匹配的用户能够通过自己的密钥解密得到.

2) 服务授权

步骤3. 当Client需要向票据授权服务器TGS申请特定服务时,Client发送的消息包含:加密后的票据授权票据(TGT)和使用Client/TGS会话密钥进行加密的认证符.

图2 总体架构图

步骤4. 票据授权服务器TGS接收到消息后,首先检查KDC数据库中是否存在所需的服务,查找到之后,TGS用TGS密钥解密出TGT并进行验证,验证通过后授予Client服务票据,该票据中包括客户身份、应用服务器名、网络地址、时间标记及Client/Server会话密钥,票据使用Server的密钥进行加密.TGS还会返回给用户1则消息:使用Client/TGS会话密钥加密的Client/Server会话密钥.

3) 服务请求

步骤5. Client使用Client/TGS会话密钥将加密的Client/Server会话密钥解密,获得与服务器通信的密钥.然后将加密的服务票据Ticket和验证信息传送给应用服务器.

步骤6. 应用服务器使用自己的密钥将服务票据解密,从而得到TGS提供的Client/Server会话密钥,并验证认证消息,验证通过后根据Ticket的授权允许客户访问该服务.

2 方案设计

2.1 设计架构

通过对Kerberos认证系统的相关安全研究可以得出,Kerberos存在KDC本身的安全问题,而其安全核心为TGS密钥,该密钥为仅由KDC可知的长期密钥,用于在认证服务中加密和验证TGT,TGT包含了会话密钥和票据信息等重要信息,用于和票据授权服务器通信,防止票据信息被篡改.一旦该密钥被获取,那么网络通信过程中的票据信息都可被随意获取和修改.

该密钥主要存在2个安全问题:密钥的存储安全,以及TGS密钥参与到KDC的认证服务中时,密钥的使用安全.

KDC作为软件,本身需要考虑软件安全,针对密钥可能受到以下攻击:1)通过分析内存数据来获取到机密信息TGS密钥,进而获取并篡改通信认证信息;2)通过分析源码,确定存储路径,直接读取数据库信息从而获取机密信息;3)通过操作系统、BIOS等的漏洞或特权软件,动态调试程序执行,从而读取进程实例中的密钥信息.

上述攻击主要是由于无法抵御内存攻击和来自操作系统、软件层面的漏洞攻击,以及针对存储文件的读写.根据上述的安全问题,本文提出一种基于Intel SGX的Kerberos的安全增强方案,安全增强方案的总体架构如图2所示.在硬件层面上,中央处理器通过指令扩展和访问控制策略提供了EPC物理隔离内存区域,逻辑内存Enclave存储程序和数据,通过内存映射存储在EPC中,实现内存隔离.在内核层面上,SGX驱动为应用层提供创建Enclave、数据密封等功能.在应用层上,将KDC中涉及到TGS密钥的关键模块(初始化模块、使用模块、持久化存储模块)运行至安全区Enclave中.该方案能够确保:1)尽可能减少性能开销,减少针对认证协议流程的修改.2)密封机制保障TGS密钥的持久化存储安全性,攻击者无法直接读取到明文的机密信息.3)内存隔离机制保障TGS密钥的动态安全,当KDC提供身份认证服务时,无法通过操作系统或特权软件层面读取.

使用Intel SGX技术需要将程序划分为2个部分:可信部分和不可信部分.其中可信部分将会受内存隔离机制保护,用于完成机密性操作.可信部分与不可信部分需要定义专有的接口函数ECall,OCall.ECall是非可信应用程序进入安全区的入口点,OCall使得安全函数可以调用外部的非可信应用程序,然后再返回安全区.SGX驱动提供的Edger8r工具自动生成函数ECall,OCall在可信部分和不可信部分对应代理函数以供调用.本安全增强方案重点关注以下3个方面:TGS密钥的安全初始化、身份认证服务中TGS密钥的内存隔离保护、密钥的安全持久化存储.

2.2 TGS密钥的安全初始化

KDC程序进行密钥初始化配置时,需要键入密码字段,并由算法派生出密钥.TGS密钥是由Kerberos数据库中主体为krbtgt对应的密码字段派生而来,并作为krbtgt主体信息的一部分存储在数据库中.故进行安全保护时需要将由密码字段派生密钥的算法执行封装至内存安全区内,密钥生成后进行加密再存储至数据库.

由方案设计可知将初始化模块作为可信部分.密钥初始化流程如图3所示.当KDC执行密钥初始化功能时,创建内存安全区Enclave并调用可信函数ECall,键入的密码字段作为函数输入参数传入,流程会进入到安全区域Enclave中,并执行被封装至函数ECall派生TGS密钥算法.生成的TGS密钥将调用密钥持久化存储模块提供的接口函数进行加密,并存储至Kerberos数据库中,然后通过函数OCall将执行结果返回给KDC,并在不可信区域执行后续操作.设计接口函数ECall和OCall确保密钥信息不会泄露,并且可信部分与不可信部分的交互是安全的.

图3 密钥初始化流程图

2.3 TGS密钥的内存隔离

KDC提供身份认证服务功能:验证用户身份,并为用户提供访问特定服务器的访问票据.进行安全增强后的认证服务,TGS密钥的使用模块被隔离至Enclave中执行,对应的物理内存EPC区域经过内存加密引擎加密处理,内存泄露攻击也只能获取密文数据.安全增强后的认证流程如图4所示,基于Enclave的身份认证服务共有3个阶段:

图4 安全增强的身份认证流程图

第1阶段.客户端认证.客户端Client从KDC的认证服务器AS获取TGT.Client发送1条请求包含Client的基本身份信息,申请基于指定服务,并使用客户端密钥KC对其进行加密,然后AS验证认证请求信息,检查该用户信息是否在本地数据库中,如果用户存在,AS需要向Client返回2条消息:消息A.KC{SKC,TGS‖IDTGS}.消息B.TGT,其中TGT:KTGS{SKC,TGS‖IDC‖IPC‖ETTGT}.

票据授权票据(TGT)的加密过程在SGX内存安全区中执行.KDC进程空间中的不可信部分读取存储至数据库中密封的TGS密钥,并通过调用函数ECall进入Enclave,TGT的组成部分以及密封密钥作为输入参数传入Enclave.函数ECall调用密钥持久化存储模块提供的接口函数解密出TGS密钥,并用其完成对TGT的加密操作,加密后的TGT返回至不可信部分并继续流程.Client收到消息后,首先尝试用自己的用户密钥解密消息,如果用户输入的密码与AS数据库中的不符,则不能成功解密消息A.生成正确的用户密钥才能解密消息A,从而得到Client/TGS会话密钥.

第2阶段.服务授权.Client从KDC的票据授权服务器TGS获取票据Ticket.客户C发送给TGS以下信息:{TGT‖Authenticator_1}.其中Authenticator_1:SKC,TGS{IDC‖TS‖IDS},用以证明TGT的拥有者的身份,使用SKC,TGS加密,其中包括Client的ID信息和时间戳TS,时间戳的作用是防止黑客截获数据包,伪造合法用户,超过时间阈值的数据包无效.TGT的验证过程在SGX内存安全区中执行,调用函数ECall,将TGT作为输入参数传递至Enclave,在飞地内使用TGS密钥对TGT进行解密,获取到SKC,TGS来解密Authenticator_1,验证包括Client的ID信息和时间戳TS.验证通过后,TGS服务器向客户C授予票据,传送如下消息:SKC,TGS{SKC,S},Ticket,其中Ticket为针对特定应用服务器的票据,参数为KS{SKC,S‖IDC‖IPC‖ETTicket}.

第3阶段.服务请求.Client从Server获取服务.客户C通过Ticket与应用服务器进行通信,二者会使用TCS提供的SKC,S加密通信数据,保障数据安全性.

2.4 密钥持久化存储

TGS密钥需要持久化存储至数据库,为了保证密钥的机密性,需要在Enclave内部使用Intel SGX密封技术将其进行加密,在需要使用时在Enclave中解密.SGX支持2种密封策略:安全区标识(mrenclave)和密封标识(mrsigner),策略影响密钥的生成.2种密封策略的区别是:mrenclave策略会为Enclave生成独有密钥,只有同一个Enclave可以解封数据;而密封标识策略,密钥是基于开发者的签名密钥产生的,因此只要Enclave的签名结构相同,不同的Enclave便可以解封相同的密封数据.为确保TGS密钥的唯一访问性,使用mrsigner策略来产生密钥.因此加入Intel SGX技术后的密钥持久化存储模块的流程如图5所示.使用mrenclave策略来产生Enclave密钥,Enclave使用密钥将机密数据在Enclave内部进行加密,并存储在磁盘的数据库中,当内存安全区需要使用密钥时,同一Enclave内能够实现解密.

图5 持久化存储流程图

支持指令扩展的处理器内部硬件固化了1个SGX主派生密钥,在Enclave内部CPU使用扩展的指令EGETKEY自动读取出SGX主派生密钥参与到AES-CMAC算法中进行密钥派生,主派生密钥只能通过这一方式使用,无法直接获得其值,确保根密钥的机密性.AES-CMAC算法的另一参数为Enclave创建时产生的度量信息,安全区标识策略采用Enclave的度量信息作为唯一标识,从而生成Enclave的加密密钥.然后程序在飞地内部调用SGX SDK封装提供的密封函数sgx_seal_data来封装密钥,函数检索通过策略生成的Enclave密钥,并使用该密钥对输入数据进行AES-GCM算法加密,密封的数据可以在Enclave中解除密封.由于被加密会在认证服务中解密使用,故需要在Enclave中分配内存缓存区,调用函数sgx_calc_sealed_data_size来确定加密后数据所需的缓冲区大小,该值将会作为密封函数的参数之一.当Enclave重新示例化时,会调用sgx_unseal_data函数来进行解封.

3 实验与分析

3.1 安全性分析

本方案通过使用SGX技术实现针对KDC本身安全性增强,主密钥TGS密钥的明文状态只会在内存安全区中存在,而因为严格的访问控制策略,攻击者无法从内存中嗅探,也无法通过磁盘读取到明文的TGS密钥.通过BIOS、VMM、操作系统,特权软件层面也无法获取到密钥.而用于加密TGS密钥的根密钥固化在CPU中,只能在加密时通过扩展指令自动参与运算,无法直接获取.

本方案的TCB仅包含CPU和Enclave自身,而Enclave程序部分仅包含TGS密钥初始化和使用TGS密钥进行加解密的核心接口函数,代码量少,有较小的可信计算基础,因此TGS密钥的安全性能够得到保证.

首先在没有安全增强机制的情况下,验证密钥信息是否存在泄露风险.在KDC上执行命令后,如图6所示,能够显示出密钥版本号、密钥策略等信息.查看由数据库导出的密钥表信息,如图7所示,密钥配置信息以及密钥都可以直接获取.图8为直接读取密钥表文件的结果,可以获取到对应密钥.图9为使用gdb命令读取的KDC进程内存数据,在地址段002b50部分得到了和密钥表中一致的信息.

图6 查看主体密钥信息

图7 查看密钥信息

图8 读取文件结果

图9 提取KDC内存数据结果

图10 加密后的读取结果

使用安全增强方案后,读取文件信息,如图10所示,已经无法找到密钥的明文信息.尝试再次导出KDC内存数据,发现密钥信息已无法导出,因为密钥相关地址属于Enclave保护的范围,除了Enclave结构,外界无法获取其中的信息.

3.2 性能分析

通过引入Intel SGX技术,将Kerberos身份认证服务器划分为可信与不可信部分,并且引入Enclave项目来创建管理密钥初始化和使用模块、密钥持久化存储模块.进出安全区的调用,类似于CPU上下文切换,会产生性能损耗.

本文使用了CPU型号为i5-8265U、内存为8 GB,操作系统为Ubuntu 14.04 LTS的支持SGX平台,部署并安装了Kerberos服务器.实验中测试了KDC程序中的可信部分密钥初始化和使用模块中密钥初始化和认证过程中的密封解密操作的时间开销,以及可信部分密钥持久化存储模块的时间开销.通过对比未使用增强方案和使用增强方案后选用的2个操作:1)密钥初始化;2)身份认证服务中针对TGS密钥的使用操作(包含了从数据库读取密钥,以及使用密钥进行数据加解密与验证).分别进行20次测试,然后对比每组的平均时间损耗和性能.

对比实验由图11可知,安全增强方案后的密钥初始化额外增加了密钥密封操作,比原方案平均多耗时约62 ms,性能损耗为9.81%,在保证安全性的条件下,这个性能损耗是可以接受的.而密钥使用操作增加针对密钥的解封和与不可信区交互的切换消耗,耗时较长,但平均耗时不到1 s,相对认证服务过程中网络通信的开销,也在可接受范围内.

图11 实验平均耗时对比

4 结 语

身份认证机制是网络通信中重要的安全保障技术之一,Kerberos作为广泛使用的认证机制,针对其密钥分发中心KDC的密钥安全问题,本文提出基于Intel SGX技术的安全增强方案.利用内存隔离、数据密封机制为密钥提供安全可信的执行和存储环境.本文主要是通过保证TGS密钥的安全性来实现Kerberos身份认证系统中的KDC部分安全性,针对KDC失败于单点问题,还需设计副本KDC,并对主从KDC间数据库的迁移和部署进行安全保障.

猜你喜欢
解密票据内存
炫词解密
解密“一包三改”
炫词解密
“春夏秋冬”的内存
2016年11月底中短期票据与央票收益率点差图
2016年10月底中短期票据与央票收益率点差图
2016年9月底中短期票据与央票收益率点差图
2015年8月底中短期票据与央票收益率点差图
内存搭配DDR4、DDR3L还是DDR3?
解密“大调解”