Django-storages对于s3 IAM用户需要哪些权限?

15

正如问题所问,一个被锁定权限的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后端永远不会获取您的存储桶列表。 - vvd
5个回答

10

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

3

我对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

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

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

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

  • 每个策略必须仅涵盖单个存储桶及其内部资源(编写策略时,请勿包括引用其他存储桶或其他存储桶中的资源的语句)

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

希望这可以帮到您!


2

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

我认为无论您使用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。 - wisp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接