政策拒绝访问 Amazon S3

Policy Denying Access On Amazon S3

使用 s3cmd 下面的策略允许我像这样 ListAllBuckets :

s3cmd ls

和像这样的 ListBucket :

s3cmd ls s3://backups/

但我无法上传这样的文件:

s3cmd put filename s3://backups/

我刚收到这个错误:

ERROR: S3 error: Access Denied

该政策是基于搜索和网络上的许多示例,但我看不出哪里出了问题。该政策是允许用户仅将文件上传到备份目录(最终我什至不知道他们列出存储桶的内容,但我将其放入只是为了检查政策实际上是否被读取)。

其他可能相关的信息 -

这是策略,请注意 CreateObject 和 PutObject 是仅有的两个原始条目,添加其他条目几乎只是为了看看发生了什么:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListAllMyBuckets",
                "s3:ListBucket"
            ],
            "Resource": "arn:aws:s3:::*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:PutObjectAcl",
                "s3:PutObjectVersionAcl",
                "s3:CreateObject",
                "s3:*"
            ],
            "Resource": "arn:aws:s3:::backups/*"
        }
    ]
}

编辑 1 -

只是说,如果我添加此政策,它会正常工作,所以我知道这与我的政策有关:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "s3:*",
      "Resource": "*"
    }
  ]
}

编辑 2 - 我制定了另一项政策,我用它来创建一个名为 "asdwasw432" 的存储桶,以防万一我的 UI 创建的存储桶出于某种原因无法使用。但我仍然无法向其上传任何文件(拒绝访问)。我可以列出存储桶并创建新存储桶。所有的建议似乎都告诉我要完全按照我在下面做的事情去做,但是 none 如果可行的话。我还漏掉了什么吗?

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1397834652000",
            "Effect": "Allow",
            "Action": [
                "s3:ListAllMyBuckets"
            ],
            "Resource": [
                "arn:aws:s3:::*"
            ]
        },
        {
            "Sid": "Stmt1397834745000",
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": [
                "arn:aws:s3:::asdwasw432",
                "arn:aws:s3:::asdwasw432/*"
            ]
        }
    ]
}
"Resource": "arn:aws:s3:::backups/*"

...应该...

"Resource": "arn:aws:s3:::your_bucket_name/backups/*"

您在其他地方使用的 * 有点意外,因为它被解释为 "all my buckets."

好吧,我已经修复了,但我仍然很困惑。

原来当我 运行

s3cmd --configure

我接受了 "US" 的默认区域。这应该设置为 "us-east-1"。我通过 运行 debug

发现了这个
s3cmd -d ..etc...

这向我展示了包含此内容的一行 -

'reason': 'Bad Request', 'data': '<?xml version="1.0" 
encoding="UTF-8"?>\n<Error><Code>AuthorizationHeaderMalformed</Code>
<Message>The authorization header is malformed; the region \'US\' is
 wrong; expecting \'us-east-1\'</Message><Region>us-east-1</Region>

重新运行配置并更正区域解决了它。

如果该区域确实是问题所在,请有人解释一下为什么我能够在不正确的区域使它正常工作?最近我通过制作

让一切正常工作
Action : "*"

这让我陷入了另一个死胡同,认为我一定是使用了错误的命令。只是为了完整性,这个政策对我有用(只要区域正确!):

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListAllMyBuckets",
                "s3:GetBucketLocation"
            ],
            "Resource": [
                "arn:aws:s3:::*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": [
                "arn:aws:s3:::asdwasw432",
                "arn:aws:s3:::asdwasw432/*"
            ]
        }
    ]
}

最后一点,我已将此政策附加到用户而不是组。这对我的使用很有意义,但是当我问这个问题时,我将它附加到一个组并将用户添加到该组。不确定这是否会有所作为。