Как установить политику корзины Amazon 3 для всех, кроме администратора? - PullRequest
12 голосов
/ 07 марта 2012

У меня есть корзина, в которую я случайно загрузил тысячи файлов с помощью 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 Policy Generator есть только 2 значения: «Разрешить» и «Запретить». У кого-нибудь есть синтаксис для запрета по умолчанию? Спасибо за вашу помощь

Ответы [ 4 ]

13 голосов
/ 07 марта 2012

Это вызвано соответствующей оценочной логикой из языка политики доступа , используемого с Bucket Policies :

Цель во время оценки - решить, соответствует ли данный запрос должно быть разрешено или запрещено. Логика оценки следует нескольким Основные правила:

  • По умолчанию все запросы на использование вашего ресурса поступают от кого-либо, кроме вам отказано

  • Разрешение отменяет любые отклонения по умолчанию

  • Явное запрещение отменяет любые разрешения

  • Порядок, в котором оцениваются политики, не важен

[Акцент мой]

На странице также представлена ​​инструктивная блок-схема и обсуждение [которые] более подробно описывают, как принимается решение .

Итак, ваш Deny "*" переопределяет ваш Allow "arn:aws:iam::6527...3775:root". Как показано в приведенной выше блок-схеме, вы можете обойти эту проблему, убрав явное запрещение в пользу отклонения по умолчанию (обратите внимание на возможные тонкости, когда Использование ACL и политик корзины вместе , которые не делают Похоже, это относится к вашему случаю использования.

5 голосов
/ 17 марта 2015

Политика, которую вы использовали, не работает, потому что запрет имеет приоритет над разрешением , поэтому всем пользователям запрещен доступ.Правильный способ сделать это - использовать элемент политики 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 голосов
/ 08 марта 2012

Хорошо, насколько я понимаю, если я установлю только allow, то по умолчанию это должно быть запрещено всем остальным.

Я пытался установить эту политику, но мои файлы все еще доступны для загрузки: простоудалите идентификатор ключа доступа из URL-адреса, например: http://s3.amazonaws.com/myBucket/myFile.pdf

ACL для моих файлов по-прежнему настроен как: public-Read, поэтому кажется, что у меня действительно есть конфликт между политикой Bucket и отдельными 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

PS: для информации я попытался изменить все файлы ACL с помощью Firefox S3 Organizer или bucket explorer, ни один из них не работает, если у вас есть несколько сотен тысяч файлов, они просто замирают.

0 голосов
/ 10 января 2019

Теперь стало проще.

Просто установите Удалить публичный доступ, предоставленный через публичные ACL в True

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...