Lambda 执行 - AWS Lambda 的安全性概览

Lambda 执行

当 Lambda 代表您运行函数时,它将管理运行代码所需的底层系统的预置和配置工作。这使您的开发人员可以专注于业务逻辑和编写代码,而不是管理底层系统。

Lambda 服务分为控制层面数据层面。每个层面在服务中有不同的用途。控制层面提供管理 API(例如,CreateFunctionUpdateFunctionCodePublishLayerVersion 等等),并管理与所有 AWS 服务的集成。与 Lambda 控制层面的通信在传输过程中受到 TLS 的保护。存储在 Lambda 控制层面中的所有客户数据都通过使用 AWS KMS 进行静态加密,旨在防止未经授权的泄露或篡改。

数据层面是 Lambda 的调用 API,用于触发 Lambda 函数的调用。调用 Lambda 函数时,数据层面会将 AWS Lambda 工件(或简称为工件,一种 Amazon EC2 实例类型)上的执行环境分配给该函数版本,或者选择已为该函数版本设置的现有执行环境,然后数据层面使用此环境来完成调用。有关更多信息,请参阅本文档的“AWS Lambda MicroVM 和工件”部分。

Lambda 执行环境

每个调用都由 Lambda 的调用服务路由到能够处理请求的工件上的一个执行环境。除了通过数据层面,客户和其他用户无法直接发起与执行环境的入站/进入网络通信。这有助于确保与执行环境的通信经过身份验证和授权。

执行环境是为特定函数版本预留的,不能在函数版本、函数或 AWS 账户之间重用。这意味着,单个可能具有两个不同版本的函数会导致至少两个独一无二的执行环境。

每个执行环境一次只能用于一个并发调用,并且出于性能考虑,它们可以在同一函数版本的多个调用之间重用。根据许多因素(例如,调用速率、函数配置等),给定函数版本可能存在一个或多个执行环境。通过这种方法,Lambda 能够为其客户提供函数版本级别隔离。

Lambda 目前不隔离在函数版本的执行环境中发生的调用。这意味着,一个调用可能会留下可能影响下一次调用的状态(例如,写入 /tmp 的文件或内存中数据)。如果您想确保一个调用不会影响另一个调用,Lambda 建议您创建其他不同的函数。例如,您可以为更容易出错的复杂解析操作创建不同的函数,并重用不执行安全敏感操作的函数。Lambda 目前对客户可以创建的函数数量没有限制。有关限制的更多信息,请参阅 Lambda 配额页面。

执行环境由 Lambda 持续监控和管理,而创建或销毁执行环境的原因可能有很多,包括但不限于:

  • 新的调用到达,但不存在合适的执行环境

  • 发生内部运行时或工件软件部署

  • 发布了新的预置并发配置

  • 执行环境或工件上的租用时间接近或已超过最大生命周期

  • 其他内部工作负载重新平衡流程

客户可以通过在其函数配置上配置预置并发来管理某个函数版本存在的预置执行环境的数量。配置为执行此操作后,Lambda 将创建、管理所配置数量的执行环境并确保它们始终存在。这确保了客户能够更好地控制其无服务器应用程序在任何规模下的启动性能。

除了通过预置并发配置外,客户无法确定地控制 Lambda 为响应调用而创建或管理的执行环境的数量。

执行角色

还必须为每个 Lambda 函数配置执行角色,执行角色是 Lambda 服务在执行与函数相关的控制层面和数据层面操作时代入的 IAM 角色。Lambda 服务代入此角色以提取临时安全凭证,这些凭证随后在函数调用期间可作为环境变量使用。出于性能方面的考虑,Lambda 服务将缓存这些凭证,并可能在使用相同执行角色的不同执行环境中重用它们。

为确保遵守最低权限原则,Lambda 建议每个函数拥有自己唯一的角色,并配置其所需的最低权限集。

Lambda 服务还可以代入执行角色来执行某些控制层面操作(例如,与为 VPC 函数创建和配置弹性网络接口 (ENI)、向 Amazon CloudWatch Application Insights 发送日志以及向 AWS X-Ray 发送跟踪相关的操作),或执行其他与调用无关的操作。客户始终可以通过在 AWS CloudTrail 中查看审计日志来查看和审计这些使用案例。

有关此主题的更多信息,请参阅 AWS Lambda 执行角色文档页面。

Lambda MicroVM 和工件

Lambda 将在名为 AWS Lambda 工件 的 Amazon EC2 实例的机群上创建其执行环境。工件是裸机 EC2 Nitro 实例,它们由 Lambda 在一个单独的隔离 AWS 账户(客户看不到此账户)中启动和管理。工件拥有一个或多个由 Firecracker 创建的硬件虚拟化微型虚拟机 (MVM)。Firecracker 是一款开源虚拟机监控器 (VMM),它使用 Linux 的基于内核的虚拟机 (KVM) 来创建和管理 MVM。它专为创建和管理安全、多租户容器和基于函数的服务而构建,这些服务可提供无服务器操作模式。有关 Firecracker 的安全模式的更多信息,请访问 Firecracker 项目网站。

作为责任共担模式的一部分,Lambda 负责维护工件的安全配置、控制和补丁级别。Lambda 团队使用 Amazon Inspector 来发现已知的潜在安全问题以及其他自定义安全问题通知机制和预披露列表,这样客户就无需管理其执行环境的底层安保状况。

该图显示 AWS Lambda 工件的隔离模式。

图 3 – AWS Lambda 工件的隔离模式

工件的最长租赁期限为 14 小时。当工件接近最长租赁时间时,不再向它发送进一步的调用,MVM 正常终止,底层工件实例终止。Lambda 持续监控其机群生命周期内的生命周期活动并发出有关此类活动的告警。

所有与工件的数据层面通信都通过使用伽罗瓦/计数器模式的高级加密标准 (AES-GCM) 进行加密。除了通过数据层面操作外,客户无法直接与工件进行交互,因为在 Lambda 服务账户中,工件托管在由 Lambda 管理的网络隔离 Amazon VPC 中。

当工件需要创建新的执行环境时,它会获得访问客户函数构件的限时授权。这些构件专门针对 Lambda 的执行环境和工件进行了优化。使用 ZIP 格式上载的函数代码经过一次优化,然后使用 AWS 托管式密钥和 AES-GCM 以加密格式存储。

使用容器镜像格式上载到 Lambda 的函数也进行了优化。容器镜像首先从其原始源下载,优化为不同的区块,然后使用经过身份验证的融合加密方法存储为加密块,该加密方法结合使用 AES-CTR、AES-GCM 和 SHA-256 MAC。融合加密方法允许 Lambda 安全地消除加密区块的重复数据。解密客户数据所需的所有密钥都使用客户托管式 AWS KMS 客户主密钥 (CMK) 进行保护。客户可以在 AWS CloudTrail 日志中使用 Lambda 服务所使用的 CMK,以便进行跟踪和审计。