代码之家  ›  专栏  ›  技术社区  ›  feroze

对于存储桶中不存在的密钥,我如何获得S3存储桶返回404(而不是403)/

  •  79
  • feroze  · 技术社区  · 11 年前

    我正在使用S3来存储一些业务关键型文档。我希望bucket在尝试访问bucket中不存在的对象时返回404状态代码。

    然而,我发现它一直在回报我”403

    这里是一个使用S3网站url的会话示例。

    > GET /foobar.txt HTTP/1.1
    > User-Agent: curl/7.21.6 (x86_64-pc-linux-gnu) libcurl/7.21.6 OpenSSL/1.0.0e zlib/1.2.3.4 libidn/1.22 librtmp/2.3
    > Host: <bucketname>.s3-website-us-east-1.amazonaws.com
    > Accept: */*
    > 
    < HTTP/1.1 403 Forbidden
    < Last-Modified: Mon, 09 Sep 2013 19:10:28 GMT
    < ETag: "14e13b81b3ce5b129d1f206b3e514885"
    < x-amz-error-code: AccessDenied
    < x-amz-error-message: Access Denied
    < x-amz-request-id: <snip>
    < x-amz-id-2: <snip>
    < Content-Type: text/html
    < Content-Length: 11
    < Date: Thu, 26 Sep 2013 20:01:45 GMT
    < Server: AmazonS3
    < 
    Not found!
    

    注意,“Not Found!”字符串来自启用S3网站托管时bucket财产上设置的错误文档。

    我也尝试过直接使用bucket url进行访问

    http://.s3.amazonaws.com/

    返回的结果是一样的,只是我得到的不是错误文档,而是一个XML文档

    我该如何解决这个问题?

    6 回复  |  直到 11 年前
        1
  •  104
  •   Tim Gautier    11 年前

    当用户没有列出bucket内容的权限时,S3返回403而不是404。

    如果您查询一个对象并收到一个404,那么您就知道该对象不存在。如果你没有权限列出bucket内容,你不应该知道这些信息,因此S3不会告诉你它不存在,而是告诉你正在尝试做一些不允许做的事情。当你得到403而不是404时,你无法知道你请求的对象不存在。它可能不存在,也可能存在,而您只是没有访问它的权限。您无法确定,因此无法绕过任何安全措施。

    我相信任何有权列出bucket内容的人都会得到404而不是403。

        2
  •  42
  •   Peter Lamberg qed    11 年前

    确切的要求似乎是您的用户 ListBucket 对您的特定桶的许可,并且ARN正是这样的形式 arn:aws:s3:::your_bucket_name .

    我还需要在我的策略中添加一个全新的语句,因为其他权限 GetObject 仍然要求ARN以 /* 或一些其他合适的通配符。

    {
      "Action": [
        "s3:ListBucket"
      ],
      "Sid": "StmtNNNNNNNNNNNNNNNwholebucket",
      "Resource": [
        "arn:aws:s3:::your_bucket_name"
      ],
      "Effect": "Allow"
    },
    

    总之,对我来说重要的一点是,如果ARN不是这样的形式 arn:aws:s3:::your_bucket_name/* 对于ListBucket,否则您仍然会得到403而不是404。

        3
  •  37
  •   Marcello B.    5 年前

    不确定,如果你在找这个。向所有人公开您的对象可以解决404问题。然而,我确实 相信这是完成任务的理想方式。

    AWS Cloudfront提供了一个名为Origin Access Identity的功能( OAI ). 它的工作原理见 detail here .

    简单地说,在Cloudfront中将OAI与您的Origin关联,并更新bucket策略以允许OAI GetObject ListBucket 如图所示

    {
      "Version": "2008-10-17",
      "Statement": [
        {
          "Sid": "AllowOAIRead",
          "Effect": "Allow",
          "Principal": {
            "AWS": [
              "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity your_OAI_ID"
            ]
          },
          "Action": [
            "s3:GetObject",
            "s3:ListBucket"
          ],
          "Resource": [
            "arn:aws:s3:::your_bucket_name/*",
            "arn:aws:s3:::your_bucket_name"
          ]
        }
      ]
    }
    
        4
  •  8
  •   James Coyle    5 年前

    我需要这样扩展政策:

     "Action": [
       "s3:Get*",
       "s3:List*"
     ],
     "Resource": [
       "arn:aws:s3:::bucket_name",
       "arn:aws:s3::: bucket_name/*"
     ],
    

    bucket_name 是必需的,因为如果没有它,丢失的对象就不会得到404,但403总是, bucket_name/* 需要实际访问bucket中的内容。

        5
  •  5
  •   Mathieu    11 年前

    请确保您的权限 Everyone View Permissions .

    您可能还需要添加bucket策略:

    {
        "Version": "2008-10-17",
        "Statement": [
            {
                "Sid": "PublicReadGetObject",
                "Effect": "Allow",
                "Principal": {
                    "AWS": "*"
                },
                "Action": "s3:GetObject",
                "Resource": "arn:aws:s3:::your_bucket_name/*"
            }
        ]
    }
    
        6
  •  -1
  •   Standaa - Remember Monica    2 年前

    留下这个答案,希望它能帮助AWS黑暗深处的人们。

    确保你的bucket名称没有在S3命名空间中使用,比如在你的沙箱帐户中。。。否则,AWS将始终返回403错误,而不是404错误。