【问题标题】:What permissions does django-storages require for an s3 IAM user?django-storages 对 s3 IAM 用户需要哪些权限?
【发布时间】:2012-10-09 08:09:09
【问题描述】:

正如问题所问,锁定 s3 IAM 用户成功使用 django-storages 所需的最低权限是多少?目前我用过类似的东西

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

这实际上可能是矫枉过正。还有什么想法吗?

【问题讨论】:

  • 您肯定可以剥离的一件事是 's3:ListAllMyBuckets' 操作。 django-storages 的 S3 后端永远不会获得您的存储桶列表。

标签: django amazon-s3 django-storage amazon-iam


【解决方案1】:

Fiver 的答案不足以在django-storages 中运行collectstatic。除了s3:ListAllMyBuckets,我使用了@jvc26 所做的一切。我认为s3:ListBucketVersions 也不需要。

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

【讨论】:

    【解决方案2】:

    我不是 100% 确定 django-storages,因为我使用的是基于 django-storages 的 S3 部分的cuddly-buddly。我只是发现 cuddlybuddly 使用起来更简单,效果更好,而且这个名字很棒!

    无论如何,我有一个使用 Django+S3 的项目,发现以下 AWS 策略是我的项目所需的最低要求:

    {
      "Version": "2008-10-17",
      "Id": "Policy123",
      "Statement": [
        {
          "Sid": "Stmt123",
          "Effect": "Allow",
          "Principal": {
            "AWS": "arn:aws:iam::some-aws-user"
          },
          "Action": "s3:ListBucket",
          "Resource": "arn:aws:s3:::bucket-name"
        },
        {
          "Sid": "Stmt234",
          "Effect": "Allow",
          "Principal": {
            "AWS": "arn:aws:iam::some-aws-user"
          },
          "Action": [
            "s3:DeleteObject",
            "s3:GetObject",
            "s3:PutObject"
          ],
          "Resource": "arn:aws:s3:::bucket-name/*"
        }
      ]
    }
    

    我有需要上传、检索和删除的 Django 视图,因此可以根据您的需要使用/省略这些相应的操作。显然,任何人都需要更改用户和存储桶名称。

    另外,为了完整起见,因为这对我来说并不明显,请注意以下关于 AWS policies 的限制:

    • 策略的最大大小为 20 KB

    • Resource 的值必须以存储桶名称或 存储桶名称及其下的路径(bucket/)。如果只有存储桶名称是 指定,没有尾随 /,策略适用于存储桶。

    • 每个策略都必须有一个唯一的策略 ID (Id)

    • 策略中的每个语句都必须具有唯一的语句 ID (sid)

    • 每个策略必须仅涵盖单个存储桶和其中的资源 存储桶(在编写策略时,不要包含引用的语句 其他存储桶或其他存储桶中的资源)

    最后,对于任何想要这样做的人,请不要更改 Version 键中的日期值,亚马逊使用此值来解析策略格式。

    希望这会有所帮助!

    【讨论】:

      【解决方案3】:

      在此处参考官方 Django Storages 官方文档:https://django-storages.readthedocs.io/en/latest/backends/amazon-S3.html#iam-policy

      您可以简单地将该权限复制并粘贴到您的 IAM 策略中。

      【讨论】:

        【解决方案4】:

        这对我有用:

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

        【讨论】:

          【解决方案5】:

          我认为无论您使用 IAM 还是其他类型的权限,都应该授予全球读取访问权限。所以我成功完成了这个配置:

          {
              "Version": "2012-10-17",
              "Statement": [
                  {
                      "Sid": "PublicReadGetObject",
                      "Effect": "Allow",
                      "Principal": "*",
                      "Action": "s3:GetObject",
                      "Resource": [
                          "arn:aws:s3:::buuuuu",
                          "arn:aws:s3:::buuuuu/*"
                      ]
                  }
              ]
          }
          

          【讨论】:

          • 这仍然取决于。例如,如果您想使用预签名的 url 并在应用程序级别控制谁可以访问您的对象,那么您绝对不想将公共 GetObject 提供给所有人。
          猜你喜欢
          • 2019-11-28
          • 2017-08-08
          • 2018-03-04
          • 2023-03-13
          • 1970-01-01
          • 1970-01-01
          • 2011-01-01
          • 2014-08-28
          • 2015-12-28
          相关资源
          最近更新 更多