AccessDenied für ListObjects für S3-Bucket, wenn die Berechtigungen s3 sind: *

134

Ich bekomme:

Beim Aufrufen der ListObjects-Operation ist ein Fehler aufgetreten (AccessDenied): Zugriff verweigert

Wenn ich versuche, einen Ordner aus meinem S3-Bucket abzurufen.

Mit diesem Befehl:

aws s3 cp s3://bucket-name/data/all-data/ . --recursive

Die IAM-Berechtigungen für den Bucket sehen folgendermaßen aus:

{
"Version": "version_id",
"Statement": [
    {
        "Sid": "some_id",
        "Effect": "Allow",
        "Action": [
            "s3:*"
        ],
        "Resource": [
            "arn:aws:s3:::bucketname/*"
        ]
    }
] }

Was muss ich ändern , um in der Lage sein copyund lserfolgreich?

user1411335
quelle
1
In meinem Fall hatte ich awsfür einen Benutzer konfiguriert und es in einem Cronjob-Bash-Skript eines anderen Benutzers verwendet, was bedeutet, dass der Zugriffsschlüssel und das Zugriffstoken falsch / nicht festgelegt waren. Meine Lösung bestand darin, die Anmeldeinformationen ( AWS_ACCESS_KEY_IDund AWS_SECRET_ACCESS_KEY) wie hier beschrieben direkt in meine Bash-Skriptdatei einzufügen .
Uwe Keim

Antworten:

199

Sie haben die Berechtigung zum Ausführen von Befehlen für Objekte im S3-Bucket erteilt, aber Sie haben keine Berechtigung zum Ausführen von Aktionen für den Bucket selbst erteilt.

Eine geringfügige Änderung Ihrer Richtlinie würde folgendermaßen aussehen:

{
  "Version": "version_id",
  "Statement": [
    {
        "Sid": "some_id",
        "Effect": "Allow",
        "Action": [
            "s3:*"
        ],
        "Resource": [
            "arn:aws:s3:::bucketname",
            "arn:aws:s3:::bucketname/*"
        ]
    }
  ] 
}

Dies gibt jedoch wahrscheinlich mehr Berechtigungen als erforderlich. Das Befolgen der AWS IAM-Best Practice für die Gewährung des geringsten Privilegs würde ungefähr so ​​aussehen:

{
  "Version": "2012-10-17",
  "Statement": [
      {
          "Effect": "Allow",
          "Action": [
              "s3:ListBucket"
          ],
          "Resource": [
              "arn:aws:s3:::bucketname"
          ]
      },
      {
          "Effect": "Allow",
          "Action": [
              "s3:GetObject"
          ],
          "Resource": [
              "arn:aws:s3:::bucketname/*"
          ]
      }
  ]
}
Mark B.
quelle
39
Dies ist eine zu breite Aktionsliste. Für Listen- und Kopierrechte würden Sie die erforderlichen Aktionen vorschlagen.
Dom Farr
6
@domfarr Ich habe nur das Minimum getan, um die OP-Richtlinie so anzupassen, dass sie für ihn funktioniert. Wenn Sie eine bestimmte Frage haben, sollten Sie diese als separate Frage auf dieser Website veröffentlichen, anstatt sie mit Kommentaren zu versehen. Obwohl es wirklich einfach sein sollte, sich die Liste der S3-Aktionen anzusehen und die gewünschte Richtlinie zu erstellen.
Mark B
4
Ich habe nicht getaggt. OP hat angefordert, was für Kopie und ls benötigt wird. Der Mangel an Bucket Level Arn war enthalten, aber Sie haben die Aktionen nicht angepasst ... daher mein Kommentar.
Dom Farr
1
Vielleicht sollte es funktionieren, EC3 direkt eine geeignete Rolle zuzuweisen. :)
ChikuMiku
6
Stellen Sie auch sicher, dass Sie nicht so schreiben "Resource": [ "arn:aws:s3:::bucketname/", "arn:aws:s3:::bucketname/*" ]wie ich (dh Sie möchten nur einen Schrägstrich vor dem *) - ich habe 4 lange Stunden gebraucht, um zu erkennen, dass dieser Fehler dazu geführt hat, dass alle meine listObjectsAnrufe fehlgeschlagen sind ...
Dániel Kis-Nagy
35

Wenn Sie alle s3-Bucket-Objekte mit dem Befehl "aws s3 cp s3: // Bucket-Name / data / all-data /. --Recursive" kopieren möchten, wie Sie bereits erwähnt haben, finden Sie hier eine sichere und minimale Richtlinie:

{
  "Version": "2012-10-17",
  "Statement": [
      {
          "Effect": "Allow",
          "Action": [
              "s3:ListBucket"
          ],
          "Resource": [
              "arn:aws:s3:::bucket-name"
          ],
          "Condition": {
              "StringLike": {
                  "s3:prefix": "data/all-data/*"
              }
          }
      },
      {
          "Effect": "Allow",
          "Action": [
              "s3:GetObject"
          ],
          "Resource": [
              "arn:aws:s3:::bucket-name/data/all-data/*"
          ]
      }
  ]
}

