Was führt dazu, dass der Zugriff verweigert wird, wenn die aws cli zum Herunterladen von Amazon S3 verwendet wird?

57

Ich stöbere wirklich in AWS herum und versuche herauszufinden, was ich hier vermisse. Ich möchte, dass ein IAM-Benutzer Dateien aus einem S3-Bucket herunterladen kann, ohne die Dateien nur vollständig öffentlich zugänglich zu machen, aber mir wird der Zugriff verweigert. Wenn jemand erkennen kann, was los ist, bin ich begeistert.

Was ich bisher gemacht habe:

  • Erstellt einen Benutzer namens my-user (zum Beispiel)
  • Generierte Zugriffsschlüssel für den Benutzer und legte sie in ~ / .aws auf einer EC2-Instanz ab
  • Erstellt eine Bucket-Richtlinie, von der ich gehofft hatte, dass sie meinem Benutzer Zugriff gewährt
  • Lief den Befehl aws s3 cp --profile my-user s3://my-bucket/thing.zip .

Bucket-Richtlinie:

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

Das Ergebnis ist, A client error (AccessDenied) occurred: Access Denieddass ich mit demselben Befehl und den Standardzugriffsschlüsseln (Root-Konto?) Herunterladen kann.

Ich habe auch versucht, eine Benutzerrichtlinie hinzuzufügen. Obwohl ich nicht weiß, warum es notwendig sein würde, dachte ich, dass es nicht wehtun würde, und fügte dies meinem Benutzer hinzu.

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

Gleiche Ergebnisse.

Josh Gagnon
quelle

Antworten:

39

Ich hatte auch damit zu kämpfen, aber ich habe hier eine Antwort gefunden: https://stackoverflow.com/a/17162973/1750869 , die dazu beigetragen hat, dieses Problem für mich zu lösen. Antwort unten erneut posten.


Sie müssen die Berechtigungen nicht für alle Benutzer öffnen. Verwenden Sie die folgenden Bucket-Richtlinien für Quelle und Ziel, um mithilfe eines IAM-Benutzers von einem Bucket in ein anderes Konto zu kopieren

Bucket zum Kopieren aus - SourceBucket

Bucket zum Kopieren nach - DestinationBucket

Quell-AWS-Konto-ID - XXXX – XXXX-XXXX

Quell-IAM-Benutzer - src – iam-Benutzer

Die folgende Richtlinie bedeutet: - Der IAM-Benutzer - XXXX – XXXX-XXXX: src – iam-Benutzer hat die Berechtigungen s3: ListBucket und s3: GetObject für SourceBucket / * und s3: ListBucket und s3: PutObject für DestinationBucket / *.

Auf dem SourceBucket sollte die Richtlinie wie folgt lauten:

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

Auf dem DestinationBucket sollte die Richtlinie sein:

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

auszuführender Befehl ist s3cmd cp s3://SourceBucket/File1 s3://DestinationBucket/File1

Sergio
quelle
1
Oh mein Gott, du bist mein Held. Ich habe gerade die ListBucket-Berechtigung auf Bucket-Ebene verpasst. Ich weiß immer noch nicht, warum ich den Eimer brauchen soll, um ein Objekt daraus zu entnehmen, aber das ist okay. Vielleicht ist es nur eine Eigenheit, den Befehl aws zu verwenden?
Josh Gagnon
Ja, es ist ziemlich seltsam. Sie würden denken, dass eine einzige s3: * -Richtlinie (so unsicher das auch sein mag) für die Prüfung der geistigen Gesundheit ausreicht.
Sergio
fml, 2 Tage für diese ListBucket-Berechtigung verschwendet. guter Fang
chaqke
Verbrachte viel Zeit. Dies war die benötigte Antwort. ListBucket - Bucketname, GetObject - Bucketname / *
rsmoorthy
12

Als ich auf dasselbe Problem stieß, stellte sich heraus, dass für AWS die serverseitige Verschlüsselung aktiviert sein musste. Der folgende Befehl hat bei mir also erfolgreich funktioniert:

aws s3 cp test.txt s3://my-s3-bucket --sse AES256
zjor
quelle
3
Vielen Dank! In meinem Fall war es --sse aws:kmsder Eimer "Standard" zu verwenden ...
Michael Yoo
Wenn Sie einen nicht standardmäßigen KMS-Schlüssel verwenden, müssen Sie dies ebenfalls weitergeben: --sse-kms-key-id 0123-abc-etc Unklar ist jedoch, dass Sie für die Verwendung Ihres eigenen KMS-Schlüssels über die IAM-Berechtigung verfügen müssen, damit kms:GenerateDataKeyIhnen der Zugriff weiterhin verweigert wird.
Digarok
Die Frage ist über Download .. Sie machen einen Upload zu einem verschlüsselten S3, daher die Voraussetzung für den Schlüssel.
Ilhicas
4

