首页 > 解决方案 > Cloudfront 如何分发 AWS KMS 密钥以获取静态加密的 S3 图像?

问题描述

我想使用AWS 的服务器端加密 (SSE)AWS 密钥管理服务 (KMS)来加密 S3 中的静态数据。(请参阅此AWS 博客文章,详细介绍 SSE-KMS。)

但是,我也有使用 Cloudfront 预签名 URL 的要求。

如何设置 Cloudfront 分配以使用 AWS KMS 中的密钥来解密和使用静态加密的 S3 对象?

这个 Boto3 问题似乎来自与我寻找相同答案的人,但没有结果)。

标签: amazon-web-servicesencryptionamazon-s3amazon-cloudfrontaws-kms

解决方案


这在以前是不可能的,因为 CloudFront 不支持它,并且因为(正如我在对 John 的回答的评论中提到的那样——这是在正确的轨道上)没有办法使用 Lambda@Edge 推出自己的解决方案,因为X-Amz-Cf-Id请求标头——在 CloudFront 的背面生成并且仅对 S3 可见,对触发器调用不可见——将使您尝试添加到 Lambda@Edge 触发器内的请求的任何签名无效,因为所有X-Amz-*标头的签名都是强制性的。

但是X-Amz-Cf-Id标头值现在暴露给事件结构中的 Lambda@Edge 触发器函数——不是与其他请求标头一起,而是作为一个简单的字符串属性——在event.Records[0].cf.config.requestId.

有了这个值,您可以在 Lambda@Edge 环境中使用执行角色凭证和内置 SDK 来生成签名并添加必要的标头(包括Authorization带有派生凭证标识符和新生成签名的标头)到请求。

此设置不使用源访问标识符 (OAI),因为使用 Lambda@Edge 触发器的 IAM 执行角色而不是 OAI 来说服 S3 请求已获得授权。

Achraf Souk 发布了一篇官方 AWS 博客文章,从头到尾解释了该解决方案。

https://aws.amazon.com/blogs/networking-and-content-delivery/serving-sse-kms-encrypted-content-from-s3-using-cloudfront/


推荐阅读