Die erste Anweisung in dieser Richtlinie ermöglicht das Auflisten von Objekten im Unterverzeichnis eines bestimmten Buckets. Die Ressource muss der Arn des S3-Buckets sein. Um die Auflistung auf ein Unterverzeichnis in diesem Bucket zu beschränken, können Sie den Wert "s3: prefix" bearbeiten.

Die zweite Anweisung in dieser Richtlinie ermöglicht das Abrufen von Objekten innerhalb des Buckets in einem bestimmten Unterverzeichnis. Dies bedeutet, dass alles innerhalb des Pfads "s3: // Bucket-Name / Daten / All-Daten /" kopiert werden kann. Beachten Sie, dass Sie auf diese Weise nicht aus übergeordneten Pfaden wie "s3: // Bucket-Name / Daten /" kopieren können.

Diese Lösung ist spezifisch für die Einschränkung der Verwendung von AWS CLI-Befehlen. Wenn Sie den S3-Zugriff über die AWS-Konsole oder API einschränken müssen, sind weitere Richtlinien erforderlich. Ich schlage vor, hier einen Blick darauf zu werfen: https://aws.amazon.com/blogs/security/writing-iam-policies-grant-access-to-user-specific-folders-in-an-amazon-s3-bucket/ .

Ein ähnliches Problem ist hier zu finden, das mich zu der Lösung geführt hat, die ich gebe. https://github.com/aws/aws-cli/issues/2408

Hoffe das hilft!

Robert Smith
quelle
1
Eigentlich scheint es , wie Sie können beschränken ListBucketauf einen Unterschlüssel: stackoverflow.com/a/35952877/89218
paleozogt
Vielen Dank, dass Sie mich informiert haben. Ich werde dies bei einigen meiner aktuellen Projekte versuchen!
Robert Smith
Vielen Dank. Ich hätte nie gedacht, dass eine nicht erste Antwort mir helfen könnte
Vyacheslav Tsivina
Es ist in der Tat möglich, aws.amazon.com/blogs/security/…
citynorman
Ich habe die Antwort so bearbeitet, dass sie eine Bedingung zum Einschränken der Auflistung von Objekten enthält, die sich in einem bestimmten Unterordner befinden. Danke für die Hilfe!
Robert Smith
8

Sie müssen die Ressource für den Bucket über "arn: aws: 3 ::: Bucketname" oder "arn: aws: 3 ::: Bucketname *" angeben. Letzteres wird bevorzugt, da es auch Manipulationen an den Objekten des Eimers ermöglicht. Beachten Sie, dass es keinen Schrägstrich gibt!

Das Auflisten von Objekten ist eine Operation in Bucket. Daher ist die Aktion "s3: ListBucket" erforderlich. Das Hinzufügen eines Objekts zum Bucket ist eine Operation für das Objekt. Daher ist die Aktion "s3: PutObject" erforderlich. Natürlich möchten Sie nach Bedarf weitere Aktionen hinzufügen.

{
"Version": "version_id",
"Statement": [
    {
        "Sid": "some_id",
        "Effect": "Allow",
        "Action": [
            "s3:ListBucket",
            "s3:PutObject"
        ],
        "Resource": [
            "arn:aws:s3:::bucketname*"
        ]
    }
] 
}
marzhaev
quelle
21
Das Problem mit arn:aws:s3:::bucketname*ist, dass es auch den Zugang zuarn:aws:s3:::bucketname-with-suffix
Guss
1
Wie geschrieben, ist dies eine schlechte Politik; benutze es nicht. Es sollte s3: ListBucket gegen arn: aws: s3 ::: Bucketname und s3: PutObject gegen arn: aws: s3 ::: Bucketname / *
jarmod
7

Ich konnte nicht auf S3 zugreifen, weil

  • Zuerst habe ich den Schlüsselzugriff auf die Instanz konfiguriert (es war dann unmöglich, nach dem Start eine Rolle anzuhängen).
  • habe es für ein paar Monate vergessen
  • angehängte Rolle an die Instanz
  • versuchte zuzugreifen. Der konfigurierte Schlüssel hatte eine höhere Priorität als die Rolle, und der Zugriff wurde verweigert, da dem Benutzer nicht die erforderlichen S3-Berechtigungen erteilt wurden.

Lösung: verwendet rm -rf .aws/credentialsdann awsdie Rolle.

Putnik
quelle
1
Genau das gleiche Problem. Ein Symptom dafür ist, dass ein Benutzer auf Dinge zugreifen kann, die ein anderer Benutzer nicht auf demselben EC2-Knoten kann.
Doc Kaos
6

Ich habe den gleichen Fehler bei der Verwendung der Richtlinie wie unten erhalten, obwohl ich "s3: ListBucket" für die Operation s3: ListObjects habe.

