Как установить политику амазонки S3 в личную для всех, кроме администратора?
У меня есть ведро, где я случайно загрузил тысячи файлов с помощью ACL: public_read
Я хотел бы, чтобы все файлы были недоступны, за исключением сгенерированного URL-адреса доступа.
Я попытался создать политику ведра с отрицанием всех для всех и разрешить все для меня.
Он не работает, и все файлы запрещены даже с созданным URL-адресом доступа:
http://s3.amazonaws.com/myBucket/myFile.pdf?AWSAccessKeyId=AKIAIZB2XTOJ6KYB5SCA&Expires=1331137308&Signature=zRfPOj4XFBrXhyqDZ5DpwJqsWs0%3D
{
"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 есть только 2 значения: "Разрешить" и "Отказать", имеет ли кто-нибудь синтаксис для отказа по умолчанию?
Спасибо за помощь
Ответы
Ответ 1
Хорошо, насколько я понимаю, если я только установил, разрешите мне, тогда по умолчанию должно быть отказано всем.
Я попытался установить эту политику ведра, но мои файлы все еще доступны для загрузки: просто удалите идентификатор ключа доступа из URL, например: 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: Для информации я попытался изменить ACL всех файлов, используя Firefox S3 Organizer или bucket explorer, ни один из них не работает, если у вас несколько сотен тысяч файлов, они просто замораживаются.
Ответ 2
Это вызвано соответствующей оценочной логикой Политика доступа Язык, используемый с Bucket Policies:
Цель во время оценки - решить, будет ли данный запрос должны быть разрешены или запрещены. Логика оценки следует нескольким основные правила:
-
По умолчанию все запросы на использование вашего ресурса происходят от кого-либо, кроме вам отказано
-
Разрешить переопределять любые отклонения по умолчанию
-
Явный запрет переопределяет любые значения
-
Порядок, в котором оцениваются политики, не важен
[акцент мой]
На странице также представлена поучительная блок-схема и обсуждение [которые] более подробно описывают, как принято решение.
Таким образом, ваш Deny "*"
отменяет ваш Allow "arn:aws:iam::6527...3775:root"
. Как показано в приведенной выше блок-схеме, вы можете обойти это, удалив явное отклонение в пользу отказа по умолчанию (помните о потенциальных тонкостях, когда Использование ACL и Bucket Policies Together, которые, похоже, не применимы к вашему варианту использования).
Ответ 3
Политика, которую вы использовали, не работает, потому что отказ имеет приоритет над разрешением, поэтому всем пользователям отказывают в доступе. Правильный способ сделать это - использовать элемент политики 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 ваших объектов.
Ответ 4
Теперь проще.
Просто установите Удалить публичный доступ, предоставленный через публичные ACL, на True
![enter image description here]()