Подтвердить что ты не робот

Как установить политику амазонки 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 значения: "Разрешить" и "Отказать", имеет ли кто-нибудь синтаксис для отказа по умолчанию?

Спасибо за помощь

4b9b3361

Ответ 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