我们使用机器学习技术将英文博客翻译为简体中文。您可以点击导航栏中的“中文(简体)”切换到英文版本。
使用 亚马逊云科技 Lambda 运行时 API 代理扩展增强运行时安全和监管
这篇文章由首席无服务器解决方案架构师安东·亚历山德罗夫和 亚马逊云科技 Lambda 高级产品经理 Shridhar Pandey 撰写。
这种方法使安全供应商和工程团队能够为 Lambda 功能提供增强的、非侵入性的安全和治理工具。用例包括清理事件负载、阻止恶意事件以及审计和增强有效负载。
概述
Lambda 运行时使用运行时 API 来检索下一个要由函数处理程序处理的传入事件,并将处理程序响应返回给 Lambda 服务。
以下是运行时和扩展程序通过运行时 API 和扩展 API 端点与 Lambda 服务进行通信的方式:
亚马逊云科技 Lambda 运行时 API 和扩展 API 端点
在 Lambda 服务中
提供的信息包含函数调用元数据,但不包含事件负载。这使得该事件对可观测性很有用,但仅限于应用程序安全和治理用例,例如检查有效负载是否存在漏洞、清理输入和阻止恶意事件。
Lambda 运行时 API 代理是一种允许您进入函数调用请求和响应生命周期的模式。它允许您使用扩展来实现高级安全性、合规性、治理和可观察性方案,而无需更改函数代码。您可以添加运行时安全机制,对流入和流出函数的数据实施审计程序,通过自动注入跟踪标头来增强可观察性等等。
了解 Lambda 运行时 API 工作流程
这就是 Lambda 运行时使用 Lambda 运行时 API 的方式:
Lambda 运行时如何使用 Lambda 运行时 API
Lambda 运行时使用
亚马逊云科技_LAMBDA_RUNTIME_API 环境变量的值来发出运行时 API 请求
。两个主要端点是
/nex
t(用于检索下一个要处理的事件)和
/
response(用于将事件处理结果返回给 Lambda 服务)。此外,运行时 API 还提供用于报告故障的端点。查看运行时 API 的完整
运行时 API 代理方法的工作原理
运行时 API 代理是一个组件,你可以构建它来挂接到调用工作流程中。它代理请求和响应,允许您对其进行扩充并控制工作流程:
运行时 API 代理挂钩
当 Lambda 服务创建新的执行环境时,它首先要初始化附加到函数的扩展。执行环境通过调用扩展 API /register 端点等待所有扩展向 Lambda 服务注册 ,然后继续初始化运行时。这允许您在扩展初始化期间启动运行时 API 代理 HTTP 侦听器,使其为处理运行时请求做好准备。
运行时 API 代理流程
默认情况下,运行时进程中
亚马逊云科技_LAMBDA_RUNTIME_API 环境变量的值指向 Lambda 运行时 API
端点 127.0.0。1:9001。
您可以使用
封装脚本允许您设置无法通过特定语言环境变量设置的配置参数,从而自定义 Lambda 函数的运行时启动行为。您可以通过设置 亚马逊云科技 _LAMBDA_EXEC_W RAPPER 环境变量来向函数添加包装脚本。以下包装脚本假设运行时 API 代理正在监听端口 9009。
#!/bin/bash
export AWS_LAMBDA_RUNTIME_API="127.0.0.1:9009"
exec "$@"
您可以将此导出行添加到现有的包装脚本中,也可以创建新的封装脚本。
运行时 API 代理示例
当创建新的执行环境时,运行时 API 代理将由 Lambda 服务引导,并且准备好在首次调用之前将请求从 Lambda 运行时代理到运行时 API。
实现运行时 API 代理逻辑
亚马逊云科技 建议您使用可编译为二进制可执行文件的编程语言(例如 Golang 或 Rust)来实现扩展。这允许您在任何 Lambda 运行时中使用该扩展。使用解释性语言(例如 JavaScript 和 Python)或需要额外虚拟机的语言(例如 JavaScript 和 C#)实现的扩展只能在该特定的运行时中使用。
下图显示了扩展程序处理传入事件和出站响应的场景。您可以使用此工作流程来审核事件或响应负载、对其进行清理或注入其他属性。你可以将其用于屏蔽账号、删除个人身份信息 (PII) 或注入可观察性标题等场景。
运行时 API 代理逻辑
此图演示了一个高级场景,其中第一个入站事件被识别为恶意事件,并被 Runtime API 代理拒绝。函数处理程序未被调用。第二个事件未被标记为恶意事件,因此会转发给处理程序进行处理。您可以将此工作流程用于运行时应用程序保护等安全场景。
运行时 API 代理安全场景
使用运行时 API 代理解决方案的 亚马逊云科技 合作伙伴
“使用 Lambda 运行时 API 代理解决方案对我们来说是一种改变游戏规则的方法。它使我们能够通过单个实现支持多个 Lambda 运行时,提供对 Lambda 执行的全面可见性,并允许检测针对无服务器应用程序的攻击者,” Datadog 应用程序安全管理工程经理 Julio Guerra 说。
“Lambda 运行时 API 代理是一个简单的解决方案,它为我们提供了一种保护 Lambda 函数网址的可插拔方式。我们可以在不更改函数代码的情况下实现请求授权和扩展。” Okta Inc. 解决方案工程高级经理 Ilya Zilber 说。
安全最佳实践
扩展与函数在相同的执行环境中运行,因此它们对文件系统、网络和环境变量等资源具有相同级别的访问权限。分配给该函数的 IAM 权限与扩展程序共享。我们的指导是为您的职能分配最不需要的权限。
务必仅安装来自可信来源的扩展。使用基础设施即代码 (IaC) 工具,例如
构建扩展时,请勿记录敏感数据。在记录或保留有效载荷和元数据以用于审计目的之前,先对其进行清理。
注意事项
运行时 API 代理方法允许您连接到 Lambda 请求/响应工作流程,从而实现新的安全和可观测性用例。有几个重要的注意事项:
- 这需要您充分了解 Lambda 执行环境生命周期和 Lambda 运行时 API。您必须为所有运行时 API 端点实现代理,并处理潜在的运行时故障。
- 为多个扩展实现运行时 API 代理模式的场景做好可组合性准备。允许您的扩展程序使用者使用至少两个参数通过环境变量配置扩展:您的代理监听的端口和您的代理将请求转发到的运行时 API 端点。后者应默认为 亚马逊云科技_LAMBDA_RUNTIME_ API 环境变量的原始值。有关详细信息,请参阅下面的示例实现。
-
使用默认缓冲响应代理 API 请求需要额外的工作来支持带有
响应负载 流的函数。 - 代理 API 请求会增加延迟。增加的开销取决于您的实现。亚马逊云科技 建议使用可编译为可执行二进制文件的编程语言,例如 Rust 和 Golang,并保持扩展程序的轻量级和优化。
样本
你可以在
按照 Readme.md 中描述的说明获取有关运行扩展程序的分步教程。
结论
这篇文章介绍并说明了 Lambda 运行时 API 代理模式。您可以使用此模式挂接 Lambda 函数请求和响应工作流程,以拦截、处理、审计、修改和阻止入站事件和处理程序响应。
您可以使用此模式来实现增强的运行时安全和治理场景,以及来自其他领域的场景。亚马逊云科技 客户和合作伙伴可以使用这种高级解决方案方法来增强 Lambda 函数的安全性和可观察性,而无需更改代码。
如需更多无服务器学习资源,请访问
*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您发展海外业务和/或了解行业前沿技术选择推荐该服务。