Lambda 隔离技术 - AWS Lambda 的安全性概览

Lambda 隔离技术

Lambda 使用各种开源和专有隔离技术来保护工件和执行环境。每个执行环境都包含以下各项的专用副本:

  • 特定函数版本的代码

  • 为您的函数版本选择的任何 AWS Lambda 层

  • 所选函数运行时(例如 Java 11、NodeJS 12、Python 3.8 等)或函数的自定义运行时

  • 可写入的 /tmp 目录

  • 基于 Amazon Linux 2 的最小 Linux 用户空间

执行环境使用 Linux 内核中内置的几种类似容器的技术以及 AWS 专有的隔离技术相互隔离。这些技术包括:

  • cgroups – 用于限制函数对 CPU 和内存的访问。

  • namespaces – 每个执行环境都在专用的命名空间中运行。我们通过拥有唯一的组进程 ID、用户 ID、网络接口以及其他由 Linux 内核管理的资源来实现这一点。

  • seccomp-bpf – 限制可以在执行环境中使用的系统调用 (syscall)。

  • iptables 路由表 – 阻止入口网络通信并隔离 MVM 之间的网络连接。

  • chroot – 提供针对底层文件系统的限定访问。

  • Firecracker 配置 – 用于限制块储存设备和网络设备吞吐量的速率。

  • Firecracker 安全功能 – 有关 Firecracker 的当前安全设计的更多信息,请参阅 Firecracker 的最新设计文档

这些机制与 AWS 专有的隔离技术一起,在执行环境之间提供了强大的隔离。

存储和状态

执行环境始终不会在不同的函数版本或客户之间重用,但可以在同一函数版本的多个调用之间重用单个环境。这意味着数据和状态可以在调用之间保留。作为正常执行环境生命周期管理的一部分,数据和/或状态可能会持续存在数小时,然后才会被销毁。出于性能方面的考虑,函数可以利用此行为,通过在调用之间保留和重用本地缓存或长寿命连接来提高效率。在执行环境中,这些多次调用由单个进程处理,因此,如果调用发生在重用的执行环境中,则任何进程范围的状态(例如 Java 中的静态状态)都可以供将来的调用重用。

每个 Lambda 执行环境还包括一个可写入的文件系统(位于 /tmp)。此存储无法跨执行环境访问或共享。与进程状态一样,写入 /tmp 的文件将在执行环境的生命周期内保留。这允许在多个调用间分摊昂贵的传输操作,例如下载机器学习 (ML) 模型。不希望在两次调用之间保留数据的函数不应写入 /tmp,或者应在调用之间从 /tmp 中删除其文件。/tmp 目录由 Amazon EC2 实例存储提供支持,并进行静态加密。

希望将数据保留到执行环境之外的文件系统的客户应考虑使用 Lambda 与 Amazon Elastic File System (Amazon EFS) 的集成。有关更多信息,请参阅将 Amazon EFS 与 AWS Lambda 配合使用

如果客户不希望在调用之间保留数据或状态,Lambda 建议他们不要使用执行上下文或执行环境来存储数据或状态。如果客户希望主动防止在调用之间泄漏数据或状态,Lambda 建议他们为每个状态创建不同的函数。Lambda 不建议客户在执行环境中使用或存储安全敏感状态,因为该状态可能会在调用之间发生变化。我们建议改为在每次调用时重新计算状态。