Jak zezwolić użytkownikowi na przesyłanie plików do segmentu S3, ale nie nadpisywać ani nie usuwać?

19

Mam następujące zasady IAM dla użytkownika

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1395161912000",
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket",
        "s3:PutObject",
        "s3:*"
      ],
      "Resource": [
        "arn:aws:s3:::bucketname"
      ]
    },
    {
      "Sid": "list",
      "Effect": "Allow",
      "Action": [
        "s3:ListAllMyBuckets"
      ],
      "Resource": [
        "arn:aws:s3:::*"
      ]
    }
  ]
}

Celem jest umożliwienie użytkownikowi przesyłania plików do segmentu, ale nie nadpisywania ani usuwania. To jest kopia zapasowa. Zacząłem od ListBucketi PutObject, ale dodałem, *ponieważ to nie zadziałało. Nawet nie *pozwala użytkownikowi na przesyłanie plików, tylko pobieranie Access Denied.

Kiedy próbuję symulatora, wraca Denied - Implicitly denied (no matching statements found).do ListBucket, co wydaje się dziwne, ponieważ domyślnie na to pozwoliłem.

Próbowałem zarówno Cyberduck, jak i 3Hub jako klienci S3.

Masz pojęcie, co jest nie tak?

Znarkus
źródło

Odpowiedzi:

25

Tworząc zasady Amazon IAM dla Amazon S3 , musisz zdawać sobie sprawę z różnicy między operacjami na usłudze (np. ListAllMyBuckets ), operacjami na wiadrach (np. ListBucket ) i operacjami na obiektach (np. GetObject ).

W szczególności Resourcespecyfikacja Twojej polityki musi dotyczyć odpowiednich podmiotów docelowych zgodnie z następującymi wzorami (patrz np. Różne przykładowe zasady dla Amazon S3 ):

  • Operacje w serwisie - arn:aws:s3:::*
  • Operacje na wiadrach - arn:aws:s3:::<bucket>
  • Operacje na obiektach - arn:aws:s3:::<bucket>/<object>

Rozwiązanie

Występuje Access Denied, ponieważ określono zasób na poziomie segmentu PutObject, który wymaga specyfikacji zasobu na poziomie obiektu, takiej jak arn:aws:s3:::<bucket>/*- w związku z tym następujące zasady powinny obejmować przykładowy przypadek użycia:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListAllMyBuckets"
      ],
      "Resource": [
        "arn:aws:s3:::*"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::bucketname"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:PutObject"
      ],
      "Resource": [
        "arn:aws:s3:::bucketname/*"
      ]
    }
  ]
}
Steffen Opel
źródło
1
Niesamowite, działało bezbłędnie. Dziękuję Ci! Więc sidnie jest wymagane?
Znarkus,
1
Według Sid jest to opcjonalny identyfikator, który podajesz dla instrukcji polityki , która musi być unikalna w ramach polityki . Ponieważ wydaje się, że działa dobrze bez (ale patrz poniżej), staram się go tutaj usuwać ze względu na zwięzłość i podczas aktualizacji zasad, ale nie zawracam sobie głowy, na przykład automatycznie generując zasady - jednak zgodnie z kolejną uwagą : Niektóre usługi AWS (na przykład Amazon SQS lub Amazon SNS) może wymagać tego elementu [...] .
Steffen Opel
3
OP twierdzi, że chcą „pozwolić użytkownikowi przesyłać pliki do wiadra, ale nie nadpisywać ani usuwać”, ale ta zasada przyznaje PutObject, co pozwala na przesłonięcie obiektów, prawda? Myślę, że nie ma sposobu, aby to rozdzielić.
Xiong Chiamiov
2
@XiongChiamiov - akcja S3 „PutObject” rzeczywiście oznacza nadpisywanie, po prostu domyślnie działa S3. Jeśli potrzebujesz ochrony przed przypadkowym usunięciem, możesz zajrzeć do sekcji Korzystanie z kontroli wersji w celu zachowania, pobierania i przywracania każdej wersji każdego obiektu przechowywanego w pojemniku Amazon S3. - pozwala to łatwo odzyskać zarówno niezamierzone działania użytkownika, jak i awarie aplikacji .
Steffen Opel
4
Tak, przechowywanie wersji daje możliwość odzyskania obiektów, które zostały nadpisane (ale musisz odkryć, że tak było, a następnie zrób to). W każdym razie -1, ponieważ nie zapewnia dokładnej odpowiedzi na pytanie.
Xiong Chiamiov