Czy istnieje polityka S3 ograniczająca dostęp do tylko jednego zasobnika?

123

Mam proste wiadro, które wygląda jak images.mysite.com na moim S3 i innych zasobnikach zawierających kopie zapasowe itp.

Chcę zezwolić określonemu użytkownikowi na dostęp do images.mysite.com zasobnika w celu przesyłania obrazów. Jednak NIE CHCĘ, żeby zobaczył inne wiadra; nawet nie to, że istnieją.

Nie mogłem stworzyć polityki, która to robi; za każdym razem, gdy próbuję czegoś restrykcyjnego, blokuje to wyświetlenie jakichkolwiek zasobników.

Alex
źródło
Głosuję za zamknięciem tego pytania jako niezwiązanego z tematem, ponieważ powinno być na Superusers
Tonny Madsen
Polityka może być generowany tutaj pod adresem: awspolicygen.s3.amazonaws.com/policygen.html
Suhail Gupta
1
Dlaczego nie udostępnić adresu URL zasobnika - https://s3.console.aws.amazon.com/s3/buckets/my-bucket-name/. W ten sposób uniemożliwiasz im przeglądanie całej listy i nie zmieniasz niczego w obecnej polityce.
treecoder

Odpowiedzi:

119

Próbowałem tego od jakiegoś czasu i wreszcie znalazłem działające rozwiązanie. Musisz użyć różnych „Zasobów” w zależności od rodzaju wykonywanej czynności. W poprzedniej odpowiedzi zawarłem również brakujące działania (lubiłem DeleteObject), a niektóre ograniczyłem (lubiłem PutBucketAcl).

Teraz działają dla mnie następujące zasady uprawnień:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket",
        "s3:GetBucketLocation",
        "s3:ListBucketMultipartUploads"
      ],
      "Resource": "arn:aws:s3:::itnighq",
      "Condition": {}
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:AbortMultipartUpload",
        "s3:DeleteObject",
        "s3:DeleteObjectVersion",
        "s3:GetObject",
        "s3:GetObjectAcl",
        "s3:GetObjectVersion",
        "s3:GetObjectVersionAcl",
        "s3:PutObject",
        "s3:PutObjectAcl",
        "s3:PutObjectVersionAcl"
      ],
      "Resource": "arn:aws:s3:::itnighq/*",
      "Condition": {}
    },
    {
      "Effect": "Allow",
      "Action": "s3:ListAllMyBuckets",
      "Resource": "*",
      "Condition": {}
    }
  ]
}

Czynności dotyczące wiadra i obiektów muszą mieć różne arn.

rogercampos
źródło
9
To świetna odpowiedź, dziękuję. Warto zauważyć, że implikacją uprawnienia s3: ListAllMyBuckets jest to, że odbiorca tej zasady może zobaczyć wszystkie zasobniki (root). Nie ma bezpośredniego ujawniania danych, ale nazwy zasobników mogą być wrażliwe / niejasne. Usunięcie tego uprawnienia jest możliwe i wszystko powinno nadal działać (chociaż "s3cmd ls" itp. Nie zwróci zasobnika docelowego).
Mike Repass
91
Nie przeszkadza to użytkownikowi zobaczyć inne nazwy zasobników!
metdos
2
@metdos możesz uniemożliwić użytkownikom wyświetlanie innych nazw zasobników, usuwając ostatnią zasadę.
Hendra Uzia
20
Aby zobaczyć listę zasobników w konsoli (a tym samym użyć konsoli do dostępu do zasobników), musisz przyznać ListAllMyBucketsi GetBucketLocationdla wszystkich zasobników S3 ( "arn:aws:s3:::*"będzie działać raczej niż "*"dla zasobu). Jak stwierdzono w tym poście na blogu AWS „na marginesie, obecnie nie można selektywnie odfiltrowywać niektórych zasobników, więc użytkownicy muszą mieć uprawnienia do wyświetlania wszystkich zasobników w celu uzyskania dostępu do konsoli”.
jwadsack
10
To okropna rada. To niebezpieczne, a konkretnie to, czego OP nie chciał. Zobacz odpowiedzi Andreasa Stankewitza i BFar, aby poznać możliwe obejścia.
AndreKR
37

Nasz przypadek użycia: Zapewnij miejsce na kopie zapasowe dla klientów naszej aplikacji w chmurze, do którego klienci mają bezpośredni dostęp za pomocą typowych narzędzi S3. Oczywiście żaden klient nie powinien widzieć, co mają inni klienci.

Jak wyjaśnił cloudberryman: „Możesz podać wszystkie segmenty lub żadne”, więc musimy wymyślić obejście. Tło:

Przyznanie użytkownikowi uprawnień ListAllMyBuckets jest konieczne, aby konsola AWS S3 lub S3Fox łączyły się bez komunikatu o błędzie. Ale ListAllMyBuckets wyświetla wszystkie zasobniki, fragmenty przydzielonych zasobów (w rzeczywistości działa tylko arn: ... ::: *). To poważny błąd, jeśli o mnie chodzi. Przy okazji. odmowa ListBucket dla wszystkich zasobników nie zapobiega ich wyświetlaniu, ponieważ ListBucket przyznaje prawa do wyświetlania zawartości zasobnika.

Są 3 możliwości, które uważam za obejście. Ja wybrałem ostatnią.

(1) używaj tajemniczych nazw zasobników, np. Identyfikatorów GUID

Zaleta: łatwa konfiguracja

Wada: trudna w zarządzaniu, szczególnie dla klienta. (wyobraź sobie, że znajdujesz określony identyfikator GUID wśród tysięcy innych). Pokazuje również liczbę segmentów = liczba klientów korzystających z usługi tworzenia kopii zapasowych.

(2) użyj jednego zasobnika z folderami specyficznymi dla klienta

W ten sposób Amazon sugeruje na swoich przykładach S3 / IAM, aby zapewnić przestrzeń dostępną tylko dla niektórych użytkowników lub grup użytkowników. Zobacz: Przykładowe zasady uprawnień AWS

Zaleta: dość łatwa w konfiguracji, zgodna z pomysłami AWS

Wada: wymusza upublicznienie istnienia wszystkich wiader, aby klient mógł znaleźć swoje „domowe” wiadro. Rachunkowość AWS zapewnia statystyki wykorzystania zasobnika, ale nie wykorzystania folderów, co utrudnia obliczanie kosztów według klienta.

(3) nie udzielaj praw dostępu do ListAllMyBuckets

Zaleta: dostajesz to, czego chcesz: klienci nie widzą segmentów innych klientów

Wada: klient nie widzi własnego wiadra. S3Browser zawiera ładną wiadomość „nie można” i prosi o wprowadzenie nazwy zasobnika. S3Fox generuje komunikat o błędzie podczas łączenia się z rootem, ale pozwala na bezpośrednią nawigację do zasobnika klienta, jeśli znana jest nazwa zasobnika. Konsola Amazon S3 w ogóle nie działa.

Mam nadzieję, że pomogło to obsłużyć S3 IAM tak, jak tego potrzebujesz.

Andreas Stankewitz
źródło
1
Ponadto w przypadku rozwiązania (1), jeśli chcesz korzystać z hostingu internetowego z zasobnikiem, nazwa zasobnika musi być zgodna z nazwą domeny.
Andy Fusniak
31

Nie jest możliwe zapewnienie dostępu do konsoli S3 bez nadania uprawnień ListAllMyBuckets zgody.

W moim przypadku (i być może również w Twoim, przyszłym czytelniku) akceptowalną alternatywą jest przekierowywanie użytkowników po zalogowaniu się bezpośrednio do zasobnika, który chcesz, aby widzieli.

Aby to zrobić, dołącz następujące informacje do adresu URL logowania do uprawnień: /s3/?bucket=bucket-name

Pełny adres URL logowania (zastąp swój alias i nazwę zasobnika ):

