【问题标题】:I need an Amazon S3 user with full access to a single bucket我需要一个对单个存储桶具有完全访问权限的 Amazon S3 用户
【发布时间】:2012-01-02 11:12:38
【问题描述】:

我有一个具有以下权限的用户 foo(它不是任何组的成员):

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

但是,在我授予经过身份验证的用户完全访问权限(这可能适用于任何人)之前,该用户似乎无法上传或执行大部分操作。这仍然不允许用户更改权限,因为 在尝试执行 key.set_acl('public-read') 时在上传后抛出错误。

理想情况下,该用户将拥有对 bar 存储桶的完全访问权限,而没有其他权限,我做错了什么?

【问题讨论】:

    标签: boto amazon-s3 amazon-web-services user-permissions amazon-iam


    【解决方案1】:

    您需要向存储桶本身授予 s3:ListBucket 权限。试试下面的政策。

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

    【讨论】:

    • 一些细微差别:似乎需要bar/* 才能访问bar 存储桶内的对象,而需要bar 来列出/修改存储桶本身。
    • 使用 Cyber​​duck 访问具有上述权限的 S3 似乎不起作用。正如@Suman 所提到的,Cyber​​duck 可能需要 ListAllMyBuckets。但是,如果您使用来自timkay.com 的命令行工具,则可以完美运行。
    • 谢谢一百万。我 F$%#@^ING 讨厌 s3 的繁琐政策。只是浪费了 2 个小时,直到我终于找到了解决方案。
    • 如果您将“更多选项”下的“路径”设置为存储桶名称,则它在 Cyber​​duck 中有效。那么就不需要添加 ListAllMyBuckets 了。
    • 想确认@JoarLeth 所说的:如果您在cyberduck 连接选项中设置路径,那么您不需要ListAllMyBuckets 权限
    【解决方案2】:

    所选答案对我不起作用,但这个答案对我有用:

    {
      "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/

    【讨论】:

    • 这允许列出所有存储桶,并且不会限制对相关存储桶的访问。
    • +1 对我来说:投票的人不能与 Ruby 的 Fog gem 一起使用,但这个 conf 有效。
    • @Thanh Nguyen:错了。它将列出所有存储桶,但仅提供对策略中所述存储桶的访问权限。
    • 我需要这个配方来允许我的 IAM 用户访问 S3 控制台。
    【解决方案3】:

    你知道AWS Policy Generator吗?

    【讨论】:

    • 是的,但它没有回答问题。
    • 策略生成器提出的问题多于回答的问题
    【解决方案4】:

    Writing IAM Policies: How to Grant Access to an Amazon S3 Bucket有一个官方AWS文档

    只需复制并粘贴适当的规则,然后在所有语句中将“资源”键更改为您存储桶的 ARN。

    对于程序化访问,政策应该是:

    {
        "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/*"]
            }
        ]
    }
    

    【讨论】:

      【解决方案5】:

      这对我有用:

      {
          "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/*"
              }
          ]
      }
      

      【讨论】:

        【解决方案6】:

        如果您因为无法弄清楚为什么 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:* 的限制较少,则不需要这样做,但我认为这很高兴。

        【讨论】:

          【解决方案7】:

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

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

          【讨论】:

          • 但你的答案并不等同于cloudberryman。您的示例提供对存储桶和存储桶内容的完全访问权限,而他只允许存储桶上的列表,但对内容的完全访问权限。在您的情况下,权限允许删除存储桶本身,这可能超出大多数人想要授予的权限。
          【解决方案8】:
          {
              "Version": "2012-10-17",
              "Statement": [
                  {
                      "Effect": "Allow",
                      "Action": [
                                  "s3:GetBucketLocation",
                                  "s3:ListAllMyBuckets"
                                ],
                      "Resource": "arn:aws:s3:::*"
                  },
                  {
                      "Effect": "Allow",
                      "Action": "s3:*",
                      "Resource": [
                          "arn:aws:s3:::YOUR-BUCKET",
                          "arn:aws:s3:::YOUR-BUCKET/*"
                      ]
                  }
              ]
          }
          

          【讨论】:

            【解决方案9】:

            我最近能够让它工作的另一种方法是使用亚马逊的documentation。对我来说,关键是将 IAM 用户指向特定的存储桶而不是 S3 控制台。根据文档,“警告:更改这些权限后,用户在访问主 Amazon S3 控制台时会收到拒绝访问错误。主控制台链接类似于以下内容:

            https://s3.console.aws.amazon.com/s3/home

            相反,用户必须使用指向存储桶的直接控制台链接来访问存储桶,类似于以下内容:

            https://s3.console.aws.amazon.com/s3/buckets/awsexamplebucket/"

            我的政策如下:

            {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Sid": "Stmt1589486662000",
                    "Effect": "Allow",
                    "Action": [
                        "s3:*"
                    ],
                    "Resource": [
                        "arn:aws:s3:::AWSEXAMPLEBUCKET",
                        "arn:aws:s3:::AWSEXAMPLEBUCKET/*"
                    ]
                }
            ]
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-08-22
              • 1970-01-01
              • 2020-11-02
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多