当您请求的对象不存在时,Amazon S3返回的错误取决于您是否拥有s3:ListBucket
权限。
- 拥有
s3:ListBucket
权限:如果对象不存在,Amazon S3会返回HTTP状态码404(未找到)。
- 没有
s3:ListBucket
权限:如果对象不存在,Amazon S3会返回HTTP状态码403(禁止访问)。
这种区别的原因是s3:ListBucket
权限允许您列出桶内的对象。如果没有这个权限,Amazon S3不能透露对象不存在或您没有访问权限,从而返回403错误以防止信息泄露。
以下步骤说明了s3:ListBucket
权限如何影响S3返回的消息:
-
仅有s3:GetObject
权限的用户策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "GetObject",
"Effect": "Allow",
"Action": "s3:GetObject",
"Resource":"arn:aws:s3:::mybucketnamehere/*"
}
]
}
-
桶内容:S3桶中只有一个对象 "1.JPG"。
-
成功获取对象:用户可以使用AWS CLI命令成功获取 "1.JPG"。
$ aws s3 cp s3://mybucketnamehere/1.JPG .
download: s3://mybucketnamehere/1.JPG to ./1.JPG
-
尝试获取不存在的对象:当用户尝试获取不存在的对象 "2.JPG" 时,S3返回403错误。
$ aws s3 cp s3://mybucketnamehere/2.JPG .
fatal error: An error occurred (403) when calling the HeadObject operation: Forbidden
-
更新用户策略包含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/*"
}
]
}
-
在更新权限后尝试获取不存在的对象:当用户尝试获取不存在的对象 "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返回的错误类型,从而确保应用程序具有更好的安全性和清晰度。
参考: