Co powoduje odmowę dostępu podczas korzystania z aws cli do pobierania z Amazon S3?

57

Naprawdę walczę w AWS, próbując dowiedzieć się, czego tu brakuje. Chciałbym to zrobić, aby użytkownik IAM mógł pobierać pliki z segmentu S3 - bez publicznego udostępniania plików - ale dostaję odmowę dostępu. Jeśli ktokolwiek zdoła dostrzec, co jest nie tak, będę oszołomiony.

Co zrobiłem do tej pory:

  • Utworzono użytkownika o nazwie my-user (na przykład)
  • Wygenerowano klucze dostępu dla użytkownika i umieściłem je w ~ / .aws w instancji EC2
  • Utworzyłem zasadę segmentu, która, jak mam nadzieję, zapewnia dostęp mojemu użytkownikowi
  • Wykonałem polecenie aws s3 cp --profile my-user s3://my-bucket/thing.zip .

Zasady dotyczące wiader:

{
  "Id": "Policy1384791162970",
  "Statement": [
    {
      "Sid": "Stmt1384791151633",
      "Action": [
        "s3:GetObject"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::my-bucket/*",
      "Principal": {
        "AWS": "arn:aws:iam::111122223333:user/my-user"
      }
    }
  ]
}

Rezultat jest taki, A client error (AccessDenied) occurred: Access Deniedże mogę pobierać za pomocą tego samego polecenia i domyślnych kluczy dostępu (konto root?).

Próbowałem również dodać zasady użytkownika. Chociaż nie wiem, dlaczego byłoby to konieczne, myślałem, że to nie zaszkodzi, więc załączyłem to do mojego użytkownika.

{
  "Statement": [
    {
      "Sid": "Stmt1384889624746",
      "Action": "s3:*",
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::my-bucket/*"
    }
  ]
}

Te same wyniki.

Josh Gagnon
źródło

Odpowiedzi:

39

Walczyłem również z tym, ale znalazłem tutaj odpowiedź https://stackoverflow.com/a/17162973/1750869, która pomogła mi rozwiązać ten problem. Ponowna odpowiedź poniżej.


Nie musisz otwierać uprawnień dla wszystkich. Użyj poniższych zasad segmentu źródłowego i docelowego do kopiowania z segmentu z jednego konta na drugie przy użyciu użytkownika IAM

Wiadro do kopiowania z - SourceBucket

Wiadro do skopiowania do - DestinationBucket

Źródło identyfikatora konta AWS - XXXX – XXXX-XXXX

Źródło IAM User - src – iam-user

Poniższe zasady oznaczają - użytkownik IAM - XXXX – XXXX-XXXX: src – iam-user ma uprawnienia s3: ListBucket i s3: GetObject w SourceBucket / * i s3: ListBucket i s3: PutObject w DestinationBucket / *

W SourceBucket polityka powinna wyglądać następująco:

{
"Id": "Policy1357935677554",
"Statement": [
    {
        "Sid": "Stmt1357935647218",
        "Action": [
            "s3:ListBucket"
        ],
        "Effect": "Allow",
        "Resource": "arn:aws:s3:::SourceBucket",
        "Principal": {"AWS": "arn:aws:iam::XXXXXXXXXXXX:user/src–iam-user"}
    },
    {
        "Sid": "Stmt1357935676138",
        "Action": ["s3:GetObject"],
        "Effect": "Allow",
        "Resource": "arn:aws:s3::: SourceBucket/*",
        "Principal": {"AWS": "arn:aws:iam::XXXXXXXXXXXX:user/src–iam-user"}
   }
]
}

Na DestinationBucket polisa powinna być:

{
"Id": "Policy1357935677554",
"Statement": [
    {
        "Sid": "Stmt1357935647218",
        "Action": [
            "s3:ListBucket"
        ],
        "Effect": "Allow",
        "Resource": "arn:aws:s3::: DestinationBucket",
        "Principal": {"AWS": "arn:aws:iam::XXXXXXXXXXXX:user/src–iam-user"}
    },
    {
        "Sid": "Stmt1357935676138",
        "Action": ["s3:PutObject"],
        "Effect": "Allow",
        "Resource": "arn:aws:s3::: DestinationBucket/*",
        "Principal": {"AWS": "arn:aws:iam::XXXXXXXXXXXX:user/src–iam-user"}
   }
]
}

polecenie do uruchomienia to s3cmd cp s3://SourceBucket/File1 s3://DestinationBucket/File1

Sergio
źródło
1
O mój boże, jesteś moim bohaterem. Właśnie brakowało mi uprawnienia ListBucket na poziomie segmentu. Nadal nie wiem, dlaczego potrzebuję ls wiadra, aby cp obiekt z niego, ale to w porządku. Może to tylko dziwactwo użycia polecenia aws?
Josh Gagnon
Tak, to dość dziwne. Można by pomyśleć, że posiadanie jednej zasady s3: * (choć może to być niezabezpieczone) wystarczyłoby do testowania rozsądku.
Sergio,
fml, 2 dni zmarnowane dla tego uprawnienia ListBucket. dobry połów
chaqke
Spędziłem dużo czasu .. To była potrzebna odpowiedź. ListBucket - nazwa wiadra, GetObject - nazwa wiadra / *
rsmoorthy
12

Kiedy napotkałem ten sam problem, okazało się, że AWS wymaga włączenia szyfrowania po stronie serwera. Więc następujące polecenie zadziałało dla mnie pomyślnie:

aws s3 cp test.txt s3://my-s3-bucket --sse AES256
zjor
źródło
3
Dzięki! W moim przypadku było --sse aws:kmsto użycie „domyślnego” wiadra ...
Michael Yoo,
Jeśli używasz innego niż domyślny klucza KMS, musisz również przekazać to: --sse-kms-key-id 0123-abc-etc Nie jest jednak jasne, że aby użyć własnego klucza KMS, musisz mieć uprawnienia IAM, w kms:GenerateDataKeyprzeciwnym razie nadal będziesz mieć dostęp odmowy.
digarok
Pytanie dotyczy pobierania. Robisz przesyłanie do zaszyfrowanego S3, stąd wymóg klucza.
Ilhicas
4

Nie poleciłbym opcji „Dowolny uwierzytelniony użytkownik AWS” wspomnianej przez Jamesa.

Powoduje to dodanie listy ACL na poziomie segmentu, która pozwala dowolnemu kontu AWS (nie tylko użytkownikom IAM) na wyświetlanie / usuwanie / modyfikację acls dla tego segmentu.

tj. publiczne odczyt / zapis dla każdego, kto ma konto aws.

Andrzej
źródło
Testowałeś to? Miałem wrażenie, że konto AWS w rzeczywistości oznacza dowolny podmiot współpracujący z moją organizacją - tj. Użytkownika, instancję EC2, rolę IAM, ale nie kogoś z innego konta. Mogę się mylić, a jeśli tak, to dokonam edycji mojego wkładu i szybko skontroluję moje wiadra. Dzięki.
James Dunmore,
1
Tak. „Uwierzytelniony użytkownik” w listach ACL S3 oznacza wszystkie konta AWS. Wymusza podpisane wnioski, ale nic więcej. Oto odniesienie: link
Andrew
3

Udało mi się to naprawić bez konieczności pisania zasad - z konsoli S3 (interfejs użytkownika) wybrałem wiadro, a na karcie uprawnień wybrałem opcję „Dowolny uwierzytelniony użytkownik AWS” i wystawiłem bilet na wszystkie pola.

AKTUALIZACJA: jak wskazano w komentarzach „Dowolny uwierzytelniony użytkownik AWS” to nie tylko użytkownicy na Twoim koncie, to tylko uwierzytelniony użytkownik AWS, używaj go ostrożnie

James Dunmore
źródło
Wyobrażam sobie, że to tworzy dla ciebie polisę. Zaznaczenie wszystkich pól da Ci ListBucket itp. I więcej.
Josh Gagnon
Jestem pewien, że tak - po prostu wiem, że pisanie polis może być uciążliwe, te pola wyboru mogą dać ci nieco więcej, ale fajną szybką naprawę
James Dunmore
2

Nawet jeśli Twoje zasady IAM są poprawnie skonfigurowane, nadal możesz otrzymać błąd, taki jak z An error occurred (AccessDenied) when calling the <OPERATION-NAME> operation: Access Deniedpowodu wymagań MFA (Multi-Factor Authentication) na swoich poświadczeniach. Mogą cię zaskoczyć, ponieważ jeśli już zalogowałeś się do konsoli AWS, okaże się, że twoje dane uwierzytelniające działają poprawnie, a komunikat o błędzie odmowy dostępu z aws cli nie jest szczególnie pomocny.

Jest już kilka dobrych instrukcji, jak skonfigurować MFA z aws cli:

Zasadniczo musisz uzyskać adres urządzenia MFA i wysłać go wraz z kodem z urządzenia, aby uzyskać tymczasowy token.

Mark Chackerian
źródło
Uratowałeś mi dzień, stary!
shintaroid
Tak, to jest powód! Dlaczego AWS nie pokazał tego powodu w danych wyjściowych?
tommy.qichang
0

Po prostu włączyłem interfejs webUI i kliknąłem wiadro, a następnie poszedłem do uprawnień, a potem poszedłem do zasad. Kiedy go otworzyłem, po prostu kliknąłem Usuń. Zrobiłem to, ponieważ myślę, że była to również konfiguracja.

Wróciłem do głównej strony s3, a następnie kliknąłem wiadro i próbowałem go usunąć i zadziałało.

nawet gdy zrobiłem to za pomocą aws-cli

$ aws s3 rb s3://bucket-name --force  

W każdym razie to działało dla mnie. Zasady dotyczące uprawnień powstrzymują cię przed usunięciem wiadra.

Spencer Davis
źródło
0

Po otrzymaniu tego błędu po prostu próbuję uruchomić:

aws s3 cp s3://[bucketName]/[fileName] .

w folderze, w którym nie miałem uprawnień. To głupie, ale zanim przejdziesz dalej, upewnij się, że jesteś właścicielem folderu, w którym się znajdujesz!

Jeff Diederiks
źródło
0

Problem pojawia się, gdy wstawisz nieprawidłowe nazwy zasobów lub obiektów. Miałem ten sam problem z boto3 (w moim przypadku była to nieprawidłowa nazwa segmentu)

yunus
źródło