AWS S3 存储桶策略显式拒绝

gkr*_*zek 4 policy acl amazon-s3 amazon-web-services aws-sdk

我试图限制我的存储桶以拒绝所有内容,但允许从一个特定 IAM 用户上传并根据referer标头获取对象。这是我的政策:

{
    "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*"
                    ]
                }
            }
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

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

谢谢,

Joh*_*ein 5

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

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

所以:

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

以下是一组在 Amazon S3 管理控制台中授予上传访问权限的权限(感谢是否有 S3 策略用于将访问权限限制为仅查看/访问一个存储桶?):

{
    "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": "*"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)