直接从网络应用程序安全访问亚马逊 s3?

Ole*_*Ole 2 javascript amazon-s3 amazon-web-services single-page-application

根据我对如何设置对亚马逊 s3 存储桶的安全访问的回顾,我们首先生成一个 IAM 用户,然后绑定一个安全策略,允许对该用户进行 s3 访问。之后我们可以为存储桶生成 API 密钥,该密钥可以对存储桶访问请求进行身份验证。目前我的理解是这样的,如有遗漏还请指正。

我假设 API 密钥应该仅在服务器端(The Secret Access Key)。换句话说,将它们直接放在网络应用程序中不安全吗?因此,我们首先必须将数据发送到我们的服务器,然后我们可以使用 API 密钥将其发送到存储桶?

有什么方法可以确保从 Web 应用程序直接访问亚马逊 s3 存储桶的安全吗?

方法总结

根据与 @CaesarKabalan 的讨论,听起来允许这样做的方法是:

1) 创建一个 IAM 用户,该用户可以创建可通过 Amazon Cognito 进行身份验证的身份 - 让我们将此步骤分配的凭证称为 Cognito 凭证。

2) 用户使用 Google 等登录 Web 应用程序

3) Web 应用程序向 Web 应用程序的服务器(可能是 lambda 函数)发出请求,以使用 Amazon Cognito 注册用户

4) Web 应用程序现在直接从 Amazon Cognito 获取用户的凭证,并使用这些凭证将数据发送到 s3 存储桶。

我认为这就是我们在概念上的处境。现在是时候进行测试了!

Cae*_*lan 5

从你的问题来看,我不确定你的应用程序的哪些部分在AWS中,也不确定你的安全策略,但你基本上有三个选择:

  1. (坏)将您的密钥存储在客户端上。根据您的部署范围,这可能没问题。例如,如果每个客户端都有自己的专用用户和存储桶,则可能不会有太大风险,特别是对于您控制访问的各个方面的私人组织而言。这是最简单的,但安全性较差。如果您的应用程序是多租户的,则不应使用此功能。大概是一起走吧……
  2. (太棒了)使用 API 端点将此数据移动到您的存储桶中。这将涉及某种基础设施来从客户端安全地接收文件,然后使用本地存储的安全密钥将其移动到 S3 中。这类似于传统的 Web 应用程序对数据库进行 IO。S3 中的所有数据都会经过应用程序的这一层。缺点是您必须编写该服务、托管它并支付带宽费用。
  3. (最佳)使用 Amazon Cognito 为每个应用程序/用户分配自己的访问密钥。我个人没有这样做,但我的理解是,您可以为每个实体提供自己的短期访问凭据(可以更新),并且您可以授予他们直接将数据写入 S3 的访问权限。这里最困难的部分是构建您的 S3 存储桶并为您的应用程序用户正确设计 IAM 凭证,以便他们能够准确地执行您想要的操作。这里的好处是用户直接写入 S3 存储桶,您使用所有本机 AWS 服务并编写很少的自定义代码。我认为这是最好、最安全的企业级解决方案。以下是一个示例:Amazon S3:允许 Amazon Cognito 用户访问其存储桶中的对象

很高兴回答任何更多问题或澄清。