2011-11-20 121 views
25

我有以下权限的用户foo(它不属于任何团体的成员):我需要完全访问亚马逊S3用户单桶

{ 
    "Statement": [ 
    { 
     "Sid": "Stmt1308813201865", 
     "Action": "s3:*", 
     "Effect": "Allow", 
     "Resource": "arn:aws:s3:::bar" 
    } 
    ] 
} 

该用户却似乎无法上传或做任何事情,直到我授予完全访问经过身份验证的用户(可能适用于任何人)。这仍然不会让用户更改权限,因为在上载后发生错误时会尝试执行key.set_acl('public-read')

理想情况下,此用户可以完全访问bar存储桶,没有别的,我做错了什么?

回答

36

您需要授予s3:ListBucket权限才能访问存储桶本身。尝试下面的政策。

{ 
    "Statement": [ 
    { 
     "Effect": "Allow", 
     "Action": "S3:*", 
     "Resource": "arn:aws:s3:::bar/*", 
     "Condition": {} 
    }, 
    { 
     "Effect": "Allow", 
     "Action": [ 
     "s3:ListBucket" 
     ], 
     "Resource": "arn:aws:s3:::bar", 
     "Condition": {} 
    } 
    ] 
} 
+4

一些细微差别:似乎'bar/*'需要访问'bar'桶中的对象,而'bar'则需要列出/修改存储桶本身。 – phyzome

+0

使用Cyber​​duck通过上述许可访问S3似乎不起作用。 Cyber​​Dock可能需要@Suman提及的ListAllMyBuckets。但是,如果您使用[timkay.com](http://www.timkay.com/aws/)中的命令行工具,则此功能完美无缺。 –

+4

非常感谢。我F $%#@^ING讨厌s3,其繁琐的政策。只是浪费了2个小时,直到我终于找到解决方案。 – Nimo

18

选择的答案并没有为我工作,但此人做:

{ 
    "Statement": [ 
    { 
     "Action": "s3:*", 
     "Effect": "Allow", 
     "Resource": [ 
     "arn:aws:s3:::my-bucket", 
     "arn:aws:s3:::my-bucket/*" 
     ] 
    } 
    ], 
    "Statement": [ 
    { 
     "Effect": "Allow", 
     "Action": "s3:ListAllMyBuckets", 
     "Resource": "arn:aws:s3:::*" 
    } 
    ] 
} 

信用:http://mikeferrier.com/2011/10/27/granting-access-to-a-single-s3-bucket-using-amazon-iam/

+3

这允许列出所有存储桶,并且不会限制对相关存储桶的访问。 –

+2

对我来说+1:投票的人没有与Ruby的雾宝石一起工作,但这个conf工作。 –

+4

@Thanh Nguyen:错了。它将列出所有的桶,但仅提供对策略中的所述桶的访问。 – slayedbylucifer

0

这对我的作品:

{ 
    "Statement": [ 
     { 
      "Effect": "Allow", 
      "Action": [ 
       "s3:ListBucket", 
       "s3:GetBucketLocation", 
       "s3:ListBucketMultipartUploads", 
       "s3:ListBucketVersions" 
      ], 
      "Resource": "arn:aws:s3:::bucket_name_here" 
     }, 
     { 
      "Effect": "Allow", 
      "Action": [ 
       "s3:*Object*", 
       "s3:ListMultipartUploadParts", 
       "s3:AbortMultipartUpload" 
      ], 
      "Resource": "arn:aws:s3:::bucket_name_here/*" 
     } 
    ] 
} 
0

如果你已经因为你无法弄清楚为什么Cyber​​duck无法设置对象ACL,但它可以与另一个客户端(如Panic Transmit)一起工作,因此解决方案如下:

您需要添加s3:GetBucketAcl到您的动作列表,例如:

{ 
    "Statement": [ 
     { 
      "Sid": "Stmt1", 
      "Action": [ 
       "s3:GetBucketAcl", 
       "s3:ListBucket", 
       "s3:DeleteObject", 
       "s3:GetObject", 
       "s3:GetObjectAcl", 
       "s3:PutObject", 
       "s3:PutObjectAcl" 
      ], 
      "Effect": "Allow", 
      "Resource": "arn:aws:s3:::your-bucket-name" 
     } 
    ] 
} 

当然,如果你是s3:*限制较少,但我认为这是很好的了解你不需要做到这一点。

1

有一个在Writing IAM Policies: How to Grant Access to an Amazon S3 Bucket

只需复制并粘贴相应的规则,将“资源”关键是你斗的ARN中的所有语句官方AWS文档。

对于programamtic访问的政策应该是:

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
     { 
      "Effect": "Allow", 
      "Action": ["s3:ListBucket"], 
      "Resource": ["arn:aws:s3:::bar"] 
     }, 
     { 
      "Effect": "Allow", 
      "Action": [ 
       "s3:PutObject", 
       "s3:PutObjectAcl", 
       "s3:GetObject", 
       "s3:GetObjectAcl", 
       "s3:DeleteObject" 
      ], 
      "Resource": ["arn:aws:s3:::bar/*"] 
     } 
    ] 
} 

而对于控制台访问访问应该是:

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
     { 
      "Effect": "Allow", 
      "Action": [ 
       "s3:GetBucketLocation", 
       "s3:ListAllMyBuckets" 
      ], 
      "Resource": "arn:aws:s3:::bar*" 
     }, 
     { 
      "Effect": "Allow", 
      "Action": ["s3:ListBucket"], 
      "Resource": ["arn:aws:s3:::bar"] 
     }, 
     { 
      "Effect": "Allow", 
      "Action": [ 
       "s3:PutObject", 
       "s3:PutObjectAcl", 
       "s3:GetObject", 
       "s3:GetObjectAcl", 
       "s3:DeleteObject" 
      ], 
      "Resource": ["arn:aws:s3:::bar/*"] 
     } 
    ] 
} 
0

@ cloudberryman的答案是正确的,但我喜欢做的事情为尽可能短。这个答案可以简化为:

{ 
    "Statement":[ 
     { 
     "Effect":"Allow", 
     "Action":"S3:*", 
     "Resource":[ 
      "arn:aws:s3:::bar", 
      "arn:aws:s3:::bar/*" 
     ] 
     } 
    ] 
}