使用 亚马逊云科技 Lambda 运行时 API 代理扩展增强运行时安全和监管

作者: 朱利安·伍德 |

这篇文章由首席无服务器解决方案架构师安东·亚历山德罗夫和 亚马逊云科技 Lambda 高级产品经理 Shridhar Pandey 撰写。

亚马逊云科技 Lam bda 运行时使用 Lambda 运行时 API 与 Lambda 服务 进行通信。运行时使用它来检索要由函数处理程序处理的入站事件、向 Lambda 服务返回成功的处理程序响应以及报告失败。这篇文章展示了如何使用运行时 API 代理模式在不更改函数代码的情况下拦截入站事件和出站响应。

这种方法使安全供应商和工程团队能够为 Lambda 功能提供增强的、非侵入性的安全和治理工具。用例包括清理事件负载、阻止恶意事件以及审计和增强有效负载。

概述

Lambda 运行时 API 是 L amb da 执行环境中可用的 HTTP 端点。 它允许执行函数代码的 Lambda 运行时与 Lambda 服务通信。它由托管的 Lambda 运行时(例如 Node.js 或 Python)以及 自定义运行时 使用 ,这使开发人员能够使用他们选择的任何编程语言创建自己的 Lambda 运行时。

Lambda 运行时使用运行时 API 来检索下一个要由函数处理程序处理的传入事件,并将处理程序响应返回给 Lambda 服务。

Lambda 扩展 使您能够将 Lambda 功能与贵组织的首选监控、可观测性、安全性和治理工具集成。您可以将 亚马逊云科技 、AW S Lambda Ready 合作伙伴和开源项目提供的 扩展 用于各种用例。扩展允许添加功能,例如预取配置或调度遥测,而无需对功能代码进行侵入性更改。Lambda 扩展以 Lambda 层 的形式打包 ,在执行环境中作为单独的进程运行。

以下是运行时和扩展程序通过运行时 API 和扩展 API 端点与 Lambda 服务进行通信的方式:

AWS Lambda Runtime API and Extensions API endpoints

亚马逊云科技 Lambda 运行时 API 和扩展 API 端点

在 Lambda 服务中 注册扩展 时,您可以指定要接收 INVOKE 事件。调用函数时,Lambda 服务会将此事件异步发送到扩展。

提供的信息包含函数调用元数据,但不包含事件负载。这使得该事件对可观测性很有用,但仅限于应用程序安全和治理用例,例如检查有效负载是否存在漏洞、清理输入和阻止恶意事件。

Lambda 运行时 API 代理是一种允许您进入函数调用请求和响应生命周期的模式。它允许您使用扩展来实现高级安全性、合规性、治理和可观察性方案,而无需更改函数代码。您可以添加运行时安全机制,对流入和流出函数的数据实施审计程序,通过自动注入跟踪标头来增强可观察性等等。

了解 Lambda 运行时 API 工作流程

这就是 Lambda 运行时使用 Lambda 运行时 API 的方式:

How the Lambda Runtime consumes the Lambda Runtime API

Lambda 运行时如何使用 Lambda 运行时 API

Lambda 运行时使用 亚马逊云科技_LAMBDA_RUNTIME_API 环境变量的值来发出运行时 API 请求 。两个主要端点是 /nex t(用于检索下一个要处理的事件)和 / response(用于将事件处理结果返回给 Lambda 服务)。此外,运行时 API 还提供用于报告故障的端点。查看运行时 API 的完整 协议和架构定义

运行时 API 代理方法的工作原理

运行时 API 代理是一个组件,你可以构建它来挂接到调用工作流程中。它代理请求和响应,允许您对其进行扩充并控制工作流程:

Runtime API proxy hooks

运行时 API 代理挂钩

当 Lambda 服务创建新的执行环境时,它首先要初始化附加到函数的扩展。执行环境通过调用扩展 API /register 端点等待所有扩展向 Lambda 服务注册 ,然后继续初始化运行时。这允许您在扩展初始化期间启动运行时 API 代理 HTTP 侦听器,使其为处理运行时请求做好准备。

Runtime API proxy flow

运行时 API 代理流程

默认情况下,运行时进程中 亚马逊云科技_LAMBDA_RUNTIME_API 环境变量的值指向 Lambda 运行时 API 端点 127.0.0。1:9001。 您可以使用 包装脚本 将该值更改为指向 Runtime API 代理端点。

封装脚本允许您设置无法通过特定语言环境变量设置的配置参数,从而自定义 Lambda 函数的运行时启动行为。您可以通过设置 亚马逊云科技 _LAMBDA_EXEC_W RAPPER 环境变量来向函数添加包装脚本。以下包装脚本假设运行时 API 代理正在监听端口 9009。

#!/bin/bash
export AWS_LAMBDA_RUNTIME_API="127.0.0.1:9009"
exec "$@"

