S3 对象 Lambda 接入点的安全注意事项
使用 Amazon S3 对象 Lambda,您可以借助使用 AWS Lambda 作为计算平台的规模和灵活性,在数据离开 Amazon 3 时对其执行自定义转换。S3 和 Lambda 在默认情况下保持安全,但是为了维持这种安全性,Lambda 函数的作者需要特别考虑一些注意事项。S3 对象 Lambda 要求所有访问都由经过身份验证的主体(无匿名访问)和 HTTPS 进行。
为降低安全风险,我们提出以下建议:
-
将 Lambda 执行角色的范围限定为尽可能小的权限集。
-
只要有可能,就确保您的 Lambda 函数通过提供的预签名 URL 访问 Amazon S3。
配置 IAM 策略
S3 接入点支持 AWS Identity and Access Management(IAM)资源策略,这些策略允许您按资源、用户或其他条件控制接入点的使用。有关更多信息,请参阅 为对象 Lambda 接入点配置 IAM 策略。
加密行为
由于对象 Lambda 接入点同时使用 Amazon S3 和 AWS Lambda,因此,加密行为会存在差异。有关默认 S3 加密行为的更多信息,请参阅为 Amazon S3 存储桶设置默认服务器端加密行为。
-
将 S3 服务器端加密与对象 Lambda 接入点结合使用时,需要先将对象解密,然后再将其发送到 Lambda。将对象发送到 Lambda 后,将以未加密方式对其进行处理(如果是
GET
或HEAD
请求)。 -
为防止密钥被记录,S3 将拒绝针对以下对象的
GET
和HEAD
请求:使用具有客户提供的密钥的服务器端加密(SSE-C)来加密的对象。但是,如果 Lambda 函数可以访问客户端提供的密钥,它仍可检索这些对象。 -
将 S3 客户端加密与对象 Lambda 接入点结合使用时,请确保 Lambda 有权访问加密密钥,以便它可以解密和重新加密对象。
接入点安全性
S3 对象 Lambda 使用两个接入点,一个对象 Lambda 接入点和一个标准 S3 接入点(称为支持接入点)。当您向对象 Lambda 接入点发出请求时,S3 会代表您调用 Lambda,或将请求委派给支持接入点,具体取决于 S3 对象 Lambda 配置。当针对请求调用 Lambda 时,S3 将通过支持接入点,代表您向对象生成一个预签名 URL。您的 Lambda 函数将在调用此函数时接收此 URL 以作为输入。
您可以将 Lambda 函数设置为使用此预签名 URL 来检索原始对象,而不是直接调用 S3。通过使用此模型,您可以为对象应用更好的安全边界。您可以将通过 S3 存储桶或 S3 接入点进行的直接对象访问,限制为一组有限的 IAM 角色或用户。这种方法也可以防止您的 Lambda 函数受到混淆代理问题的影响,发生混淆代理问题时,配置错误的函数具有与调用方不同的权限,可以允许或拒绝对于对象的访问(但原本不应如此)。
对象 Lambda 接入点公共访问权限
S3 对象 Lambda 不允许匿名访问和公有访问,因为 Amazon S3 必须向您的身份授权,才能完成任何 S3 对象 Lambda 请求。当通过对象 Lambda 接入点调用请求时,您必须对于已配置的 Lambda 函数拥有 lambda:InvokeFunction
权限。同样,当通过对象 Lambda 接入点调用其他 API 操作时,您必须拥有所需的 s3:*
权限。
如果不具有这些权限,则调用 Lambda 或委托给 S3 的请求将失败,并出现 HTTP 403 (Forbidden) [HTTP 403(禁止访问)] 错误。必须由经过身份验证的主体进行所有访问。如果您需要公有访问权限,可使用 Lambda@Edge 作为可能的替代方案。有关更多信息,请参阅 Amazon CloudFront 开发人员指南中的使用 Lambda@Edge 在边缘进行自定义。
对象 Lambda 接入点 IP 地址
describe-managed-prefix-lists
子网支持网关虚拟私有云(VPC)端点,并与 VPC 端点的路由表相关。由于对象 Lambda 接入点不支持网关 VPC,因此其 IP 范围缺失。缺失的范围属于 Amazon S3,但网关 VPC 端点不支持。有关 describe-managed-prefix-lists
的更多信息,请参阅《Amazon EC2 API 参考》中的 DescribeManagedPrefixLists 和《AWS 一般参考》中的 AWS IP 地址范围。
对象 Lambda 接入点 CORS 支持
当 S3 对象 Lambda 收到来自浏览器的请求或包含 Origin
标头的请求时,S3 对象 Lambda 始终会添加 “AllowedOrigins":"*"
标头字段。
有关更多信息,请参阅 使用跨源资源共享 (CORS)。