【问题标题】:Policy Denying Access On Amazon S3策略拒绝访问 Amazon S3
【发布时间】:2015-03-27 18:10:21
【问题描述】:

使用 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 创建的存储桶不可用。但我仍然无法上传任何文件(拒绝访问)。我可以列出存储桶并创建新存储桶。所有的建议似乎都告诉我要完全按照我在下面做的事情做,但如果它有效,则没有。我还缺少其他东西吗?

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

【问题讨论】:

    标签: amazon-web-services amazon-s3


    【解决方案1】:

    好吧,我已经修复了它,但我仍然感到困惑。

    原来是我跑的时候

    s3cmd --configure
    

    我接受了“美国”的默认区域。这应该设置为“us-east-1”。我通过运行调试发现了这一点

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

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

    【讨论】:

    • 首先感谢您对本期的详细讲解!我遇到了同样的问题,无法弄清楚问题可能是什么。 对您的回答的补充说明:在我们的例子中,它无需在配置文件中设置存储桶区域/位置(非必需)即可工作,所需的操作是 s3:GetBucketLocation。有了这个s3cmd put 命令就可以工作,没有这个就不行(即使区域设置正确也不行)。我不确定你是否专门测试过这个案例,但对我们来说s3:GetBucketLocation 解决了这个问题。
    • @ViktorBenei - 谢谢。我还没有尝试过(睡狗暂时躺着),但我已经记下要尽快这样做。我会在这里报告一次。
    • 谢谢!关于桶需要成为 us-east-1 的提示是正确的!我已经浪费了几个小时来调试这个:-(
    【解决方案2】:
    "Resource": "arn:aws:s3:::backups/*"
    

    ...应该是...

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

    您在其他地方使用的* 有点意外,因为它被解释为“我所有的存储桶”。

    【讨论】:

    • "backups" 是存储桶名称。我在备份下添加了一个文件夹,以使该行读取 - “资源”:“arn:aws:s3:::backups/newfolder/*” - 但我仍然得到相同的结果,访问被拒绝。
    • 可能与 ARN 有关吗?我实际上不记得在任何地方创建 ARN。我知道当您使用基于网络的政策制定者时它会要求您创建一个,但由于我没有这样做,我应该在某处“注册”该 arn 字符串吗?
    • 在所有可能的存储桶名称中,您设法找到了一个称为“备份”的名称?好的。您不必创建 ARN。他们描述/识别资源。 docs.aws.amazon.com/general/latest/gr/…
    • 但这是我的帐户独有的,不是系统方面的,不是吗?以防万一,我通过 s3cmd 和策略创建了一个新存储桶,但我仍然无法上传到该存储桶。我已将政策粘贴在上面的编辑 2 中。我一定是遗漏了其他东西——网络上的所有示例代码肯定不会错:)(编辑——粘贴错误代码——已修复)。
    猜你喜欢
    • 2019-04-20
    • 2018-01-10
    • 2023-03-29
    • 2017-08-04
    • 1970-01-01
    • 2012-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多