我有一个桶,我意外地将数千个带ACL的文件上传到:public_read 除了生成的访问URL之外,我希望所有文件都不可用。
我尝试创建一个存储桶策略,拒绝所有人,并允许所有人。
它不起作用,即使使用生成的访问URL,也禁止所有文件:
{
"Version": "2008-10-17",
"Id": "Policy1331136935471",
"Statement": [
{
"Sid": "Stmt1331136294179",
"Effect": "Deny",
"Principal": {
"AWS": "*"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::myBucket/*"
},
{
"Sid": "Stmt1331136364169",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::6527...3775:root"
},
"Action": "s3:*",
"Resource": "arn:aws:s3:::myBucket/*"
}
]
}
更新:
我在文档中找到了对默认拒绝的引用,但AWS Policy Generator只有2个值“允许”和“拒绝”是否有人有默认拒绝的语法?
感谢您的帮助
答案 0 :(得分:13)
这是由与Evaluation Logic一起使用的The Access Policy Language的相应Bucket Policies引起的:
评估时的目标是决定是否给定请求 应该被允许或拒绝。评估逻辑遵循几个 基本规则:
默认情况下,所有使用您资源的请求都来自任何人 你被拒绝
允许覆盖任何默认拒绝
显式拒绝会覆盖任何允许
评估政策的顺序并不重要
[强调我的]
该页面还提供了一个有用的流程图和讨论[其]更详细地描述了如何做出决定。
因此,Deny "*"
会覆盖您的Allow "arn:aws:iam::6527...3775:root"
。如上面链接的流程图所示,您可以通过删除显式拒绝来支持默认拒绝(请注意Using ACLs and Bucket Policies Together时可能存在的微妙之处,这似乎不适用于您的使用虽然如此)。
答案 1 :(得分:5)
您使用的策略无效,因为the deny takes precedence over the allow,因此拒绝所有用户访问。正确的方法是使用NotPrincipal
策略元素。它允许您将策略应用于除特定列表之外的所有原则。您的政策应该是:
{
"Version": "2008-10-17",
"Id": "Policy1331136935471",
"Statement": [
{
"Sid": "Stmt1331136294179",
"Effect": "Deny",
"NotPrincipal": {
"AWS": "arn:aws:iam::6527...3775:root"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::myBucket/*"
},
{
"Sid": "Stmt1331136364169",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::6527...3775:root"
},
"Action": "s3:*",
"Resource": "arn:aws:s3:::myBucket/*"
}
]
}
请注意,我不认为允许实际上是必需的,因为您的帐户应该有权访问这些文件,因为它是默认情况下被授予访问权限的存储桶/对象所有者。虽然这取决于对象的ACL。
答案 2 :(得分:2)
好的,据我所知,如果我只允许我,那么默认情况下应该拒绝给其他人。
我尝试设置该存储桶策略,但我的文件仍可下载:只需从网址中删除访问密钥ID,例如:http://s3.amazonaws.com/myBucket/myFile.pdf
我的文件ACL仍然设置为:public-Read所以看起来确实我在存储桶策略和单个文件ACL之间存在冲突。
我放弃了通过存储桶策略将所有文件设为私有,如果有人需要在S3存储桶中创建大量文件,这是我最后写的rake任务:
desc "Make all objects in S3 private"
task :make_private => :environment do
require 'aws/s3'
bucket_name = 'yourBucket'
marker = ""
AWS::S3::Base.establish_connection!(
:access_key_id => "yourKey",
:secret_access_key => "yourSecret"
)
#create the read-only by me policy
owner_grant = ACL::Grant.new
grantee = ACL::Grantee.new
owner_grant.grantee = grantee
owner_grant.permission = 'READ'
grantee.type = "CanonicalUser"
grantee.id = 'yourID'
grantee.display_name = "yourName"
# Iterate over all files inside bucket and apply the policy to each files
loop do
objects = Bucket.objects(bucket_name, :marker=>marker, :max_keys=>1000)
marker = objects.last.key
puts "new marker is \"#{marker}\""
objects.each do |obj|
policy = S3Object.acl(obj.key, bucket_name)
policy.grants = [owner_grant]
S3Object.acl(obj.key, bucket_name, policy)
end
end
end
P.S:有关信息,我试图使用Firefox S3 Organizer或bucket explorer更改所有文件ACL,如果你有数十万个文件,它们都无法工作,它们只是冻结。
答案 3 :(得分:0)