用于运行以太坊验证器的 亚马逊云科技 Nitro Enclaves — 第 1 部分

在本系列文章中,我们为提供质押池和质押即服务的节点运营商提供了使用 亚马逊云科技 Nitro Enclaves 安全操作以太坊验证器密钥 的规范性指导。

在这篇文章(第 1 部分)中,我们解释了为什么 亚马逊云科技 Nitro Enclaves 非常适合以安全的方式运行以太坊验证器,并且我们为这种基于 Nitro Enclaves 的验证器签名服务提供了高级架构。

在代码示例 GitHub 存储库 中 ,我们分步介绍了如何部署基于 Nitro Enclaves 的验证器签名服务。

第 2 部分 中 ,我们对基于 Nitro Enclaves 的验证器架构进行了技术深入研究。

以太坊权益证明和验证器

公共区块链的协议和共识设计、实现语言和智能合约功能各不相同。

确定如何激励外部参与者加入网络并运行自己的节点是植根于博弈论的经济设计原则的关键,在博弈论中,你要将网络设计得更加分散,同时提高稳定性。

2022 年 9 月 ,以太坊将其共识机制从工作量证明过渡到权益证明, 以实现更高的安全性、更低的能耗要求,并进一步支持在此基础上构建的扩展解决方案。在权益证明网络中,网络参与者(称为验证者)负责检查和证明其他验证者提出的新区块是否有效,偶尔还会自己创建和提出(传播)新区块。作为一种经济激励,验证者通过执行这些任务获得以太币形式的奖励。

为了确保验证者的行为诚实,每个验证者必须将32个 以太币 (ETH)作为抵押品存入智能合约。如果验证者的行为不诚实,例如试图提出一个无效的区块,他们的抵押品将被削减。对于离线,也会受到轻微的削减处罚,但这些处罚远没有对不诚实行为的处罚那么严厉。每个验证器都有一个与之相关的公私密钥对,我们将在本文后面对此进行更深入的探讨。有关权益证明的更多信息,请参阅权益 证明 (POS)。

用户可以通过多种方式参与以太坊质押:

    • 运行自己的验证器节点 — 用户运行和维护验证器节点,每个验证人有 32 个 ETH 可以作为抵押品存入。用户可以完全控制节点和验证器密钥。
    • 使用质押即服务提供商 ——用户仍然为每个验证人提供 32 个 ETH,但将运营方面的工作转移给运行验证器节点并为用户维护验证器密钥的节点提供商。
    • 加入质押池 ——用户可以质押任意数量的以太币。用户质押的 ETH 被汇集在一起,验证器节点由受托的第三方运行。对于没有32 ETH或不愿意质押该金额的用户,此选项很有吸引力。

在第一种情况下,用户实现了所有奖励,而在其他两种情况下,提供商可能会将一定比例的奖励作为其服务的付款。

保护验证器密钥的重要性

运行以太坊验证器节点对以太坊网络的健康至关重要,但会带来潜在的安全风险。验证者密钥(公钥和私钥)用于收集和提取 32 个 ETH 抵押品以及已收集的任何奖励。以太坊的 Shapella 更新中提供了提款功能。以不安全的方式生成和存储验证器密钥会带来密钥泄露的风险。除了从恶意方手中提取抵押品外,泄露的密钥还可用于进行远程攻击,从而使整个以太坊网络面临历史重写的风险。远程攻击通过创建和维护平行链起作用,从而重写区块链的整个历史。要重建平行链, 需要 过去的验证者的密钥

您可以使用诸如 亚马逊云科技 Key Management Service (亚马逊云科技 KMS) 之类的服务 来降低与处理需要以编程方式访问的私钥(热钱包或温钱包)相关的一些风险。有关如何使用 亚马逊云科技 KMS 获取常规以太坊账户密钥的更多信息,请参阅 如何使用 亚马逊云科技 KMS 签署以太坊 EIP-1559 交易

由于为以太坊共识层引入了 BLS12-381 椭圆曲线,因此在撰写本文时,像 亚马逊云科技 KMS 这样的服务不能用来保护验证者密钥。因此,需要一个安全的运行环境来使用验证器密钥。

以下解决方案主要针对提供质押池和质押即服务的节点运营商。个人质押者也可以采用该解决方案,但如果他们仅质押最低数量的以太币,则可能会发现运行该解决方案的成本高得令人望而却步。

解决方案概述

下图说明了我们基于 Nitro Enclaves 的验证器签名服务的架构。

Nitro Enclaves 使用 Nitro Hypervisor 提供隔离的计算环境,以保护和安全处理高度敏感的数据,例如个人身份信息 (PII) 或 私钥。

虚拟机管理程序将安全区的 CPU 和内存与父实例隔离开来,只为父实例和安全区之间的通信提供安全的本地通道 ( vsock )。这样,父实例的用户、应用程序或库就无法访问在安全区内处理的关键信息。

每隔 12 秒,就会向以太坊网络提出一个新区块。这被称为 插槽 。L ighthous e 和Teku等验证者客户证实了拟议的区 块。有时,不是证明,而是随机选择验证人来提出区块。证明和区块提案都必须由验证者私钥签名。在我们的解决方案中,验证器客户端已配置为执行远程签名——换句话说,将签名过程转移到开源区块链签名服务 Web3 Signer。它通过调用 Web3Signer 的 HTTPS REST API 来做到这一点。

Web3Signer 将使用 加载到安全区的纯文本验证器私钥签署证明 屏蔽提案 。加密的验证器私钥存储在亚马逊 Dynam oD B 中。 在质押即服务提供商中,可能有数百个验证器私钥映射到多个 Web3Signer 实例,因此使用 DynamoDB 代替 亚马逊云科技 Secrets Manager 在操作上更简单、更具成本效益。 验证器私钥使用 KMS 密钥加密。

