为什么S3在对象不存在时返回403而不是404?

1 分钟阅读
内容级别:中级
3

当您请求的对象不存在时,Amazon S3返回的错误取决于您是否拥有s3:ListBucket权限。

  • 拥有s3:ListBucket权限:如果对象不存在,Amazon S3会返回HTTP状态码404(未找到)。
  • 没有s3:ListBucket权限:如果对象不存在,Amazon S3会返回HTTP状态码403(禁止访问)。

这种区别的原因是s3:ListBucket权限允许您列出桶内的对象。如果没有这个权限,Amazon S3不能透露对象不存在或您没有访问权限,从而返回403错误以防止信息泄露。

以下步骤说明了s3:ListBucket权限如何影响S3返回的消息:

  1. 仅有s3:GetObject权限的用户策略

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "GetObject",
                "Effect": "Allow",
                "Action": "s3:GetObject",
                "Resource":"arn:aws:s3:::mybucketnamehere/*"
            }
        ]
    }
  2. 桶内容:S3桶中只有一个对象 "1.JPG"。

  3. 成功获取对象:用户可以使用AWS CLI命令成功获取 "1.JPG"。

    $ aws s3 cp s3://mybucketnamehere/1.JPG .
    download: s3://mybucketnamehere/1.JPG to ./1.JPG
  4. 尝试获取不存在的对象:当用户尝试获取不存在的对象 "2.JPG" 时,S3返回403错误。

    $ aws s3 cp s3://mybucketnamehere/2.JPG .
    fatal error: An error occurred (403) when calling the HeadObject operation: Forbidden
  5. 更新用户策略包含s3:ListBucket权限

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "ListBucket",
                "Effect": "Allow",
                "Action": "s3:ListBucket",
                "Resource": "arn:aws:s3:::mybucketnamehere"
            },
            {
                "Sid": "GetObject",
                "Effect": "Allow",
                "Action": "s3:GetObject",
                "Resource":"arn:aws:s3:::mybucketnamehere/*"
            }
        ]
    }
  6. 在更新权限后尝试获取不存在的对象:当用户尝试获取不存在的对象 "2.JPG" 时,S3返回404错误。

    $ aws s3 cp s3://mybucketnamehere/2.JPG .
    fatal error: An error occurred (404) when calling the HeadObject operation: Key "2.JPG" does not exist

通过理解和适当配置用户权限,您可以控制Amazon S3返回的错误类型,从而确保应用程序具有更好的安全性和清晰度。

参考

profile pictureAWS
专家
Tyler
已​发布 1 个月前1155 查看次数