使用以下存储桶策略时,我看到它按预期限制了 PUT 访问 - 但是在创建的对象上允许 GET,即使没有任何东西应该允许此操作。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowPut",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::<BUCKET>/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": [
"<IP ADDRESS>"
]
}
}
}
]
}
我可以使用 curl 将文件放入<BUCKET>
如下<IP ADDRESS>
:
curl https://<BUCKET>.s3-<REGION>.amazonaws.com/ --upload-file test.txt
文件上传成功,并出现在 S3 控制台中。我现在由于某种原因能够从互联网上的任何地方获取文件。
curl https://<BUCKET>.s3-<REGION>.amazonaws.com/test.txt -XGET
这仅适用于使用上述方法上传的文件。在 S3 Web 控制台中上传文件时,我无法使用 curl 获取它(访问被拒绝)。所以我认为这是一个对象级别的权限问题。虽然我不明白为什么存储桶策略不会隐式拒绝此访问。
在控制台中查看对象级别权限时,通过控制台上传的文件(方法 1)和从允许上传<IP ADDRESS>
的文件(方法 2)之间的唯一区别是方法 2 中的文件没有“所有者” 、权限或元数据 - 而方法 1 文件包含所有这些。
此外 - 当尝试使用 Lambda 脚本 (boto3 download_file()
) 获取对象时,该脚本承担了对存储桶具有完全访问权限的角色,使用方法 2 上传的对象失败。尽管使用方法 1 上传的对象成功。