AWS S3 存储桶策略显式拒绝

AWS S3 Bucket Policy Explicit Deny

我试图限制我的存储桶拒绝所有内容,但允许来自一个特定 IAM 用户的上传并根据 referer header 获得 objects。这是我的政策:

{
    "Version": "2012-10-17",
    "Id": "Meteor refer policy",
    "Statement": [
        {
            "Sid": "allow upload",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::556754141176:user/username"
            },
            "Action": "s3:PutObject*",
            "Resource": [
                "arn:aws:s3:::bucketname",
                "arn:aws:s3:::bucketname/*"
            ]
        },
        {
            "Sid": "Allow get",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "bucketname/*",
            "Condition": {
                "StringLike": {
                    "aws:Referer": [
                        "http://myapp.com*",
                        "http://localhost*"
                    ]
                }
            }
        },
        {
            "Sid": "Explicit deny",
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": "bucketname/*",
            "Condition": {
                "StringNotLike": {
                    "aws:Referer": [
                        "http://myapp.com*",
                        "http://localhost*"
                    ]
                }
            }
        }
    ]
}

此政策正确地将 GetObject 指令强制执行到引用 header,但我无法像我所说的那样上传与该用户的任何内容。如果我取消显式拒绝,我可以从任何地方访问 object 而 referer 并不重要。我的政策有什么问题?此外,我无法从控制台访问存储桶中的任何内容。我需要为此做什么?

谢谢,

默认情况下,Amazon S3 存储桶中的所有内容都是私有的。因此,只需添加对应该允许的用户的访问权限。

此外,仅授予 PutObject 将只允许 API 调用, 将不允许通过 AWS 管理控制台 进行访问,这需要像 ListAllMyBuckets。因此,请确保上传用户具有必要的权限,或者仅使用允许的 API 调用。

因此:

  • 删除拒绝政策——不需要
  • GetObject 策略中,您还应该删除 "Resource": "bucketname/*", 因为存储桶策略适用于它所附加的存储桶这一事实是明确的
  • 让上传用户使用AWS Command-Line Interface (CLI)或网页上传,只需要PutObject授予额外权限即可使用适用于 Amazon S3 的 AWS 管理控制台(如下所示)

这是一组权限,可以在 Amazon S3 管理控制台中授予上传访问权限(感谢 Is there an S3 policy for limiting access to only see/access one bucket?):

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1",
            "Effect": "Allow",
            "Action": [
                "s3:GetBucketLocation",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::bucketname"
            ]
        },
        {
            "Effect": "Allow",
            "Action": "s3:ListAllMyBuckets",
            "Resource": "*"
        }
    ]
}