目前我有一个应用于测试存储区的策略,旨在阻止用户使用“public-read”和“public-read-write”ACL上传s3对象。
当我尝试通过命令行上传时,请求被“拒绝访问”成功阻止:
Write-S3Object -bucketname testbucket -File C:\Users\user\Desktop\DemoFolder\secret_data.txt -cannedACLName public-read
与“public-read-write”相同的结果:
Write-S3Object -bucketname testbucket -File C:\Users\user\Desktop\DemoFolder\secret_data.txt -CannedACLName public-read-write
但是当我通过Web Console GUI访问s3bucket时,我可以上传公共对象。通过“公开”按钮将现有的“私人”对象操纵到公共。
以下是存储桶策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DenyPublic",
"Effect": "Deny",
"Principal": "*",
"Action": [
"s3:PutObject",
"s3:PutObjectAcl"
],
"Resource": "arn:aws:s3:::testbucket/*",
"Condition": {
"StringEquals": {
"s3:x-amz-acl": [
"public-read",
"public-read-write"
]
}
}
}
]
此处还有来自用户的s3访问策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:*",
"Resource": "*"
}
]
}
我觉得修复或逻辑非常简单。我只是不能把手指放在上面。
答案 0 :(得分:2)
我认为这里发生的事情是AWS控制台没有触发您的拒绝策略,因为它没有使用预设ACL。相反,它在上传文件后明确地向AllUsers组授予READ_ACP权限(使用x-amz-grant-read标头)。
我设置了一个类似的策略并测试了PutObject上的固定ACL方法(它失败了):
$ aws s3 cp myfile s3://B/K --acl public-read
Result: Access Denied
然后我测试了非ACL副本,然后使用预制ACL方法对对象进行ACL更新(上传成功,但ACL更新失败):
$ aws s3 cp myfile s3://B/K
Result: OK
$ aws s3api put-object-acl --bucket B --key K --acl public-read
Result: Access Denied
然后我尝试了AllUsers组的授权方法(成功):
$ aws s3 cp myfile s3://B/K
Result: OK
$ aws s3api put-object-acl --bucket B --key K --grant-read uri=http://acs.amazonaws.com/groups/global/AllUsers
Result: OK
最后两个测试尝试做同样的事情(上传一个对象并使其具有世界可读性),但他们以不同的方式做到这一点,一个被你的政策拒绝而另一个则不然。