如何在 AWS S3 存储桶和 Cloudfront 上的生产环境中隐藏 .env 密钥

How to hide .env keys in production environment on AWS S3 bucket & Cloudfront

提问人:PhuongHoang6897 提问时间:10/16/2023 更新时间:10/16/2023 访问量:45

问:

我正在做一个具有微前端结构的项目,这是一个托管子 React 应用程序的父 Astro 应用程序。使用的技术是 ReactJS,具有 Vite 和 Webpack CLI 等依赖项。

我正在使用 Amazon Cognito,并将 UserPoolId 和 ClientId 放在父 Astro 应用程序的 .env 文件中。

问题是一旦我部署到 AWS S3 和 CloudFront Distribution。.env 文件未提交到 Gitlab,因此部署的 CloudFront 网站不知道在哪里可以找到 UserPoolId 和 ClientId。

我一直在研究,似乎找不到一个好的方法。我考虑过为 UserPoolId 和 ClientId 设置 Gitlab CI/CD 管道变量,但我不确定这是否是好的做法。也考虑过使用 dotenv,但我认为这在生产环境中不适用于安全性,仅适用于开发。

我应该怎么做才能使部署的 CloudFront 网站能够以安全的方式访问 UserPoolId 和 ClientId?您采取了哪些步骤?很想听听您的意见!

reactjs amazon-web-services amazon-cognito astro .env

评论


答:

0赞 user22738196 10/16/2023 #1

最佳做法是不要将机密存储在文件中。这篇文章可能有用,我没有尝试过。

https://aws.amazon.com/blogs/networking-and-content-delivery/authorizationedge-how-to-use-lambdaedge-and-json-web-tokens-to-enhance-web-application-security/

它介绍了如何将 Cognito 放在 CloudFront 前面,并在用户登录后获取 Cognito 生成的 JWT 令牌,并通过 Lambda 函数(特别是Lambda@Edge部署)在最近的边缘站点对其进行验证。

验证后,请求将转发到源,并且可以访问私有内容。

0赞 Vinh Truong 10/16/2023 #2

您可以使用 AWS Secrets Manager 存储敏感变量。密钥可以在管道执行期间作为变量注入。
就我个人而言,我正在使用 Jenkins 作为我的 CI/CD,并且我们有细粒度的权限,所以我只是为了简化而创建一个 Jenkins 秘密文本。
或者,也可以从受保护的卷装载文件,前提是你在容器化环境中执行应用。
.env