https://your-alias.signin.aws.amazon.com/console/s3/?bucket=bucket-name

Zasady uprawnień (zastąp nazwę zasobnika ):

{
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:ListAllMyBuckets",
            "Resource": "arn:aws:s3:::*"
        },
        {
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::bucket-name",
                "arn:aws:s3:::bucket-name/*"
            ]
        }
    ]
}

Więcej informacji na temat tworzenia uprawnień specyficznych dla zasobnika dla użytkowników można znaleźć na tym blogu: http://mikeferrier.com/2011/10/27/granting-access-to-a-single-s3-bucket-using-amazon-iam /

B daleko
źródło
1
To działa dobrze. Byłoby optymalne, gdyby użytkownicy nie mogli eksplorować poza widokiem wiadra… Ale ja to wezmę. Dzięki @BFar.
Jamie Popkin
To jest JEDNA PRAWIDŁOWA odpowiedź, wszyscy pozostali będą wymieniać wszystkie wiadra - które powinny być ukryte zgodnie z pierwotnym żądaniem.
Steve Horvath
Dokładnie to, czego potrzebuję. Dzięki.
Di Zhang
20

Wypróbuj tę zasadę. Weź również pod uwagę, że nie ma możliwości, aby użytkownik wyświetlał tylko wybrany segment. Możesz wyświetlić wszystkie zasobniki lub żadne.

{
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:GetObjectAcl",
                "s3:PutObjectAcl",
                "s3:ListBucket",
                "s3:GetBucketAcl",
                "s3:PutBucketAcl",
                "s3:GetBucketLocation"
            ],
            "Resource": "arn:aws:s3:::your_bucket_here/*",
            "Condition": {}
        },
        {
            "Effect": "Allow",
            "Action": "s3:ListAllMyBuckets",
            "Resource": "*",
            "Condition": {}
        }
    ]
}
cloudberryman
źródło
2
Działa świetnie! Musiałem zmienić działanie s3:*, aby działało na mnie. Miałem też "Resource": ["arn:aws:s3:::your_bucket_here", "arn:aws:s3:::your_bucket_here/*"], ale to może nie być potrzebne.
Michael Yagudaev
3
s3: * przyznaje dostęp do wszystkiego, w tym do usuwania zasobnika. Na pewno tego chcesz?
Dave Gregory
10

Interpretuję to pytanie jako: „Czy mogę zezwolić na dostęp do jednego zasobnika, w którym inne zasobniki nie będą dostępne, a zatem niewidoczne”. Ponieważ wyświetlenie nazwy zasobnika, do którego nie udzielono dostępu, nadal jest równoznaczne z wyciekiem informacji.

Prawidłowa odpowiedź brzmi: nie. Wymagane uprawnienie to ListAllMyBuckets, które pozwoli użytkownikowi zobaczyć WSZYSTKIE zasobniki. Rezygnacja z tego uprawnienia spowoduje, że konsola będzie bezużyteczna.


źródło
6

Istnieje świetny sposób, aby umożliwić użytkownikom dostęp do określonego zasobnika bez znajomości innych zasobników. Zasady grupy podobne do przedstawionych poniżej umożliwiają użytkownikom wyświetlanie tylko „zasobnika a”. Jedynym haczykiem jest to, że użytkownik będzie mógł uzyskać dostęp do zasobnika tylko wtedy, gdy połączy się z danym punktem końcowym zasobnika. W poniższym przykładzie będzie to bucket-a.s3.amazonaws.com. Aby to nastąpiło, zasobnik może również mieć zezwolenie na „Użytkownicy uwierzytelnieni”.