{
"Version": "2012-10-17",
"Statement": [
    {
        "Action": [
            "s3:ListBucket",
            "s3:GetObject",
            "s3:GetObjectAcl"
        ],
        "Resource": [
            "arn:aws:s3:::<bucketname>/*",
            "arn:aws:s3:::*-bucket/*"
        ],
        "Effect": "Allow"
    }
  ]
 }

Dann habe ich es behoben, indem ich eine Zeile "arn: aws: s3 ::: Bucketname" hinzugefügt habe.

{
"Version": "2012-10-17",
"Statement": [
    {
        "Action": [
            "s3:ListBucket",
            "s3:GetObject",
            "s3:GetObjectAcl"
        ],
        "Resource": [
             "arn:aws:s3:::<bucketname>",
            "arn:aws:s3:::<bucketname>/*",
            "arn:aws:s3:::*-bucket/*"
        ],
        "Effect": "Allow"
    }
 ]
}
Gabriel Wu
quelle
4

Ich habe den Fehler zu denken ist auf „s3: Listobjects“ Aktion aber ich hatte die Aktion hinzufügen „s3: ListBucket“ zu lösen das Problem „AccessDenied für Listobjects für S3 - Bucket“

Sudhakar Naidu
quelle
4

Ich stand vor dem gleichen Problem. Ich habe gerade die Konfiguration der Anmeldeinformationen hinzugefügt:

aws_access_key_id = your_aws_access_key_id
aws_secret_access_key = your_aws_secret_access_key

in "~ / .aws / credentials" + Terminal für Standardprofil neu starten.

Bei mehreren Profilen muss --profile arg hinzugefügt werden:

aws s3 sync ./localDir s3://bucketName --profile=${PROFILE_NAME}

wo PROFILE_NAME :

.bash_profile ( or .bashrc) -> export PROFILE_NAME="yourProfileName"

Weitere Informationen zum Konfigurieren von Anmeldeinformationen und mehreren Profilen finden Sie hier

Ihor Pavlyk
quelle
2

Ich habe folgendes versucht:

aws s3 ls s3.console.aws.amazon.com/s3/buckets/{bucket name}

Dies gab mir den Fehler:

An error occurred (AccessDenied) when calling the ListObjectsV2 operation: Access Denied

Die Verwendung dieses Formulars hat funktioniert:

aws s3 ls {bucket name}
Henry
quelle
0

Ich füge eine Antwort mit der gleichen Richtung wie die akzeptierte Antwort hinzu, aber mit kleinen (wichtigen) Unterschieden und füge weitere Details hinzu.

Betrachten Sie die folgende Konfiguration:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["s3:ListBucket"],
      "Resource": ["arn:aws:s3:::<Bucket-Name>"]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:DeleteObject"
      ],
      "Resource": ["arn:aws:s3:::<Bucket-Name>/*"]
    }
  ]
}

Die Richtlinie gewährt programmgesteuerten Schreib- und Löschzugriff und ist in zwei Teile unterteilt:
Die ListBucketAktion stellt Berechtigungen auf Bucket-Ebene bereit, und die anderen PutObject/DeleteObjectAktionen erfordern Berechtigungen für die Objekte im Bucket.

Das erste Ressourcenelement gibt arn:aws:s3:::<Bucket-Name>die ListBucketAktion an, damit Anwendungen alle Objekte im Bucket auflisten können.

Das zweite Ressourcenelement gibt arn:aws:s3:::<Bucket-Name>/*die Aktionen PutObjectund und an DeletObject, damit Anwendungen Objekte im Bucket schreiben oder löschen können.

Die Trennung in zwei verschiedene 'Arns' ist aus Sicherheitsgründen wichtig, um feinkörnige Berechtigungen auf Bucket- und Objektebene anzugeben.

Beachten Sie, dass, wenn ich nur GetObjectim 2. Block angegeben hätte, bei programmatischem Zugriff eine Fehlermeldung wie folgt angezeigt würde:

Upload failed: <file-name> to <bucket-name>:<path-in-bucket> An error occurred (AccessDenied) when calling the PutObject operation: Access Denied.

RtmY
quelle
-1

Bei mir gab es ähnliche Probleme. Für mich bestand das Problem darin, dass in meinem bash_profile verschiedene AWS-Schlüssel festgelegt waren.

Ich habe hier eine ähnliche Frage beantwortet: https://stackoverflow.com/a/57317494/11871462

Wenn Ihr bash_profile widersprüchliche AWS-Schlüssel enthält, verwendet AWS CLI standardmäßig diese.

Varun Tandon
quelle
-1

Ich hatte dieses Problem meine Anforderung Ich wollte dem Benutzer erlauben, auf einen bestimmten Pfad zu schreiben

{
            "Sid": "raspiiotallowspecificBucket",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::<bucketname>/scripts",
                "arn:aws:s3:::<bucketname>/scripts/*"
            ]
        },

und Problem wurde mit dieser Änderung gelöst

{
            "Sid": "raspiiotallowspecificBucket",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::<bucketname>",
                "arn:aws:s3:::<bucketname>/*"
            ]
        },
Ameen
quelle