如何为应用程序用户授予对S3资源的有限访问权限?

时间:2020-04-04 22:39:17

标签: node.js amazon-web-services amazon-s3

每个用户都有保存在S3中的唯一数据。此资源应仅对该特定用户可见。传统的方式是在后端获取这些东西并将其传递给用户。确保在应用程序逻辑中只有符合条件的用户才能得到它。但是,当我仅将密钥/令牌提供给我希望能够访问S3存储桶的用户时,为什么还要通过我的应用程序传递这些额外的数据。这样他们就可以从中检索数据并将其保存。

2 个答案:

答案 0 :(得分:1)

您的问题并未说明您打算如何运行该应用程序,因此这里有一些一般性建议...

是的,您可以使用Amazon Cognito和AWS Security Token Service创建临时凭证。这些凭据将具有关联的权限,这些权限决定了它们可以访问的内容。这对于移动应用非常普遍,因为它们可以直接调用AWS API并直接请求数据。

Using Amazon Cognito for Mobile Apps - AWS Identity and Access Management

如果您的应用程序管理自己的身份验证,那么您也可以直接使用AWS STS(无需Cognito)。

重要的部分是仅对他们有权访问的数据提供权限。为此,您可以考虑使用IAM Policy Variables,每个用户在共享的Amazon S3存储桶中都有自己的文件夹。

答案 1 :(得分:1)

传统方式是在后端获取这些东西并将其传递给用户。

不,不是。没人应该这样做。

但是,当我只能将密钥/令牌提供给用户时,为什么还要通过我的应用程序传递这些额外的数据...

您在这里朝着正确的方向前进。幸运的是,S3定义了一种更好的方法,也是常用方法。

您无需提供密钥,而是对URL进行了加密签名。密钥/秘密保留在服务器端,对最终用户隐藏。您创建一个URL,该URL指示要下载的资源,以及其他参数,例如该URL的到期日期。然后,使用只有密钥/机密人员才能计算的计算值对它进行“签名”。可以通过API响应或所需的任何方法将生成的URL直接提供给您的客户端。

然后,客户端使用此URL请求资源,并且直接从S3提供服务​​。 S3验证签名,知道它来自您,并提供适当的响应。

一个示例,假设您正在使用S3 JS SDK:

s3.getSignedUrl('getObject', {
  Bucket: 'bucket',
  Key: 'path/to/object'
});

另请参阅:https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#getSignedUrl-property