您可以将此导出行添加到现有的包装脚本中,也可以创建新的封装脚本。

Runtime API proxy example

运行时 API 代理示例

当创建新的执行环境时,运行时 API 代理将由 Lambda 服务引导,并且准备好在首次调用之前将请求从 Lambda 运行时代理到运行时 API。

实现运行时 API 代理逻辑

亚马逊云科技 建议您使用可编译为二进制可执行文件的编程语言(例如 Golang 或 Rust)来实现扩展。这允许您在任何 Lambda 运行时中使用该扩展。使用解释性语言(例如 JavaScript 和 Python)或需要额外虚拟机的语言(例如 JavaScript 和 C#)实现的扩展只能在该特定的运行时中使用。

下图显示了扩展程序处理传入事件和出站响应的场景。您可以使用此工作流程来审核事件或响应负载、对其进行清理或注入其他属性。你可以将其用于屏蔽账号、删除个人身份信息 (PII) 或注入可观察性标题等场景。

Runtime API proxy logic

运行时 API 代理逻辑

此图演示了一个高级场景,其中第一个入站事件被识别为恶意事件,并被 Runtime API 代理拒绝。函数处理程序未被调用。第二个事件未被标记为恶意事件,因此会转发给处理程序进行处理。您可以将此工作流程用于运行时应用程序保护等安全场景。

Runtime API proxy security scenario

运行时 API 代理安全场景

使用运行时 API 代理解决方案的 亚马逊云科技 合作伙伴

“使用 Lambda 运行时 API 代理解决方案对我们来说是一种改变游戏规则的方法。它使我们能够通过单个实现支持多个 Lambda 运行时,提供对 Lambda 执行的全面可见性,并允许检测针对无服务器应用程序的攻击者,” Datadog 应用程序安全管理工程经理 Julio Guerra 说。

“Lambda 运行时 API 代理是一个简单的解决方案,它为我们提供了一种保护 Lambda 函数网址的可插拔方式。我们可以在不更改函数代码的情况下实现请求授权和扩展。” Okta Inc. 解决方案工程高级经理 Ilya Zilber 说。

安全最佳实践

扩展与函数在相同的执行环境中运行,因此它们对文件系统、网络和环境变量等资源具有相同级别的访问权限。分配给该函数的 IAM 权限与扩展程序共享。我们的指导是为您的职能分配最不需要的权限。

务必仅安装来自可信来源的扩展。使用基础设施即代码 (IaC) 工具,例如 亚马逊云科技 CloudFormation,简化向多个函数附加相同扩展配置( 包括 亚马逊云科技 身份和访问 管理 (IAM) 权限)的任务。此外,iaC 工具允许您对之前使用的扩展和版本进行审核记录。

构建扩展时,请勿记录敏感数据。在记录或保留有效载荷和元数据以用于审计目的之前,先对其进行清理。

注意事项

运行时 API 代理方法允许您连接到 Lambda 请求/响应工作流程,从而实现新的安全和可观测性用例。有几个重要的注意事项:

  • 这需要您充分了解 Lambda 执行环境生命周期和 Lambda 运行时 API。您必须为所有运行时 API 端点实现代理,并处理潜在的运行时故障。
  • 为多个扩展实现运行时 API 代理模式的场景做好可组合性准备。允许您的扩展程序使用者使用至少两个参数通过环境变量配置扩展:您的代理监听的端口和您的代理将请求转发到的运行时 API 端点。后者应默认为 亚马逊云科技_LAMBDA_RUNTIME_ API 环境变量的原始值。有关详细信息,请参阅下面的示例实现。
  • 使用默认缓冲响应代理 API 请求需要额外的工作来支持带有 响应负载 流的函数。
  • 代理 API 请求会增加延迟。增加的开销取决于您的实现。亚马逊云科技 建议使用可编译为可执行二进制文件的编程语言,例如 Rust 和 Golang,并保持扩展程序的轻量级和优化。

样本

你可以在 https://github.com/aws-samples/aws-lambda-extensions/ 找到实现运行时 API 代理的示例扩展 。请参阅 Golang Rust Node.js 示例。

按照 Readme.md 中描述的说明获取有关运行扩展程序的分步教程。

结论

这篇文章介绍并说明了 Lambda 运行时 API 代理模式。您可以使用此模式挂接 Lambda 函数请求和响应工作流程,以拦截、处理、审计、修改和阻止入站事件和处理程序响应。

您可以使用此模式来实现增强的运行时安全和治理场景,以及来自其他领域的场景。亚马逊云科技 客户和合作伙伴可以使用这种高级解决方案方法来增强 Lambda 函数的安全性和可观察性,而无需更改代码。

如需更多无服务器学习资源,请访问 无服务器世界


*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您发展海外业务和/或了解行业前沿技术选择推荐该服务。