S3 - 为每个用户提供用户数据目录的访问/密钥

时间:2017-01-22 08:40:37

标签: amazon-web-services amazon-s3

是否可以为我系统中的每个用户动态创建一个访问/密钥,以允许他们在具有特定前缀的存储桶上读/写/列出内容。

例如:我的存储桶是userDataBucket。 ID为77的用户已登录。我想将他发送到客户端访问/密码,以便他可以使用此目录:

s3://userDataBucket/users/77/

他必须只使用此目录,并且无权访问任何其他目录。

这样的事情可能吗?

1 个答案:

答案 0 :(得分:0)

注意:您应该查看iam limits on users and policies。使用有限用户/策略进行扩展是有限制的,例如,您最多只能拥有5000个IAM用户,250个角色和100个组。如果您需要可扩展的解决方案,请考虑使用temporary credentials

这是一个允许访问/users/${username}存储桶中userDataBucket目录的IAM策略。该策略使用一个变量,以便任何经过身份验证的用户都可以访问与其用户名匹配的目录。如果计划是使用IAM用户,您可以将其应用于存储桶并将其用作全局策略。

{
  "Version":"2012-10-17",
  "Statement": [
    {
      "Sid": "AllowListingWithinUserDirectory",
      "Action": ["s3:ListBucket"],
      "Effect": "Allow",
      "Resource": ["arn:aws:s3:::userDataBucket"],
      "Condition":{"StringLike":{"s3:prefix":["users/${aws:username}/*"]}}
    },
    {
      "Sid": "AllowAllActionsWithinUserDirectory",
      "Effect": "Allow",
      "Action": ["s3:*"],
      "Resource": ["arn:aws:s3:::userDataBucket/users/${aws:username}/*"]
    }
  ]
}

如果您想通过自动增量ID明确标识每个用户,那么显式策略将如下所示:

{
  "Version":"2012-10-17",
  "Statement": [
    {
      "Sid": "AllowListingWithinUserDirectory",
      "Action": ["s3:ListBucket"],
      "Effect": "Allow",
      "Resource": ["arn:aws:s3:::userDataBucket"],
      "Condition":{"StringLike":{"s3:prefix":["users/77/*"]}}
    },
    {
      "Sid": "AllowAllActionsWithinUserDirectory",
      "Effect": "Allow",
      "Action": ["s3:*"],
      "Resource": ["arn:aws:s3:::userDataBucket/users/77/*"]
    }
  ]
}

AWS软件开发工具包提供了自动创建策略文档的方法,以及将它们附加到用户和组的功能。 Java SDK中的一些示例方法:

AmazonIdentityManagementClient.createPolicy() AmazonIdentityManagementClient.attachUserPolicy() AmazonIdentityManagementClient.attachGroupPolicy()