2012-03-07 12 views
12

Mam wiadro, na którym przypadkowo przesłano tysiące plików z listą ACL do: public_read Chciałbym, aby wszystkie pliki były niedostępne, z wyjątkiem wygenerowanego adresu URL dostępu.Jak ustawić zasady wiaderek Amazona S3 jako prywatne dla wszystkich oprócz administratora?

Próbowałem utworzyć zasadę wiadro z odmową wszystkim dla wszystkich i umożliwić wszystkim dla mnie.

nie robi praca i wszystkie pliki są zakazane nawet z wygenerowanym URL dostępu:

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/*" 
     } 
    ] 
} 

UPDATE:
znalazłem odniesienie do domyślnego zaprzeczyć w doc ale Generator zasad AWS ma tylko dwie wartości "Zezwól" i "Odmów", czy ktokolwiek ma składnię domyślnego odmowy?

Dzięki za pomoc

+0

Pomyślałem, że powinieneś być w stanie zmienić oświadczenie "Odrzuć", aby używać "NotPrincipal" zamiast "Zleceniodawca", np. '" NotPrincipal ": {" AWS ":" LICZBA KONTA "NUMER}}' ale po wypróbowaniu tego samego nie działa. – Rory

Odpowiedz

2

OK, o ile rozumiem, jeśli pozwolę tylko mnie, to domyślnie powinien być on odmawiany wszystkim innym.

Próbowałem ustawić tę politykę wiadro ale moje pliki są nadal pobrania: wystarczy usunąć identyfikatora klucza dostępu z adresu URL, takich jak: http://s3.amazonaws.com/myBucket/myFile.pdf

Moje pliki ACL są nadal ustawiony jako: publicznego Czytaj więc wydaje się, że rzeczywiście mam konflikt między polityką zasobu a listą plików ACL.

dałem się co wszystkie pliki prywatne za pośrednictwem polityki wiadro, jeśli ktokolwiek potrzebuje zrobić dużą liczbę plików prywatny wewnątrz wiadra S3, oto zadanie natarcia końcu napisał:

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: Dla informacji próbowałem zmienić wszystkie pliki ACL za pomocą Firefox S3 Organizer lub explorer kubełka, żaden z nich nie działa, jeśli masz kilkaset tysięcy plików, po prostu zamarzają.

+0

Listy ACL są starszym podejściem do kontroli dostępu z S3 i odpowiednio ograniczone, dlatego zaleca się zrzucanie wszystkich list ACL, gdy zaczniesz używać zaawansowanych reguł bucket i/lub IAM do kontroli dostępu, aby uniknąć konfliktów. Później powinno być możliwe osiągnięcie dowolnej pożądanej konfiguracji (choć wprawdzie szczegóły czasami nie są łatwe do uchwycenia). –

+5

Moje potrzeby są całkiem proste: wszystkie pliki w moich zasobnikach muszą być prywatne i dostępne tylko poprzez wygenerowany adres URL dostępu. Nie udało mi się uzyskać tego zachowania poprzez zasady, nie znalazłem odpowiedzi na SO lub na forum pomocy Amazon, to jedyny sposób, jaki udało mi się osiągnąć. Rozumiem, że to rozwiązanie nie jest optymalne, ale naprawdę myślę, że jest problem, jeśli coś tak prostego jest tak trudne do osiągnięcia ... – vdaubry

+1

Smutne jest to, że minęły dwa lata i o ile mogę powiedzieć, że problem pozostaje. Próbuję udostępnić wiadro tylko mojej aplikacji (za pomocą klucza dostępu), ale nie znalazłem sposobu, aby to zrobić. –

12

Spowodowane jest to przez odpowiednie Evaluation Logic z The Access Policy Language używane z Bucket Policies:

Celem w czasie oceny jest ustalenie, czy dany wniosek powinno być dozwolone lub odmówiono. Logika ocena następuje kilka podstawowe zasady:

  • Domyślnie wszystkie wnioski o dopuszczenie do korzystania z zasobów pochodzących od nikogo, ale jesteś odmówiono

  • pozwalają przesłonięcia niespłacenie zaprzecza

  • Jednoznaczne odmówienie zastąpienia dowolnego zezwala na uzyskiwanie Kolejność, w której zasady te oceniano nie jest ważne

[nacisk kopalni]

strona również pouczającą wykres przepływu i dyskusja [ce] opisują bardziej szczegółowo jak podejmowana jest decyzja.

Twój Deny "*" przesłoni Twój numer Allow "arn:aws:iam::6527...3775:root". Jak pokazano na schemacie blokowym powyżej, można obejść to, usuwając jawne odmowy na rzecz domyślnego odmowy (należy pamiętać o potencjalnych subtelnościach, gdy Using ACLs and Bucket Policies Together, które wydają się nie mieć zastosowania w przypadku użycia).

+0

Dziękuję za odpowiedź, znalazłem odwołanie do domyślnego odmowy w dokumencie, ale Generator zasad AWS ma tylko dwie wartości "Zezwól" i "Odmów", czy znasz składnię domyślnego odmowy – vdaubry

+1

@vdaubry: _Domyślnie Deny_ jest domyślnym domyślnym wartość automatycznie na miejscu po rozpoczęciu korzystania z polityki zasobnika; w związku z tym nie trzeba nic robić, tylko usuwając jawnie zabronione obecnie miejsce i automatycznie zyskuje domyślną domyślną odmowę. –

+2

Pomimo tego, że ma wiele upvotes, to nie działa, ponieważ poszczególne obiekty mają obiektową listę ACL publicznego odczytu, więc domyślne zabranie jest nadpisywane przez obiektową listę ACL. Wygląda na to, że potrzebujemy sposobu, aby jawnie odmówić dostępu za pomocą polityki zasobu do wszystkich, oprócz osób, które powinny mieć dostęp. Po zaatakowaniu tego samego problemu nie znalazłem sposobu, aby ustawić zasady wiaderek, aby to osiągnąć. – Rory

5

Zasady, z których korzystałeś, nie działają, ponieważ the deny takes precedence over the allow, więc wszyscy użytkownicy mają odmowę dostępu. Prawidłowym sposobem wykonania tej czynności jest użycie elementu strategii NotPrincipal. Pozwala na stosowanie zasad do wszystkich zasad, z wyjątkiem określonej listy. Twoja polityka powinna następnie być:

{ 
    "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/*" 
     } 
    ] 
} 

pamiętać, że nie sądzę, aby umożliwić to rzeczywiście konieczne, ponieważ Twoje konto powinno mieć dostęp do plików, ponieważ jest właścicielem wiadro/przedmiot, który uzyskuje dostęp domyślnie. Chociaż zależy to od list ACL twoich obiektów.

Powiązane problemy