我有一个桶,我意外地将数千个带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/*"
}
]
}
Run Code Online (Sandbox Code Playgroud)
更新:
我在文档中找到了对默认拒绝的引用,但AWS Policy Generator只有2个值"允许"和"拒绝"是否有人具有默认拒绝的语法?
谢谢你的帮助
Ste*_*pel 13
评估时的目标是决定是允许还是拒绝给定的请求.评估逻辑遵循几个基本规则:
默认情况下,所有使用您资源的请求都会被拒绝
允许覆盖任何默认拒绝
显式拒绝会覆盖任何允许
评估策略的顺序并不重要
[强调我的]
该页面还提供了一个有用的流程图和讨论[其]更详细地描述了如何做出决定.
所以你Deny "*"
压倒了你的Allow "arn:aws:iam::6527...3775:root"
.如上面链接的流程图所示,您可以通过删除显式拒绝来支持默认拒绝(请注意一起使用ACL和存储桶策略时可能存在的细微差别,这似乎不适用于您用例虽然).
您使用的策略不起作用,因为拒绝优先于允许,因此拒绝所有用户访问.执行此操作的正确方法是使用NotPrincipal
policy元素.它允许您将策略应用于除特定列表之外的所有原则.您的政策应该是:
{
"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/*"
}
]
}
Run Code Online (Sandbox Code Playgroud)
请注意,我认为实际上不允许允许,因为您的帐户应该有权访问这些文件,因为默认情况下它是被授予访问权限的存储桶/对象所有者.虽然这取决于对象的ACL.
好的,据我了解,如果我只设置允许我,那么默认情况下应该拒绝其他所有人。
我尝试设置该存储桶策略,但我的文件仍然可下载:只需从 URL 中删除访问密钥 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
Run Code Online (Sandbox Code Playgroud)
PS:关于信息,我尝试使用 Firefox S3 Organizer 或存储桶资源管理器更改所有文件 ACL,如果您有数十万个文件,它们都不起作用,它们只是冻结。
归档时间: |
|
查看次数: |
20075 次 |
最近记录: |