龙蜥开发者说:夏日编码奇遇,中国科学院大学学子的开源世界探索记 | 第 27 期 原创
「龙蜥开发者说」第 27 期来了!开发者与开源社区相辅相成,相互成就,这些个人在龙蜥社区的使用心得、实践总结和技术成长经历都是宝贵的,我们希望在这里让更多人看见技术的力量。本期故事,我们邀请了中国科学院大学学生赖堃来分享「夏日编码奇遇!中国科学院大学学子的开源世界探索记」。
欢迎阅读上期故事《一个人出发,一群人抵达》。开发者说系长期活动,对于积极投稿、多次分享的童鞋,我们还有神秘大礼鼓励!诚邀开发者们分享真实体验,以文会友、共同学习、一起进步。
本期故事主角:赖堃,中国科学院大学 2021 级硕士生、2023 开放原子开源大赛-龙蜥机密计算赛题一等奖获得者、龙蜥社区机密计算 SIG Maintainer。2022 阿里巴巴编程之夏参赛者,2023 开放原子开源大赛-龙蜥机密计算赛道参加了“基于CPU TEE 的 SPDM 通信协议”赛题,设计了将机密计算中的 CPU TEE 远程证明过程与 CPU 验证外部设备时使用的 SPDM 通信协议结合的方案,并在此基础上实现了一个纯 Rust 语言的安全通信框架 rats-rs。
Hi 大家好!作为一名大学生,分享下我在国产操作系统开源领域的探索与实践经验,并介绍如何一步步深入到机密计算这一前沿技术领域,贡献自己的一份力量。
实际上,我第一次了解龙蜥社区是在 2022 年暑假的编程之夏 ASoC 活动。当时春季学期已过半,面对接下来的暑假,我正不知该如何安排,便被已经成功报名开源之夏的同学安利参加编程之夏 ASoC 活动,于是我开始打开电脑浏览起了项目列表,并很快就找到了感兴趣的课题。鉴于本科期间参加 Google 编程之夏的经验,我果断地选择了把编程之夏 ASoC 活动加入到我的暑期安排中。虽然在此之前,我对机密计算技术已经有一些了解,但我很快发现理论知识和实际应用之间的差距,从论文和网络资料中学习得再多,都不如实际操作带来的收获大,属于是百闻不如一“用”了。
2022 编程之夏 ASoC 活动中,我选择的课题是“基于开源的 rats-tls 库实现一个跨 TEE 实例的网关”,在和项目导师进行充分的探讨后,我最终从提出的几个候选方案中确定了其中一版作为最终设计方案,并正式着手开工实现。
起初,在项目进行的过程中,我也遇到了不少疑惑和困难,有些是对项目目标理解上的疑问,也有一些是在开发环境搭建上遇到的困难。在把困惑点呈现出来后,我很快得到了开源导师及社区中其他伙伴们的耐心回复和帮助。最终,我完成了我的作品 enclave-network-gateway,并在 Anolis 8.6 环境中成功运行了示例程序。
尽管这一活动项目性质偏实验性,但在此过程中产生的探索价值远远大于实际应用价值,以至于过了这么久,这段参赛经历仍然让我受益匪浅。
(图 1/enclave-network-gateway示例程序)
因为我对机密计算这个新兴技术有着浓厚兴趣,加上在学校的研究方向与之有关联,在 2022 编程之夏 ASoC 结束后,我继续在龙蜥开源操作系统社区中贡献代码,为社区项目进行了一些新特性的开发。鉴于对社区的突出贡献,我也逐渐成为了机密计算项目的 Maintainer。
近两年,在和社区以及社区开发者更深入接触过程中,我受益匪浅。尽管以往我也在 GitHub 上为一些开源项目做过一些小的贡献,但大多都是一些浅层的小修小补。在龙蜥社区中,我作为机密计算项目的 Maintainer 之一,以实现项目目标为目的推动项目进展又是另一种不同的体验。在与社区伙伴的合作下,我第一次完成了为新功能编写 Proposal 并在社区中发起讨论,通过创建 issue 来跟踪 Proposal 的实现进展,并逐个提交 PR 将其实现。每当看到清单中的一个个 PR 从绿色的 Open 状态经过 Review 和合入变为紫色的 Merged 状态,总是能让我倍感开心。我觉得开源社区就是一群志同道合的人在一起做有意思的事情,开 issue、写 RFC、提 PR,以一种开源社区特有的默契来推动目标的实现,共同分享喜悦,这便是开源的魅力。
(图 2/proposal实现过程的PR清单)
在社区中,你可以用其他伙伴提供的开源组件一步一步来搭建出自己的程序,并将其作为开源软件发布,让更多人使用。如果觉得已有的组件不能满足自己的需求,或者发现了代码中的 BUG 时,你可以很快参与进来一起完善它。在我参与社区建设以来,令我印象深刻的一次是,我用 Occlum 测试运行我编写的程序,总是会遇到莫名其妙的 Segment Fault 错误,经过我自己一番探索后,确定这是一个新问题。为了更好的解决这个问题,我便尝试获得更详细的错误信息。幸运的是 Occlum 也是一款开源软件,通过几次代码修改和重新编译调试,我和社区中的伙伴们和一起分析确定了最终问题来源,并在 GitHub 上提出了 issue,在和该项目的开发者讨论后,我们提交了修复 PR。
机会总会不期而遇!偶然间,我看到了 2023 年开放原子开源大赛启动报名,于是我报名参加了龙蜥社区的“OpenAnolis 孵化机密计算和机密容器的创新项目 - 基于 CPU TEE 的 SPDM 通信协议”挑战赛。与以往参加的编程之夏活动不同,它的体量更大,允许参赛者在方案上更加灵活的设计,这也对参赛选手提出了更高的要求,因此,这是一场令我印象深刻的赛事。
在这项比赛中,需要基于 CPU 和外部设备通信常用的 SPDM 协议,设计出适合 CPU TEE 之间的 SPDM 通信协议。为了解决 SPDM 协议规范不适用于 CPU TEE 的问题,我们需要在 SPDM 消息中融入 CPU TEE 远程证明能力,这对我来说是充满挑战的,因为我对 SPDM 并不是特别熟悉。为了快速定位项目目标,制定方案并明确项目实施路线,在赛题初期,我花费了较多的时间收集和学习 SPDM 协议相关资料,尤其是需要啃冗长的标准文档。值得高兴的是,这一过程锻炼了后期我对资料的整理和归纳总结能力。
整个项目分为协议设计和实现两部分。在协议设计环节,通过对 SPDM 协议流程的剖析,我们详细设计了针对 CPU TEE 的 SPDM X.509 证书格式,主体思想是通过在证书中内嵌远程证明的 Evidence 和 Endorsements,并以自签名证书的形式构造 SPDM X.509 证书。接着我们对 CPU TEE 的 Measurements 消息内容进行了定制,将从 Evidence 中解析出的 Claims 作为 Measurements 消息的内容。在设计的过程中,我们还采用了二进制体积友好的 CBOR 格式对方案中内嵌在 X.509 证书中的数据结构进行序列化。
在确定好方案后,便是将其落地的实现过程,除了达成实现该协议的目的,我们更大的目标是设计一个能够直接让上层应用调用的安全通信框架 rats-rs。由于 Rust 语言的内存安全特性、易于跨语言集成、具有丰富的软件包等特点,我们使用了 Rust 语言来实现 rats-rs,并在 SGX 实例和 TDX 实例上成功运行了 demo 程序,实现了 TEE 实例的安全通信。
(图 3/rats-rs的架构设计)
经过 4 个多月的角逐,我们终于获得了“OpenAnolis 孵化机密计算和机密容器的创新项目 - 基于 CPU TEE 的 SPDM 通信协议”挑战赛一等奖。当然本次比赛的结果仍然不能算是完美的,还有许多可以补充的内容,例如对双向远程证明的实现,以及对更多 TEE 的支持等,这些都是后续需要展开的工作。此外,一个好的开源项目,完备的实现只是其中之一,还得要方便用,这样才能让更多人可以参与进来。为此我们基于 GitHub Action 架设了持续集成(CI)、自动化单元测试、覆盖率计算等工作流,以保证代码质量,还提供了样例程序、丰富的文档、基于 Docker Image 的开发环境,这些都是我在参与社区开源项目中学到的经验。
(图 4/开源大赛现场颁奖环节)
对于新人开发者来说,踏入开源社区的第一步总是困难的。在没有前辈领路,不熟悉怎么玩的情况下,许多同学都往往不知道怎么入手,或者害怕犯错误。在我看来,参加开源竞赛,如编程之夏 ASoC 等活动是一个很好的切入点,尤其对于有理论基础但缺乏实践场景的在校生来说,无疑是一个很好的成长机会。
等你真正参加了开源社区后,你会发现,这里有热情的社区伙伴和开源导师,会指导你熟悉项目并快速上手,还可以根据自己的开发经验,选择不同难度的赛题入手。说实话,在我第一次参加编程之夏 ASoC 时,我也没想到自己后来会一头扎进来,并且持续在开源社区里留下自己的脚印。同学们,无论如何,既然迈出了第一步,就要坚定不移的走下去,只要不放弃才是成功的关键。现在正值一年夏季,龙蜥社区推出了各种开源大赛、学习赛,还在犹豫的同学们快积极地参与进来吧,期待在社区中一同共建美好。
—— 完 ——