我们如何构建 EGo

2021-07-23 06:48:55

机密计算支持始终加密且可验证的数据处理 - 在云中和其他地方。开发过去需要神秘知识和重大代码更改的机密应用程序。使用 EGo,您可以跳过它并像往常一样开发 Go 代码。使用 EGo,您无需重构您的应用程序即可在安全的飞地中运行它。只需使用三个简单的命令来构建、签名和运行您的代码——无论是 10 行还是 100,000 行具有复杂依赖关系的 Go。最好的事? EGo 是完全开源的。在这篇博文中,我们将分享 EGo 的设计方法、我们在开发 EGo 时面临的最大挑战以及我们的一些关键原则。此外,我们还对 EGo 未来的其他计划进行了小规模预览。当我们开始在 EGo 上工作时,我们已经为可信执行环境构建了一个名为 Edgeless RT 的 SDK。这个项目是我们全面支持 Go 的内部解决方案,但与大多数其他 SDK 一样,它对新用户有很大的进入门槛。在使用 RT 时,我们问自己如何使机密计算更易于访问;特别是对于在机密计算社区中迈出第一步的新用户。我们的愿景很明确:我们希望创建一个提供有意义的易用性的 SDK。我们希望通过尽可能接近已知且经过验证的 Go UX 来实现这一目标。这将通过仔细选择要突出显示和忽略哪些机密计算的细节来完成,将一些更令人困惑的方面移到背景中,使最相关的功能成为中心舞台。经过仔细考虑,基于 Go 构建 SDK 感觉是一个自然的选择。首先,Go 是最相关和最直接的编程语言之一。最重要的是,它的内存安全功能提供了一个理想的安全层。但最重要的是,我们希望为那些对机密计算安全功能感兴趣但不一定对学科的来龙去脉感兴趣的开发人员提供一个简单的解决方案。针对那些最能从机密计算中受益的用例定制 EGo 是合乎逻辑的步骤——而且由于云原生空间为此类实现提供了最大的潜力,我们寻求支持其领先的编程语言。很难预测未来将在机密计算中建立什么标准,但我们认为,大多数现实世界的应用程序迟早会默认在安全区中运行大部分代码。通过将所有代码移动到 enclave,移植已经存在的应用程序成为一个简单的过程。在将 Go 移植到 enclave 时,我们必须处理语言及其编译器的一些技术上具有挑战性的细节。一种是 Go 程序如何访问操作系统的服务,如文件系统或网络套接字。 Linux 上的大多数语言都编译为与 libc 接口的本机代码。 (libc 实现了标准 C 库以及 POSIX API。)反过来,libc 执行系统调用以从操作系统内核请求服务。 Go 然而直接执行 SYSCALLs 本身。在飞地内,这是一条非法指令,因为按照设计,不应访问 TEE 之外的任何内容。为了解决这个问题,我们必须修改 Go 编译器,以便将 SYSCALL 重定向到 libc:

然后,飞地的 libc/syscall 层要么在内部处理系统调用,要么调用主机,例如,在网络上写入文件或发送数据。此外,我们必须扩展 Open Enclave。 Open Enclave 是机密计算领域最成熟的 SDK 之一,但它仍然缺乏一些基本的 POSIX 功能,例如 pthread 和 mmap。幸运的是,当我们开始开发 EGo:Edgeless RT 时,我们已经构建了 Open Enclave 的扩展版本。你可以在这里找到 Open Enclave,它是一个具有卓越代码质量的项目。最后思考:使用 EGo,我们忽略了我们从其他 CC SDK 中了解到的关于工作流的所有信息。我们的方法将用户放在首位。因此,我们让 EGo 尽可能接近 Go,同时增加了签名、证明和密封的关键功能。设计工具和 API,使其难以被错误使用:EGo 消除了深入研究高级机密计算主题(例如所需的加密参数)的需要。相反,当用户调用“ego sign myapp”时,如果尚不存在,EGo 只会生成一个合适的密钥。 “SealWithProductKey(plaintext []byte)”也是如此:此 API 函数处理所有 SGX 密封细节,例如添加一些元数据以确保密钥在 CPU 微码更新后仍然有效。这使得开发变得简单而安全,并温和地促使用户从一开始就正确使用 EGo。实施是关键:在 EGo 中,我们将开发职责分给了三个开发人员:一名开发人员担任产品负责人,并首先创建了一个工作原型以确保项目的可行性。然后,所有三位开发人员详细计划了进一步的实施,然后他们将工作量分摊到自己身上。自然,这需要额外的时间,但同时通过公共项目库确保高质量,然后通过单元测试、集成测试和代码审查迭代扩展。尽管 EGo 已经使构建和部署 Go 机密应用程序变得非常容易,但我们才刚刚开始。以下是我们目前正在开发的功能的简短概述: 可重现的构建:我们认为机密计算与开源结合特别有意义:对一段封闭源代码的远程证明声明的意义是有限的。用户应该能够建立从证明报告到 Github 项目等的连接。理想情况下,飞地的身份应该映射准确的源代码版本。为了实现这一点,我们将向 EGo 添加可重现的构建,以便(高级)用户可以编译应用程序并将生成的 enclave 哈希与证明报告中的哈希进行比较。

云外机器上的简化证明:目前,如果您想在云环境之外运行 EGo,您必须设置一些证明基础设施。当然,这很乏味,与我们追求的简单性不符。这就是为什么我们正在考虑简化证明的方法,以便 EGo 可以在开发机器或本地部署上使用而不会出现任何进一步的麻烦。透明文件加密:这是一个还在考虑阶段的功能。机密计算环境中的文件加密比在传统环境中更难实现,这就是为什么一些 SDK 一开始不提供它的原因。那些这样做,要么有缺陷,要么有使用限制。目前,EGo 有一个未加密的主机文件系统和一个临时的飞地内存文件系统。我们的目标是通过使用透明加密挂载目录的能力来补充这一点。现在好奇吗?如果您想了解有关 EGo 的更多信息,您应该查看我们的 GitHub 存储库或使用以下命令开始:此外,您应该查看由 EGo 维护者 Moritz Eckert 于 6 月 30 日举办的网络研讨会“轻松构建机密 Go 应用程序”。请点击这里免费注册。