【问题标题】:AWS generate dynamic credential for S3 folder level access?AWS 为 S3 文件夹级别访问生成动态凭证?
【发布时间】:2019-03-12 05:32:36
【问题描述】:

我是 AWS 的新手,但仍在弄清楚如何做事。

我的部分 Web 应用程序使用 AWS S3 进行文件存储,但我希望每个用户只能访问存储桶中的特定文件夹(对于 CRUD)。 后端服务器将跟踪用户将能够访问哪些文件夹。

我知道可以定义允许访问特定文件夹的策略(通过匹配对象的前缀),但我可以动态生成这些策略并获取附加这些策略的凭据(可能使用 Cognito?)。以便这些凭据可以传递到客户端以启用对 S3 文件夹的访问。

我想知道是否有可能做到这一点,以及实现这一点需要哪些服务。

【问题讨论】:

  • 你看presigned URLs了吗?它们可用于创建临时有效的 URL 以下载文件,然后您只能将其提供给特定用户。如果您需要上传用户/客户端文件,我相信您也可以生成预签名的 POST。

标签: amazon-web-services amazon-s3 amazon-cognito


【解决方案1】:

你应该改变你的观点,每次你想与你的一个用户共享一个文件时,你应该检查你的数据库关于他们的权限(他们有权访问的文件夹),如果你这边的逻辑事情是正确的,生成一个预签名的访问该对象的 URL。

预签名 URL 的工作原理。

当你生成一个预签名的 URL 来访问一个对象时,你也可以设置时间限制,这意味着过了这个时间,这个 URL 就失效了并且过期了。

有关预签名 URL 的更多信息,请阅读 Amazon Web services 网站上的以下文档:

Generate a Pre-signed Object URL Using the AWS SDK for Java

Generate a Pre-signed Object URL Using AWS SDK for .NET

此外,如果您想创建用户并分配正确的策略以访问他们的文件夹,您可以按照以下说明操作:

您可以使用 IAM API 为每个用户创建一个用户,并为每个用户附加正确的策略。 例如,要创建新用户,您应该使用以下 API

/* The following create-user command creates an IAM user named Bob in the current account. */

 var params = {
  UserName: "Bob"
 };
 iam.createUser(params, function(err, data) {
   if (err) console.log(err, err.stack); // an error occurred
   else     console.log(data);           // successful response
   /*
   data = {
    User: {
     Arn: "arn:aws:iam::123456789012:user/Bob", 
     CreateDate: <Date Representation>, 
     Path: "/", 
     UserId: "AKIAIOSFODNN7EXAMPLE", 
     UserName: "Bob"
    }
   }
   */
 });

有关创建用户 API 的更多信息,请阅读以下内容

https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateUser.html

创建用户后,您应该使用 CreatePolicy API 为每个用户创建一个策略。

var params = {
  PolicyDocument: 'STRING_VALUE', /* required */
  PolicyName: 'STRING_VALUE', /* required */
  Description: 'STRING_VALUE',
  Path: 'STRING_VALUE'
};
iam.createPolicy(params, function(err, data) {
  if (err) console.log(err, err.stack); // an error occurred
  else     console.log(data);           // successful response
});

有关创建策略的更多信息,请阅读以下文档:

https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreatePolicy.html

最后,您应该通过 AttachUserPolicy API 将之前创建的策略分配给每个用户。

/* The following command attaches the AWS managed policy named AdministratorAccess to the IAM user named Alice. */

     var params = {
      PolicyArn: "arn:aws:iam::aws:policy/AdministratorAccess", 
      UserName: "Alice"
     };
     iam.attachUserPolicy(params, function(err, data) {
       if (err) console.log(err, err.stack); // an error occurred
       else     console.log(data);           // successful response
     });

有关 AttachUserPolicy API 的更多信息,请阅读以下文档:

https://docs.aws.amazon.com/IAM/latest/APIReference/API_AttachUserPolicy.html

最后一部分是关于您应该创建并分配给他们每个人的策略;我们使用以下策略列出每个文件夹中的对象:

{
  "Sid": "AllowListingOfUserFolder",
  "Action": ["s3:ListBucket"],
  "Effect": "Allow",
  "Resource": ["arn:aws:s3:::my-company"],
  "Condition":{"StringLike":{"s3:prefix":["home/David/*"]}}
}

以及针对每个文件夹中的操作的以下策略:

{
  "Sid": "AllowAllS3ActionsInUserFolder",
  "Effect": "Allow",
  "Action": ["s3:*"],
  "Resource": ["arn:aws:s3:::my-company/home/David/*"]
}

有关该政策的更多详细信息,请阅读 Jim Scharf 撰写的以下文章:

https://aws.amazon.com/blogs/security/writing-iam-policies-grant-access-to-user-specific-folders-in-an-amazon-s3-bucket/

【讨论】:

  • 您好,感谢您的回复,但我正在寻求支持以允许用户列出和删除对象。也许我应该在后端服务器上这样做? (用户向我的服务器发送删除请求,服务器进行身份验证并代表用户向 S3 发送删除请求)?
  • 太好了,这就是我想要的。太感谢了。这也肯定对其他人有帮助。
  • 如果我的回答解决了您的问题,请点击大复选框接受它作为答案。
  • 所以我需要为我的应用程序中的每个用户创建 IAM 用户,为其附加策略,并为每个用户创建访问密钥。将密钥传递给用户后,他们可以通过编程方式访问 S3,对吗?
  • @JackMarchetti 假设我们有一个拥有一千名用户的应用程序。我们是否要在 AWS 端为他们每个人创建一个策略和用户?
猜你喜欢
  • 2022-09-23
  • 2015-07-09
  • 2016-08-17
  • 2016-09-25
  • 2018-01-31
  • 1970-01-01
  • 2014-04-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多