{
    "Statement": [
     {
         "Sid": "<EXAMPLE_SID>",
         "Action": [
           "s3:ListBucket",
           "s3:GetBucketLocation"
          ],
         "Effect": "Allow",
         "Resource": [
           "arn:aws:s3:::bucket-a"
         ]
     },
     {
      "Sid": "<EXAMPLE_SID>",
      "Action": "s3:*",
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::bucket-a/*"
      ]
     }
   ]
}

Ta metoda została przetestowana z programem Cyberduck w systemie Mac OS / X i przy użyciu pakietu s3cmd

./s3cmd ls s3://bucket-a --access_key=ACCESS_KEY --secret_key=SECRET_KEY --bucket-locat
ion=ap-southeast-2
joevartuli
źródło
Nadal widzę listę wszystkich zasobników. Nie działa :(
Rishikesh Chandra
5

Nie wiesz, dlaczego żadna odpowiedź nie została zaznaczona?

Podzielmy każde oświadczenie polityczne na podstawie powyższych rozwiązań:

Niniejsze oświadczenie o zasadach od ma zastosowanie do zawartości zasobnika, ale nie samego złotówki. Prawdopodobnie nie o to chodziło w pytaniu, ponieważ nie możesz zobaczyć, co jest w wiadrze.

{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:GetObjectAcl",
"s3:PutObjectAcl",
"s3:ListBucket",
"s3:GetBucketAcl",
"s3:PutBucketAcl",
"s3:GetBucketLocation"
],
"Resource": "arn:aws:s3:::your_bucket_here/*",
"Condition": {}
}

Ta zasada dwóch instrukcji wywodząca się z daje dostęp tylko do odczytu do zasobnika at ( arn:aws:s3:::your_bucket_here/) tylko do odczytu , ale nadal zezwala na operacje CRUD na zawartości zasobnika ( arn:aws:s3:::your_bucket_here/*).

{
  "Effect": "Allow",
  "Action": [
    "s3:ListBucket",
    "s3:GetBucketLocation",
    "s3:ListBucketMultipartUploads"
  ],
  "Resource": "arn:aws:s3:::your_bucket_here",
  "Condition": {}
},
{
  "Effect": "Allow",
  "Action": [
    "s3:AbortMultipartUpload",
    "s3:DeleteObject",
    "s3:DeleteObjectVersion",
    "s3:GetObject",
    "s3:GetObjectAcl",
    "s3:GetObjectVersion",
    "s3:GetObjectVersionAcl",
    "s3:PutObject",
    "s3:PutObjectAcl",
    "s3:PutObjectAclVersion"
  ],
  "Resource": "arn:aws:s3:::your_bucket_here/*",
  "Condition": {}
}

Jednak polityka zawiera poniższe oświadczenie, które pozwala użytkownikowi zobaczyć wszystkie zasobniki w punkcie końcowym. Jest to prawdopodobnie nie co pytanie prosiłem.

{
"Effect": "Allow",
"Action": "s3:ListAllMyBuckets",
"Resource": "*",
"Condition": {}
}

Jednak powyższe bardzo przydatne, jeśli używasz klienta przeglądającego sklep S3. Jeśli twój klient uzyskuje dostęp do sklepu, a nie bezpośrednio do zasobnika, potrzebujesz dostępu do listy zasobników w katalogu głównym.

Donal Lafferty
źródło
3

Prawdopodobnie najprostszy przypadek użycia:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["s3:ListBucket"],
      "Resource": ["arn:aws:s3:::bucket-name"]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:GetObject",
        "s3:DeleteObject"
      ],
      "Resource": ["arn:aws:s3:::bucket-name/*"]
    }
  ]
}
jjanczyszyn
źródło
1
Odpowiedź AWS:This policy contains the following error: The policy must contain a valid version string
MaximeBernard
zgadza się - poprawiłem odpowiedź -> <br/> są tutaj tylko dwie możliwe wartości: <br/> * 2012-10-17 * i 2008-10-17 . <br/> Więcej informacji można znaleźć tutaj: <br/> docs.aws.amazon.com/IAM/latest/UserGuide/…
jjanczyszyn
Masz pojęcie o (listing included)znaczeniu wypisywania tylko tego zasobnika, do którego użytkownik może się dostać? Jak dotąd (i według wszystkich innych odpowiedzi) wygląda na to, że AWS nie pozwoli ci tego zrobić.
MaximeBernard
3

Jest na to łatwy sposób lub obejście za pomocą organizacji AWS. Organizacja AWS pozwala na posiadanie wielu kont użytkowników. Twoje główne konto może mieć wiele kont AWS (Sub) i wszelkie usługi (s3 / EC2 / *), które zostaną dodane do dowolnego konta AWS, tylko te zasoby będą widoczne.

Zobacz https://aws.amazon.com/blogs/aws/aws-organizations-policy-based-management-for-multiple-aws-accounts/ https://aws.amazon.com/organizations/

Organizacja na stronie Moje konto

Shaik Ismail
źródło
3

Znalazłem takie rozwiązanie:
AWS FLOW:
AWS FLOW

Zasady dotyczące zasobnika:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Deny",
      "Principal": "*",
      "Action": "s3:*",
      "Resource": [
        "arn:aws:s3:::MyExampleBucket",
        "arn:aws:s3:::MyExampleBucket/*"
      ],
      "Condition": {
        "StringNotLike": {
          "aws:userId": [
            "AROAEXAMPLEID:*", #Role ID
            "111111111111" #AccountID
          ]
        }
      }
    }
  ]
}

Zasady dotyczące uprawnień:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Deny",
      "Principal": "*",
      "Action": "s3:*",
      "Resource": [
        "arn:aws:s3:::MyExampleBucket",
        "arn:aws:s3:::MyExampleBucket/*"
      ],
      "Condition": {
        "StringNotLike": {
          "aws:userId": [
            "AROAEXAMPLEID:*",  #Role ID
            "AIDAEXAMPLEID",  #UserID
            "111111111111"  #AccountID
          ]
        }
      }
    }
  ]
}

aws iam get-user -–user-name NAZWA-UŻYTKOWNIKA --profile = ExampleProfile

aws iam get-role --role-name NAZWA-ROLI --profile = ExampleProfile

Źródło: https://aws.amazon.com/blogs/security/how-to-restrict-amazon-s3-bucket-access-to-a-specific-iam-role/

PS, uważaj na politykę zasobnika, możesz pozostać poza domem bez uprawnień

Constantin Paigin
źródło
2

Jak zostało to dobrze omówione powyżej, umieszczenie tylko jednego zasobnika na konsoli nie jest możliwe. Ale jeśli dostęp do zasobnika S3 jest powiązany z uprawnieniem, uprawnienia mogą uzyskać bezpośredni dostęp do zasobnika, jeśli jest dostępny adres URL zasobnika. Adres URL segmentu S3 będzie wyglądał następująco:

https://s3.console.aws.amazon.com/s3/buckets/BucketName

Gdzie BucketName to nazwa zasobnika, do którego uprawnienia mają dostęp

Ishan Tomar
źródło
1
Myślę, że to jedyne możliwe rozwiązanie również w 2018 roku.
Saurabh
1

Udało mi się uzyskać następującą pracę. Oznaczało to, że lista innych zasobników otrzymała komunikat o odmowie dostępu. Ale nadal mogłem zobaczyć zasobnik, który chciałem, jeśli połączyłem się z nazwą zasobnika ustawioną jako ścieżka.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetBucketLocation",
        "s3:ListAllMyBuckets"
      ],
      "Resource": "arn:aws:s3:::test"
    },
    {
      "Effect": "Allow",
      "Action": ["s3:ListBucket"],
      "Resource": ["arn:aws:s3:::test"]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:GetObject",
        "s3:DeleteObject"
      ],
      "Resource": ["arn:aws:s3:::test/*"]
    }
  ]
}

Użyłem Cyberducka do przetestowania tego połączenia.

codeplay
źródło
1

Chociaż nie jest możliwe ograniczenie s3:ListAllMyBucketsdziałania do określonych zasobników, ponieważ w celu obejścia można wysłać im adres URL konsoli dla określonego zasobnika, np.

  • https://s3.console.aws.amazon.com/s3/buckets/BUCKET_NAME/

Źródło: Ograniczająca lista zasobników S3 z konsoli S3

Aby to zrobić, musisz określić następujący dokument zasad dla danego użytkownika lub grupy:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:GetBucketLocation",
                "s3:ListBucketMultipartUploads"
            ],
            "Resource": [
                "arn:aws:s3:::my-bucket-1",
                "arn:aws:s3:::my-bucket-2"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:AbortMultipartUpload",
                "s3:DeleteObject",
                "s3:DeleteObjectVersion",
                "s3:GetObject",
                "s3:GetObjectAcl",
                "s3:GetObjectVersion",
                "s3:GetObjectVersionAcl",
                "s3:PutObject",
                "s3:PutObjectAcl",
                "s3:PutObjectVersionAcl"
            ],
            "Resource": [
                "arn:aws:s3:::my-bucket-1/*",
                "arn:aws:s3:::my-bucket-2/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListAllMyBuckets"
            ],
            "Resource": "arn:aws:s3:::*"
        }
    ]
}

Gdzie my-bucket-1imy-bucket-2 są twoje zasobniki, aby dać dostęp do odczytu i zapisu.

Związane z:

kenorb
źródło
1

Wypróbuj tę zasadę. Użytkownik nie może podać żadnego zasobnika, musi użyć bezpośredniego linku do dozwolonego zasobnika.

Na przykład: s3.console.aws.amazon.com/s3/buckets/bucketname/?region=us-east-1&tab=overview

{
  "Statement": [
    {
      "Action": [
        "s3:ListBucket"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::bucketname"
      ]
    },
    {
      "Action": [
        "s3:PutObject",
        "s3:GetObject"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::bucketname*"
      ]
    },

  ],
  "Version": "2012-10-17"
}
Chłostać
źródło
1

Podobnie jak inne opisane powyżej:

{
   "Version":"2012-10-17",
   "Statement":[
      {
         "Effect":"Allow",
         "Action":[
            "s3:ListBucket"
         ],
         "Resource":"arn:aws:s3:::awsexamplebucket"
      },
      {
         "Effect":"Allow",
         "Action":[
            "s3:PutObject",
            "s3:GetObject"
         ],
         "Resource":"arn:aws:s3:::awsexamplebucket/*"
      }
   ]
}

Tutaj jest jednak brakujący element. Chociaż nie jest możliwy dostęp do zasobnika przez S3-> Home, możliwy jest dostęp tylko do pożądanego zasobnika poprzez bezpośrednie łącze.

https://s3.console.aws.amazon.com/s3/buckets/yourawsbucket/

Więcej informacji znajdziesz w następującym poście:

https://aws.amazon.com/premiumsupport/knowledge-center/s3-console-access-certain-bucket/

crandorf80s
źródło
0

Poniższe rozwiązanie zadziałało dla mnie. Chciałem politykę dostępu do grantu do konkretnego użytkownika my_iam_user w konkretnym wiadra my-s3-wiadro .

Ta zasada pozwala mojemu użytkownikowi wyświetlać, usuwać i umieszczać pliki w określonym segmencie s3.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "ListBucket",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::123456789012:user/my_iam_user"
            },
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": "arn:aws:s3:::my-s3-bucket"
        },
        {
            "Sid": "AddDeleteFiles",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::123456789012:user/my_iam_user"
            },
            "Action": [
                "s3:DeleteObject",
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::my-s3-bucket/*"
        }
    ]
}
Carlos Coelho
źródło
0

Po prostu dodaję podobną potrzebę, rozwiązaną przez to:

{
  "Version": "2012-10-17",
  "Statement": [
    {
        "Effect": "Allow",
        "Action": [
            "s3:Get*",
            "s3:Put*",
            "s3:DeleteObject",
            "s3:ListBucket"
        ],
        "Resource": [
            "arn:aws:s3:::my-bucket-name",
            "arn:aws:s3:::my-bucket-name/*"
        ]
    }
  ]
}
Xavinsky
źródło
0

Używam następujących rzeczy, aby ukryć zawartość wiadra przed innymi użytkownikami. Pomaga to nie tylko ukryć inne zasobniki (nie używaj ListAllMyBuckets), ale także foldery w tym samym zasobniku, gdy tworzysz jeden zasobnik, ale chcesz mieć w nim podfoldery przypisujące odpowiednie uprawnienia użytkownikowi IAM / podfolderowi.

Poniższe zasady mają zastosowanie do grupy IAM i wszyscy użytkownicy są w tej grupie. Musisz wziąć aws:useridi utworzyć podfolder o tej samej nazwie w wiadrze.

Identyfikator użytkownika można pobrać: aws iam get-user --user-name "user_name_for_folder_access":

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:*"
            ],
            "Resource": [
                "arn:aws:s3:::bucket_name/${aws:userid}/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::bucket_name"
            ]
        }
    ]
}
Andrii Starikov
źródło
0

Miłym prostym rozwiązaniem, które wymyśliliśmy, jest zablokowanie użytkownikowi logowania się do katalogu głównego. Dlatego muszą zalogować się ze zdalną ścieżką ustawioną na żądany folder.

 {
"Statement": [
    {
        "Effect": "Allow",
        "Action": "s3:*",
        "Resource": "arn:aws:s3:::folder-name*",
        "Condition": {}
    }
]
}
PROSPEROWAĆ
źródło
0

Nie, obecnie nie jest możliwe ograniczenie użytkowników do przeglądania selektywnych zasobników w katalogu głównym lub gdziekolwiek indziej. W tej chwili masz tylko te 3 opcje.

Postanowiłem poprosić klienta o jawne użycie nazwy zasobnika.

okulary_mgłowe
źródło
-1

To zadziałało idealnie dla mnie. Użytkownik może przesyłać, pobierać i pobierać listę plików, ale nie będzie mógł wyświetlać plików z innego zasobnika.

 {    

"Statement": [    

{
    "Effect": "Allow",
    "Action": [
        "s3:GetObject",
        "s3:PutObject",
        "s3:GetObjectAcl",
        "s3:PutObjectAcl",
        "s3:ListBucket",
        "s3:GetBucketAcl",
        "s3:PutBucketAcl",
        "s3:GetBucketLocation"
    ],
    "Resource": "arn:aws:s3:::mybucketname/*",
    "Condition": {}
},
{
    "Effect": "Allow",
    "Action": "s3:ListAllMyBuckets",
    "Resource": "*",
    "Condition": {}
},
{
    "Effect": "Deny",
    "Action": [
        "s3:DeleteBucket",
        "s3:DeleteBucketPolicy",
        "s3:DeleteBucketWebsite",
        "s3:DeleteObject",
        "s3:DeleteObjectVersion"
    ],
    "Resource": "arn:aws:s3:::mybucketname/*",    

    "Condition": {}    

}
]
}      
s. tait
źródło
-2

Dodaj Denyklauzulę dotyczącą zasobników, do których nie chcesz mieć dostępu. Pamiętaj, że nadal mogą być na liście, ale nie będziesz mieć dostępu do ich zawartości.

{
    „Wersja”: „2012-10-17”,
    „Oświadczenie”: [
        {
            "Efekt": "Zezwól",
            "Działanie": "s3: *",
            „Zasób”: „*”
        },
        {
            "Efekt": "Odmów",
            "Działanie": "s3: *",
            „Zasób”: [
                "arn: aws: s3 ::: nazwa-zasobnika",
                „arn: aws: s3 ::: nazwa-zasobnika / *”
            ]
        }
    ]
}
treecoder
źródło
1
Powinieneś jawnie przyznać dostęp do zasobów. Gdy domyślnie udzielasz dostępu do wszystkich zasobów, możesz przypadkowo pominąć zasoby, które chcesz zachować jako prywatne. Przyznanie dostępu do wszystkich akcji S3 oznacza również, że użytkownik może upublicznić zasoby, skonfigurować hosting statyczny lub robić inne szkodliwe rzeczy.
Ondrej Galbavý