在我们的架构中,Web3Signer 在 Nitro 飞地中运行。值得注意的是,在安全性方面,Web3Signer 运行时由 Nitro Enclave 提供,因此可以免受攻击或风险,例如内存转储或文件系统权限不足。尽管如此,通过vsocket将Web3Signer的HTTPS REST API暴露给VPC,引入了与应用程序本身相关的新潜在攻击向量,而像Nitro Enclaves这样的安全运行时环境是无法缓解的。这些攻击向量需要一组不同的衡量标准,例如防止公共 API 访问或高级身份验证机制,例如 基于 客户端证书的身份验证

本文的下一节详细介绍了如何解密私钥并将其加载到 Nitro Enclave 中的 Web3Signer 中。

为了确保高可用性,Web3Signer 亚马逊弹性计算云 (Amazon EC2) 实例部署在跨多个可用区的自动扩展组中。这些实例从 DynamoDB 加载相同的验证器密钥。网络负载均衡器 (NLB) 将签名请求转发到其中一个实例。多个验证器客户端可以连接到同一 NLB。

托管 Nitro Enclaves 的 EC2 实例不应公开访问,因此应位于私有子网中。EC2 实例可以通过 NAT 网关安全地访问出站互联网,以便下载操作系统更新和其他软件包。在生产环境中,更新和其他依赖关系可以由自定义 Amazon 系统映像 (AMI) 提供。这样,就不需要出站互联网连接。

与 亚马逊云科技 KMS 或 DynamoDB 等 亚马逊云科技 服务的通信不应穿越互联网,因此应通过放置在每个可用区子网内的 接口 VPC 终端节点 保持私密性。

此外,提供的 亚马逊云科技云开发套件 (亚马逊云科技 CDK) 源代码仅涵盖架构图中标有红色的区域。验证器客户端和信标链或共识层客户端必须单独部署。针对验证器和信标链客户端的高可用性设计和削减保护不在本系列文章的讨论范围之内。

引导和签名流程

下图描述了部署在 EC2 实例内的组件以及与 DynamoDB 和 亚马逊云科技 KMS 等外部 亚马逊云科技 服务的一般通信流程。

通常,有两个先决条件:

  • 一个或多个以太坊验证器密钥已加密并存储在 DynamoDB 中。要安全地生成和加密以太坊验证器密钥,请参阅 在 亚马逊云科技 上使用无服务器架构 安全地低成本生成以太坊验证器密钥 。 出于测试目的,随附的 亚马逊云科技 CDK 代码的演练部分提供了类似的功能。
  • Web3Signer 的 TLS 密钥对已加密并存储在 DynamoDB 中。随附的 亚马逊云科技 CDK 代码的自述部分提供了有关如何生成 TL S 密钥对的说明。

以下步骤详细解释了以太坊认证 和 区块提案 是如何在 Nit ro E nclaves 内签署的。这些数字与上图中显示的数字相对应。

  1. 如果所有配置工件都存在,则安全区可以启动。
  2. 所有文物都以加密方式传递到飞地。
  3. 由 Nitro Enclave 服务团队提供的工具 kmstool- enclave cli 可在安全区内部使用加密认证来解密配置工件。
  4. 加上加密认证文档的解密请求通过 亚马逊云科技 提供的 vsock-proxy 路由到 亚马逊云科技 KMS。
  5. 所有解密的配置工件都存储在内存文件系统的安全区中。
  6. Web3Signer 流程开始了。使用提供的 TLS 密钥对和以太坊 2 私钥成功启动安全区后, https_prox y 将充当在安全区内运行的 Web3Signer 的 HTTPS 端点。
  7. Web3Signer API 端点现在可以向 EC2 实例外部公开,并且能够处理传入的签名请求,例如,来自以太坊 2 验证器节点的请求。
  8. 签名请求通过 vsock 连接以加密方式在安全区内转发。验证客户端和 Web3Signer 之间的 TLS 连接在安全区内停止,从而实现端到端的加密传输。

有关 vsocks 隧道上的 HTTPS 和引导过程的更多详细信息可以在本系列的 第 2 部分 中找到。

在配置方面,您不应将多个验证器客户端配置为相同的验证器密钥。这样做很有可能为不同的区块提案签署证明书,或者在同一个时段内提出不同的区块。这些活动将导致 大幅下跌 , 并导致验证者持有的部分以太坊流失。Web3Signer 提供了大幅保护功能来防范这些情况。为了简化部署, 随附的 亚马逊云科技 CDK 代码中的 Web3Signer 没有大幅 度保护功能。但是,这可能会包含在未来的代码修订中。

结论

在这篇文章中,我们简要介绍了Nitro Enclaves,并解释了为什么 Nitro 非常适合运行以太坊验证器。我们还解释了使用 Nitro Enclave 的高级引导和签名过程。

您可以按照位于 GitHub 存储库 中的端到端演练中的说明部署解决方案。 在第 2 部分中,你还可以深入研究 Web3Signer 集成模式、Nitro Enclaves 内部进程的安全引导以及通过 vsock 隧道进行 HTTPS。


作者简介

David-Paul Dornseifer 是 亚马逊云科技 全球专业解决方案架构师组织的一名区块链架构师。他专注于帮助客户设计、部署和扩展端到端的区块链解决方案。

Aldred Hal im 是 亚马逊云科技 全球专业解决方案架构师组织的解决方案架构师。他与客户紧密合作,设计架构和构建组件,以确保在 亚马逊云科技 上成功运行区块链工作负载。