2014-09-29 9 views
5

Nie mogę ustalić, jak ustawić zasady dotyczące zasobnika, aby osiągnąć to, co chcę. Każda pomoc będzie doceniona! Moje zasady są pożądane:Jak ustawić zasady wiaderek S3 na (głównie) prywatne, gdy element acl obiektu jest publiczny?

  • użytkowników na moim koncie mają dostęp za pośrednictwem polityk użytkowników, więc nie powinno być potrzeby dostępu specjalnie przyznanego im
  • anonimowych użytkowników (lub ktokolwiek poza moim rachunku AWS) nie powinien mieć dostępu, z wyjątkiem :
  • jeden folder/temp_public powinien mieć publiczny obiekt GetObject (tzn. Jeśli znasz adres URL, z którego można pobrać plik)
  • te zasady powinny zastąpić listę ACL obiektu w plikach w zasobniku, ponieważ listy ACL obiektów są czasami ustawione do publicznego czytania.

Powodem tworzenia polityki wiadro jest to, że wiele z tych obiektów w wiadrze z publicznego czytać ACL (przypadkowo ustawiony, gdy pliki zostały przesłane, ale może się zdarzyć w przyszłości, więc chcę, aby zastąpić ACL obiektu z łyżką ACL).

Ignorując folder temp_public, mam nadzieję, że może po prostu to zrobić:

{ 
    "Version": "2008-10-17", 
    "Id": "Policy123456789", 
    "Statement": [ 
     { 
      "Sid": "Stmt1", 
      "Effect": "Deny", 
      "NotPrincipal": { 
       "AWS": "arn:aws:iam::123456789012:root" 
      }, 
      "Action": "s3:GetObject", 
      "Resource": "arn:aws:s3:::my-bucket-name/*" 
     } 
    ] 
} 

(gdzie 123456789012 jest mój numer konta AWS), ale pojawia się odmowa dostępu dla wszystkich użytkowników z tej polityki wiadra. Chyba NotPrincipal nie działa w tym przypadku?

dzięki za wszelkie sugestie!

Rory

UPDATE: cross-pisał here na forach AWS i odpowiedzi!

Odpowiedz

9

Wielkie dzięki dla IP z AWS forach this answer, które mam potwierdzone pracuje dla mnie:

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
     { 
      "Effect": "Allow", 
      "Principal": "*", 
      "Action": "s3:GetObject", 
      "Resource": "arn:aws:s3:::BucketName/temp_public/*" 
     } 
    ] 
} 

To stwierdzenie da ktoś Czytaj dostęp do obiektów wewnątrz temp_public folderu, niezależnie ACL na tych plików. Aby nadpisać publiczny dostęp do wszystkich innych plików, należy podać instrukcję + Deny +-type. Wyraźna Odmowa zastępuje wszelkie Zezwalaj na dostęp, więc musisz wykluczyć już podane uprawnienia. więc używać NotResource jako maski wykluczeń (NOT FINAL JESZCZE, czytaj poniżej):

{ 
    "Effect": "Deny", 
    "Principal": "*", 
    "Action": "s3:GetObject", 
    "NotResource": "arn:aws:s3:::BucketName/temp_public/*" 
} 

to jednak będzie odmówić dostępu do wszystkich użytkowników, w tym koncie też, bo główny jest ustawiony na „*”. Dlatego należy wykluczyć swoje konto z tego Deny (ciągle nie jest ostateczna):

{ 
    "Effect": "Deny", 
    "NotPrincipal": { "AWS": "arn:aws:iam::XXXXYYYYZZZZ:root" }, 
    "Action": "s3:GetObject", 
    "NotResource": "arn:aws:s3:::BucketName/temp_public/*" 
} 

(gdzie XXXXYYYYZZZZ to 12-cyfrowy numer konta AWS Id)

Wciąż problemem: powyżej oświadczenie blokuje dostęp do wszystkich Użytkownicy IAM (z wyjątkiem konta root). Chcesz również wykluczyć wszystkich użytkowników IAM, ale jest to trudne. Z pewnych powodów program Amazon S3 nie obsługuje symboli wieloznacznych służących do określania użytkowników IAM w zasadach dotyczących zasobników. Nie możesz napisać "arn:aws:iam::XXXXYYYYZZZZ:user/*" jako głównego (powoduje to błąd: "Nieprawidłowe zlecenie w polisie").Musisz podać dokładne nazwy użytkowników:

{ 
    "Effect": "Deny", 
    "NotPrincipal": { 
     "AWS": [ 
          "arn:aws:iam::XXXXYYYYZZZZ:root", 
          "arn:aws:iam::XXXXYYYYZZZZ:user/user1", 
          "arn:aws:iam::XXXXYYYYZZZZ:user/user2", 
          "arn:aws:iam::XXXXYYYYZZZZ:user/user3", 
          "arn:aws:iam::XXXXYYYYZZZZ:user/user4" ] 
    } 
    "Action": "s3:GetObject", 
    "NotResource": "arn:aws:s3:::BucketName/temp_public/*" 
} 

NB z Rory: Docs S3 sugerują, można użyć arn:aws:iam::XXXXYYYYZZZZ:root na pokrycie wszystkich użytkowników na koncie, ale to po prostu nie wydają się działać

Tak więc ostateczna polityka będzie wyglądać tak:

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
     { 
      "Effect": "Allow", 
      "Principal": "*", 
      "Action": "s3:GetObject", 
      "Resource": "arn:aws:s3:::BucketName/temp_public/*" 
     }, 
     { 
      "Effect": "Deny", 
      "NotPrincipal": { 
       "AWS": [ 
            "arn:aws:iam::XXXXYYYYZZZZ:root", 
            "arn:aws:iam::XXXXYYYYZZZZ:user/user1", 
            "arn:aws:iam::XXXXYYYYZZZZ:user/user2", 
            "arn:aws:iam::XXXXYYYYZZZZ:user/user3", 
            "arn:aws:iam::XXXXYYYYZZZZ:user/user4" ] 
      } 
      "Action": "s3:GetObject", 
      "NotResource": "arn:aws:s3:::BucketName/temp_public/*" 
     } 
    ] 
} 
Powiązane problemy