ELI5:如何授予单个用户对S3存储桶的完全访问权限?

时间:2015-08-04 23:03:10

标签: curl amazon-web-services amazon-s3 amazon-iam

我已经阅读了大量的AWS文档,并尝试了几十个示例配置,但我设法实现的唯一AWS策略是授予所有人的权限 - 访问S3存储桶。 这太可怕了

单用户完全访问方案:

以下是设置:

  1. AWS用户 jenkins ,不属于任何群组或角色。
  2. 包含 jenkins AWS_SECRET_KEY和AWS_ACCESS_KEY的服务器。
  3. 使用默认权限创建一个全新的空S3存储桶 notes
  4. 问题是否可以使用curl使用与 jenkins 用户关联的凭据实施以下操作:

    1. 上传包含短语" hello,world"的文本文件foo notes
    2. 笔记下载文本文件foo
    3. 获取 notes 中所有文件的列表。
    4. 这是一个很好的解决方案:

      我的问题的可接受解决方案包括以下部分:

      1. 演示解决方案的一组curl命令。
      2. 解释任何S3设置(即ACL)或IAM用户/组/角色策略以及这些该死的东西应该如何工作。
      3. [可选]自2014年起参考第三方博客/帖子,其中包含对这些安全部分如何组合在一起的完整解释。
      4. 但是,"使用SDK X"等解决方案。或者"下载工具Y"很好,但最终没有帮助,像#34;你真正试图在这里做什么的解决方案,也许有一种更简单的方法"将参考本节的评论。感谢您理解我真的只想要3个curl语句以及针对此场景的S3 ACL和IAM策略的说明。

2 个答案:

答案 0 :(得分:0)

要使其工作,有两个部分:构建请求并在S3存储桶上设置正确的策略。

简单部分:要构建存储桶策略,您可以使用http://awspolicygen.s3.amazonaws.com/policygen.html
你可以在这里看到例子: http://docs.aws.amazon.com/AmazonS3/latest/dev/example-bucket-policies.html

用于构建请求。构建请求有很多,最具挑战性的部分是签署请求。你不能仅使用卷曲,但你可以在不使用sdk的情况下逃脱。以下是您能够发布最终卷曲的所有需求的示例: http://geek.co.il/2014/11/19/script-day-amazon-aws-signature-version-4

最后你会看到最后的卷曲。不要忘记为s3更新(例如SQS,但如果你不想或不能使用sdk,基本上所有需要完成的工作)。

答案 1 :(得分:0)

我一直在寻找一个可以分享这个解决方案的地方,把它放在这里,因为它与你的问题部分匹配。

我认为aws策略生成器对新手不友好。我得到了很多access denied而不理解为什么。非建设性的消息IMO,因为它没有说明你违反了什么政策。事实证明,lib还为上传的文件设置了公共读取权限,即a.k.a ACL。长话短说,我错过了PutObjectACL。以下是使用AWS IAM设置单个S3存储桶访问的一些示例,但不允许访问任何其他存储桶。

服务器策略

即IAM用户myapp-staging { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:ListBucket", "s3:ListMultipartUploadParts", "s3:GetBucketLocation" ], "Resource": [ "arn:aws:s3:::myappbucket-staging" ] }, { "Effect": "Allow", "Action": [ "s3:PutObject", "s3:PutObjectAcl" ], "Resource": [ "arn:aws:s3:::myappbucket-staging/*" ] } ] }

人道政策

这是 IAM用户使用AWS S3控制台或其他S3查看器的策略,用于验证上传的内容,而不会泄露其他存储桶的内容(它列出了列表)虽然桶名,但不能弄清楚如何限制它,我真的不关心它。)

具有策略MyappTeamPolicy的IAM用户myuser:

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