django-storage对s3 IAM用户有什么权限?

时间:2012-10-18 19:04:54

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

正如问题所示,锁定的s3 IAM用户成功使用django-storage时所需的最低权限是多少?目前我使用过像

这样的东西
{
  "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/*"
    }
  ]
}

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

5 个答案:

答案 0 :(得分:9)

Fiver的答案不足以在collectstatic中运行django-storages。除了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/*"
    }
  ]
}

答案 1 :(得分:2)

我不是100%肯定django-storages,因为我使用基于django-storages的S3部分的cuddly-buddly。我刚刚发现cuddlybudd使用起来更简单,效果更好,加上这个名字真棒!

无论如何,我有一个使用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

  •   
  • 资源的值必须以存储桶名称或后缀为前缀   存储桶名称及其下的路径(存储桶/ )。如果只有桶名称   指定的,没有尾随/ ,该策略适用于存储桶。

  •   
  • 每个政策必须具有唯一的政策ID(Id)

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

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

  •   

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

希望这有帮助!

答案 2 :(得分:1)

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

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

答案 3 :(得分: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/*"
        }
    ]
}

答案 4 :(得分:0)

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

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