拒绝在Amazon S3上访问的策略

时间:2015-03-27 18:10:22

标签: amazon-web-services amazon-s3

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

s3cmd ls

和ListBucket像这样:

s3cmd ls s3://backups/

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

s3cmd put filename s3://backups/

我刚收到此错误:

ERROR: S3 error: Access Denied

该政策基于网络上的搜索和许多示例,但我无法看到它出错的地方。该策略是允许用户只将文件上传到备份目录(最终我甚至不知道它们列出了哪些存储桶,但我只是为了检查策略实际上是否正在读取)。

其他可能相关的信息 -

  • 我使用Dragon Disk(S3的前端)和其他用户
  • 创建了存储桶
  • 此新IAM用户通过属于已附加策略的组连接到策略。

这是策略,请注意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创建存储桶无法使用。但我仍然无法上传任何文件(Access Denied)。我可以列出存储桶并创建新存储桶。所有的建议似乎都告诉我要完成我在下面做的事情,但如果它有效则没有。我错过了别的什么吗?

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

2 个答案:

答案 0 :(得分:3)

好吧,我已经解决了,但我仍然感到困惑。

事实证明,当我跑

s3cmd --configure

我接受了“美国”的默认区域。这应该设置为“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/*"
            ]
        }
    ]
}

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

答案 1 :(得分:0)

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

......应该......

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

你在其他地方使用的*是偶然的,因为它被解释为&#34;我所有的桶。&#34;