AWS 静态网站 + 云端签名 cookie
Posted
技术标签:
【中文标题】AWS 静态网站 + 云端签名 cookie【英文标题】:AWS static website + cloudfront signed cookies 【发布时间】:2021-07-05 22:14:58 【问题描述】:我有一个由 S3 存储桶 (b1) 支持的静态网站,带有 Cloudfront Web 分发版。分配上的行为允许访问此存储桶。
我有另一个 S3 存储桶 (b2),其中包含配置为仅通过云端 URL 访问的私有内容(使用 S3OriginConfig 和行为进行配置)。
b1 和 b2 都配置了 publicReadAccess 被阻止并设置了 BlockPublicAccess.BLOCK_ALL。
我已经配置了一个云端原始访问身份来访问公共和私有 s3 存储桶内容并且它可以工作。
例如:http://myapp.cloudfront.net/private_content.jpg
映射到 b2,因为 *.jpg 路径模式配置为访问保存 jpg 文件的私有存储桶 b2,http://myapp.cloudfront.net
将我带到为分发配置的索引页面。
我想使用本文档中所述的签名 cookie 来防止在未经适当授权的情况下访问私人内容: https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-setting-signed-cookie-custom-policy.html
具体来说,文档中的第2点:
您开发应用程序以确定用户是否应该拥有 访问您的内容,如果是,发送三个 Set-Cookie 标头到 查看器。 (每个 Set-Cookie 标头只能包含一个 name-value 对,而 CloudFront 签名的 cookie 需要三个名称-值对。) 您必须在查看器之前将 Set-Cookie 标头发送给查看器 请求您的私人内容。如果您在 cookie,您可能还想再发送三个 Set-Cookie 标头 响应后续请求,让用户继续拥有 访问。
即,要求是仅在经过身份验证的情况下才允许查看者访问私有内容。
如何处理静态网站(我的是一个使用 HTML + JS 文件的单页应用程序)?
其他细节:
我使用 AWS cognito 对用户进行身份验证,并使用 cognito 身份池对我的应用程序中的用户进行授权。 SPA 应用程序对 API 网关进行后端 Rest API 调用。因此,我可以插入 Set-Cookie 标头的一个位置是在调用的第一个 API 调用中。但是,目前这是一个不同的 URL(不在云端分发中),并且 web 应用程序发出的 API 调用是 CORS。问题:
-
推荐的方法是确保只有经过身份验证的用户才能访问私有内容? (欢迎提出更简单、更安全的建议)
如果要采用 Set-Cookie/云端签名 cookie 方法,我是否应该使用路径路由将 API 也置于云端(这也将简化 CORS)?
【问题讨论】:
为什么不使用 CloudFront 签名 URL? 我正在使用本文档参考中提供的指导:docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/… 具体而言,在以下情况下使用签名 cookie:您希望提供对多个受限文件的访问权限,例如,所有HLS 格式的视频文件或网站订阅者区域中的所有文件。您不想更改当前的 URL。 对于我的应用,我不想更改 URL。因此使用签名的 cookie。 看起来 lambda@Edge 可能是解决这个问题的方法。通过阅读文档,处理私有内容的 lambda@Edge 函数是在云端分发中定义的,并且由于云端缓存可以跨所有区域复制,它应该卸载原始负载,并且 lambda 可以处理预检 OPTIONS 和 GET 私有内容,授权后重定向到原点。这将跳过 api 网关。这在理论上应该可行;在向 a.url (cf) 发出请求并且重定向到不同域 b.url (s3 url) 的情况下,来自 lambda@Edge 的重定向是否有效? 【参考方案1】:经过大量挖掘和研究,我找到了这个亚马逊文档链接,它为我正在解决的问题类型提供了架构。
克鲁斯,O.(2019 年 8 月 16 日)。 Authorization@Edge using cookie:保护您的 Amazon CloudFront 内容不被未经身份验证的用户下载。检索于 2021 年 4 月 15 日,来自 https://aws.amazon.com/blogs/networking-and-content-delivery/authorizationedge-using-cookies-protect-your-amazon-cloudfront-content-from-being-downloaded-by-unauthenticated-users/
来自文章:
示例解决方案的构建块 对于示例解决方案,我们 使用以下主要构建块:
用于托管 SPA 的私有 S3 存储桶。 CloudFront 分配到 向用户提供 SPA。 用于检查 JSON Web 的 Lambda@Edge 函数 传入请求的 cookie 中包含的令牌 (JWT)。这 函数要么允许请求,要么将其重定向以进行身份验证, 基于用户是否已登录。 一个 Lambda@Edge 函数 在用户登录时设置正确的 cookie。用户的浏览器 在后续请求中自动发送这些 cookie,这使得 跨请求持久登录。 Cognito 用户池具有 允许用户完成登录的托管 UI 设置。解决方案 使用标准的“带有 PCKE 的授权码”OAuth2 授权,它 受 Cognito 支持。
如果您对上述文章中的代码示例感兴趣,请联系available here on Github。
Amazon 的另一篇博客文章使用了另一种在 URL 中嵌入 JSON Web 令牌 (JWT) 的技术。
Tomic, A. 和 Worrell, C.(2018 年 1 月 29 日)。 Authorization@Edge – 如何使用 Lambda@Edge 和 JSON Web 令牌来增强 Web 应用程序的安全性。检索于 2021 年 4 月 15 日,来自 https://aws.amazon.com/blogs/networking-and-content-delivery/authorizationedge-how-to-use-lambdaedge-and-json-web-tokens-to-enhance-web-application-security/
上述文章的代码示例是available here on Github。
总之,您可以使用 Lambda@Edge 来授权私有内容,并使用上面提到的签名 cookie 或签名 URL。
【讨论】:
我会将这个添加到组合中 - github.com/Widen/cloudfront-auth - 这是一个不错的项目,您可以根据现有的 CloudFront 分发构建 Lambda@Edge 函数(查看器请求)。我计划稍微升级这个项目,使其更易于部署。无论如何,看看它,它很好以上是关于AWS 静态网站 + 云端签名 cookie的主要内容,如果未能解决你的问题,请参考以下文章
AWS CloudFront 签名 Cookie CORS 问题
带有签名 cookie 的 AWS Cloudfront POST 请求
没有密钥对(RSA 私钥)的 aws cloudfront 中的签名 cookie