VI. PSL与SCL集成
我们讨论了使用SCL实现PSL的经验和实施工作。每个PSL工作器都在SCL中通过工作器飞地启动,并由飞地内FaaS领导者进行认证。PSL的代码直接在沙箱化的JavaScript引擎上执行。我们的密钥分发和管理协议通过FaaS领导者从主密钥派生出唯一私钥,为每个工作器飞地提供专属密钥。这些密钥可以轻松生成、验证和轮换,以防止潜在的密钥泄漏。
A. 沙箱隔离
为了将飞地内应用程序与PSL基础设施隔离,我们使用沙箱化JavaScript解释器Duktape,在运行时动态解释Lambda程序。为了让沙箱化的JavaScript程序与其他对应组件通信,我们修改了Duktape并引入put和get两个函数来与SCL交互。我们注意到该程序对底层加密方案是透明且沙箱隔离的,因此无法观察和无意中泄漏加密秘密。
B. 认证机制
PSL在Asylo的认证原语之上构建其认证协议。对于每个需要在飞地中运行代码的工作器或FaaS领导者,它首先启动一个断言生成飞地(AGE)作为引用飞地(QE),帮助代表飞地生成引用。QE由配置认证飞地(PCE)认证,PCE使用由Intel写入和分发的配置认证密钥(PCK)来签署QE的硬件REPORT。PCK证书链可以追溯到Intel SGX根证书颁发机构(CA)。在收到来自远程认证者的断言请求后,工作器或FaaS领导者与AGE建立双向本地认证,以转发来自远程认证者的断言请求并从AGE获取断言。远程认证者验证断言后,他们建立安全的gRPC通道,远程认证者将机密信息(如加密密钥)发送给工作器或FaaS领导者。
C. 启动流程
每个PSL工作器节点在飞地中启动一个lambda运行时,并向第三方作业调度器注册。要启动PSL工作负载,用户通过加密程序和相应的启动配置(如需要多少个lambda)联系作业调度器。作业调度器联系其注册表中的空闲工作器节点,并将加密程序转发给潜在的工作器节点。为防止恶意工作器节点,用户通过运行在飞地中的FaaS领导者通过单独通道发送加密密钥。在使用远程认证验证FaaS领导者的身份后,工作器将密钥分发给FaaS领导者。接收加密程序的工作器也通过远程认证与FaaS领导者验证自身身份。工作器通过认证后,FaaS领导者将加密密钥转发给工作器节点,工作器节点可以解密并运行程序。当PSL工作负载完成时,所有用户相关的机密信息(如memtable的内容)由FaaS领导者通过RESET命令清除,因为重新启动lambda运行时可能需要更长时间。FaaS领导者跟踪工作器的空闲状态,并仅向空闲工作器分发密钥。RESET后的工作器需要为下一个PSL工作负载重新认证。
D. 密钥管理
在PSL中,工作器飞地需要密钥管理来验证彼此的身份,并满足DataCapsules的安全保证。我们的密钥管理设计目标是:1)来源证明:为每个工作器飞地提供唯一的密钥对;2)认证:每个工作器飞地需要使用(派生的)DataCapsule所有者身份进行签名;3)PSL使用具有父FaaS领导者和多个子Lambda飞地的分层结构。我们希望设计一种密钥管理方案,以低开销有效管理分层结构的密钥对。
为了从主密钥派生每组公钥/私钥对,我们使用比特币钱包[30]中的分层确定性(HD)钱包。HD钱包是一种密钥管理方案,允许所有子公钥从单个父公钥派生。我们使用强化派生子密钥(HD钱包的一种方案)来防止HD钱包中子私钥泄漏导致父私钥泄漏的问题。HD钱包在PSL中实现高效密钥管理如下:1)客户端和FaaS领导者之间认证后,客户端将其所有者密钥发送给FaaS领导者。2)FaaS领导者为当前运行的应用程序生成子公钥/私钥对。3)FaaS领导者使用应用程序子密钥对生成多个孙密钥对,每个工作器飞地一个。4)FaaS领导者认证并向每个飞地发送其孙密钥对。5)FaaS领导者将应用程序公钥多播给所有飞地。6)每个工作器飞地使用应用程序公钥派生其他工作器飞地的公钥。
密钥泄漏与轮换 我们通过SCL实现高效的密钥轮换方案,可以从新的强化密钥对为工作器派生和分发新密钥对。这可以防止加密密钥随时间泄漏。这是通过(1)客户端派生新的子强化密钥对并将公钥多播给所有飞地工作器;(2)FaaS领导者然后从新密钥对为工作器派生新密钥对来实现的。为了处理丢失的多播消息或飞地工作器故障,我们可以依赖SCL的一致性协调器,并在SYNC报告中包含当前父公钥。这确保任何飞地工作器都可以通过根据一致性协调器的SYNC报告验证密钥,来验证他们在给定epoch中是否使用正确的签名密钥。密钥轮换的频率取决于用户的威胁模型。用户可以选择每次函数调用轮换密钥。这确保任何新的函数调用可能不会影响先前的函数调用。
VII. 实现
我们的代码库包含32,454行C++代码(不包括注释),根据cloc[1]统计总共43,011行代码。核心SCL KVS代码包含大约4,000行C++代码,不包括认证、分布式应用程序实现和实验脚本。我们直接在Asylo之上实现KVS,而不是在容器化飞地环境上。这产生了比相关工作(如Speicher [9])小得多的TCB。
Asylo是一个硬件无关的TEE框架,支持Intel SGX(v1和v2)和ARM TrustZone。它还提供了一个符合POSIX的库,使将现有应用程序移植到飞地中更加容易。我们使用ZeroMQ实现工作器飞地之间的网络多播和通信。我们使用gRPC创建安全的FaaS领导者飞地,它可以生成HD钱包密钥对并启动飞地工作器。我们使用DukTape(一个用C++编写的嵌入式JavaScript引擎)来沙箱化飞地应用程序,现在飞地可以直接执行JavaScript代码。
CapsuleDB用C++实现,共2200行代码。它还使用了Asylo的几个特性和PSL实现中创建的结构。我们使用类似的memtable实现,但在每个条目上使用互斥锁而不是自旋锁。由于实现时间线,当前版本的CapsuleDB将数据写入磁盘,而不是使用Boost序列化库写入网络附加的DataCapsule。DataCapsule复制服务包含约1,000行C++代码(不包括注释)。我们使用RocksDB作为每个DataCapsule副本的嵌入式持久存储,使用ZeroMQ实现DataCapsule副本之间的网络通信,并使用OpenSSL进行签名和验证。