Ich würde die von James erwähnte Option "Jeder authentifizierte AWS-Benutzer" nicht empfehlen.

Dadurch wird eine Zugriffssteuerungsliste auf Bucket-Ebene hinzugefügt, mit der jedes AWS-Konto (nicht nur Ihre IAM-Benutzer) die ACLs für diesen Bucket auflisten / löschen / ändern kann.

dh öffentlich lesen / schreiben für jeden mit einem aws Account.

Andrew
quelle
Hast du das getestet? Ich hatte den Eindruck, dass AWS-Konto tatsächlich eine Entität in meiner Organisation ist - dh ein Benutzer, eine EC2-Instanz, eine IAM-Rolle, aber keine Person mit einem anderen Konto. Ich könnte mich irren, und ich werde meinen Beitrag bearbeiten und meine Eimer schnell prüfen, wenn das der Fall ist. Vielen Dank.
James Dunmore
1
Jep. Der Berechtigte "Authentifizierter Benutzer" in S3-ACLs bezeichnet alle AWS-Konten. Es erzwingt signierte Anfragen, aber nichts weiter. Hier ist ein Hinweis: Link
Andrew
3

Ich habe es geschafft, das Problem zu beheben, ohne Richtlinien schreiben zu müssen. In der S3-Konsole (Web-UI) habe ich den Bucket ausgewählt und auf der Registerkarte Berechtigungen die Option "Jeder authentifizierte AWS-Benutzer" ausgewählt und alle Boxen abgehakt.

UPDATE: Wie in den Kommentaren erwähnt, ist "Jeder authentifizierte AWS-Benutzer" nicht nur ein Benutzer in Ihrem Konto, sondern ausschließlich ein AWS-authentifizierter Benutzer

James Dunmore
quelle
Ich stelle mir vor, das schafft eine Richtlinie für Sie. Wenn Sie alle Kästchen ankreuzen, erhalten Sie ListBucket usw. und mehr.
Josh Gagnon
Ich bin mir sicher, dass es schwierig sein kann, Richtlinien zu schreiben. Diese Kästchen geben Ihnen vielleicht ein bisschen mehr, aber eine nette schnelle Lösung
James Dunmore
2

Auch wenn Ihre IAM-Richtlinien korrekt eingerichtet sind, kann es zu Fehlern An error occurred (AccessDenied) when calling the <OPERATION-NAME> operation: Access Deniedaufgrund von MFA-Anforderungen (Multi-Factor Authentication) für Ihre Anmeldeinformationen kommen. Diese können Sie überraschen, denn wenn Sie sich bereits bei der AWS-Konsole angemeldet haben, scheinen Ihre Anmeldeinformationen einwandfrei zu funktionieren, und die Fehlermeldung von aws cli, der die Berechtigung verweigert wurde, ist nicht besonders hilfreich.

Es gibt bereits einige gute Anweisungen zum Einrichten von MFA mit aws cli:

Grundsätzlich müssen Sie die Adresse Ihres MFA-Geräts abrufen und diese mit dem Code Ihres Geräts senden, um ein temporäres Token zu erhalten.

Mark Chackerian
quelle
Du hast meinen Tag gerettet, Bruder!
Shintaroid
Ja, das ist der Grund! Warum hat AWS diesen Grund in der Ausgabe nicht angezeigt?
tommy.qichang
0

Ich ging einfach über die Web-Benutzeroberfläche auf und klickte auf den Eimer, ging dann zu Berechtigungen und ging dann zu Richtlinien. Als ich es öffnete, klickte ich einfach auf Löschen. Ich habe das gemacht, weil ich denke, dass es auch die Konfiguration war.

Ich ging zurück zur Hauptseite von S3, klickte dann auf den Eimer und versuchte ihn zu löschen und es funktionierte.

auch wenn ich es mit aws-cli gemacht habe

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

Jedenfalls hat das bei mir funktioniert. Die Richtlinie zu Berechtigungen hindert Sie daran, den Bucket zu löschen.

Spencer Davis
quelle
0

Sobald ich diese Fehlermeldung erhalten habe, indem ich einfach versucht habe zu starten:

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

in einem Ordner, in dem ich keine Berechtigungen hatte. Es ist albern, aber stellen Sie sicher, dass Sie der Eigentümer des Ordners sind, in dem Sie sich befinden, bevor Sie fortfahren!

Jeff Diederiks
quelle
0

Das Problem tritt auf, wenn Sie ungültige Ressourcen- oder Objektnamen einfügen. Ich hatte das gleiche Problem mit boto3 (in meinem Fall war es ein ungültiger Bucket-Name).

Yunus
quelle