Die S3-Bucket-Aktion gilt nicht für Ressourcen

123

Ich folge den Anweisungen aus dieser Antwort , um die folgende S3-Bucket-Richtlinie zu generieren:

{
  "Id": "Policy1495981680273",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1495981517155",
      "Action": [
        "s3:GetObject"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::surplace-audio",
      "Principal": "*"
    }
  ]
}

Ich erhalte den folgenden Fehler zurück:

Die Aktion gilt nicht für Ressourcen in Anweisungen

Was fehlt mir in meiner Police?

Philip Kirkbride
quelle
1
Ich habe versucht, Lösung in Link: stackoverflow.com/a/36551238/2786039 Und es funktioniert jetzt. Grüße
Vuong Nguyen

Antworten:

216

In IAM-Dokumenten finden Sie http://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements.html#Action

Bei einigen Diensten können Sie keine Aktionen für einzelne Ressourcen angeben. Stattdessen gelten alle Aktionen, die Sie im Element Aktion oder NotAction auflisten, für alle Ressourcen in diesem Dienst. In diesen Fällen verwenden Sie den Platzhalter * im Ressourcenelement.

Mit diesen Informationen sollte die Ressource einen Wert wie den folgenden haben:

"Resource": "arn:aws:s3:::surplace-audio/*"
Oluwafemi Sule
quelle
39
Ich kann nicht glauben, dass dies in der Richtlinie von Bucket und / oder im Richtliniengenerator nicht erwähnt wird!
Carles Alcolea
4
Ich habe * verwendet und es gibt immer noch diesen Fehler. könnte mir jemand helfen
Yehuda Clinton
@ YehudaClinton, arbeitet für mich.
Stellen Sie
73

Nur die s3:ListBucketErlaubnis zu entfernen war für mich nicht gut genug und wahrscheinlich auch nicht für viele andere.

Wenn Sie die s3:ListBucketBerechtigung wünschen , müssen Sie nur die Ebene des Eimers (ohne die /*am Ende) haben, da diese Berechtigung für den Eimer selbst gilt und nicht für Elemente im Eimer.

Wie unten gezeigt, müssen Sie die s3:ListBucketBerechtigung als separate Anweisung von den Berechtigungen für Elemente im Bucket wie s3:GetObjectund haben s3:PutObject.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket"        
      ],
      "Principal": {
        "AWS": "[IAM ARN HERE]"
      },
      "Resource": "arn:aws:s3:::my-bucket-name"
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject", 
        "s3:PutObject"
      ],
      "Principal": {
        "AWS": "[IAM ARN HERE]"
      },
      "Resource": "arn:aws:s3:::my-bucket-name/*"
    }
  ]
}
Luke
quelle
Einverstanden. Für einige Aktionen ist die ListBucket-Berechtigung erforderlich, bevor Sie GetObject ausführen können. Daher ist diese Antwort gründlicher.
3cheesewheel
2
Dies funktioniert für mich und zeigt nur, wie viel Arbeit AWS noch tun muss, um Benutzer zu grundlegenden Aufgaben zu führen.
Volvox
41

Die Fehleraktion gilt nicht für Ressourcen in Anweisungen

Es bedeutet einfach, dass die Aktion (die Sie in der Richtlinie geschrieben haben) nicht für die Ressource gilt. Ich habe versucht, meinen Eimer öffentlich zu machen, damit jeder ihn aus meinem Eimer herunterladen kann. Ich habe eine Fehlermeldung erhalten, bis ich ("s3: ListBucket") aus meiner Anweisung entfernt habe.

{
  "Id": "Policyxxxx961",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmtxxxxx4365",
      "Action": [
        "s3:GetObject",
        "s3:ListBucket",
        "s3:PutObject"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::bucket-name/*",
      "Principal": "*"
    }
  ]
}

Da der Listen-Bucket nicht im Bucket angewendet wird, hat das Löschen dieser Aktionsrichtlinie einwandfrei funktioniert.

Vaseem007
quelle
Danke, das hat bei mir funktioniert und "s3: ListBucket" entfernt.
Paul Watson
14

Ich bin gerade auf dieses Problem gestoßen und habe eine kürzere Lösung für diejenigen gefunden, die ListBucket und GetObject in derselben Richtlinie haben möchten.

{
  "Id": "Policyxxxx961",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmtxxxxx4365",
      "Action": [
        "s3:GetObject",
        "s3:ListBucket",
        "s3:PutObject"
      ],
      "Effect": "Allow",
      "Resource": [
          "arn:aws:s3:::bucket-name",
          "arn:aws:s3:::bucket-name/*"
      ],
      "Principal": "*"
    }
  ]
}
Alex Spence
quelle
Falsch - Das Principalist für die S3-Richtliniengrammatik nicht zulässig.
azec-pdx
Keine der oben genannten Lösungen funktionierte für mich, der Auftraggeber war entweder ungültig oder mir wurde der Zugriff verweigert.
Daniel
Dies ist richtig. Die Ressource sollte in diesem Fall ein Array sein und diese 2 Zeilen enthalten ... Stimmen Sie ab.
Assil
4

Ich habe auch das ähnliche Problem beim Erstellen des Eimers konfrontiert

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AddPerm",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::mrt9949"
            ]
        }
    ]
}

Ich habe den obigen Code in geändert

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AddPerm",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::mrt9949/*"
            ]
        }
    ]
}

Wenn Sie Ihrem Bucket-Namen / * hinzufügen , wird das Problem behoben

Hier ist mein Eimername mrt9949

Ravi Teja Mureboina
quelle
Danke dir! Verbrachte Ewigkeiten damit, danach zu suchen
Jack_Hardy
4

In meinem Fall bestand die Lösung für diesen Fehler darin, einige der von mir angewendeten Aktionen zu entfernen. Einige von ihnen sind für diese Ressource nicht relevant oder können nicht mit ihr arbeiten. In diesem Fall würde ich Folgendes nicht einschließen:

GetBucketAcl ListBucket ListBucketMultipartUploads

Yehuda Clinton
quelle
ListBucket hat mich erwischt! Vielen Dank dafür
Quad64Bit
Für mich hat funktioniert, wenn nur getObjet
LittleTiger
0

Sie müssen das Muster des Arns überprüfen, das unter dem Resource-Tag für die Policy- definiert ist.

"Ressource": "arn: aws: s3 ::: s3mybucketname / *"

Das Hinzufügen von "/ *" am Ende würde helfen, das Problem zu beheben, wenn Sie es auch dann sehen, wenn Ihre Richtlinie für den öffentlichen Zugriff für Ihren Bucket entsperrt wurde.

Pinaki
quelle
0
  • Gehen Sie in Ihrer Instanz zu Amazon S3.
  • Gehen Sie zu Berechtigungen -> Registerkarte Öffentlicher Zugriff.
  • Wählen Sie Bearbeiten und deaktivieren Sie Alle öffentlichen Zugriffe blockieren und speichern.
  • Auf der Registerkarte "Berechtigung" und in der Zugriffssteuerungsliste wird das Tag "Öffentlich" angezeigt.
Chathura Devinda
quelle
0

Sie können ListBuckets auch für jeden Ordner konfigurieren

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowSESPuts-1521238702575",
            "Effect": "Allow",
            "Principal": {
                "Service": "ses.amazonaws.com"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::buckets.email/*",
            "Condition": {
                "StringEquals": {
                    "aws:Referer": "[red]"
                }
            }
        },
        {
            "Sid": "Stmt1586754972129",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::596322993031:user/[red]"
            },
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::buckets.email",
            "Condition": {
                "StringEquals": {
                    "s3:delimiter": "/",
                    "s3:prefix": [
                        "",
                        "domain.co",
                        "domain.co/user"
                    ]
                }
            }
        },
        {
            "Sid": "Stmt1586754972129",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::596322993031:user/[red]"
            },
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::buckets.email",
            "Condition": {
                "StringLike": {
                    "s3:prefix": "domain.co/user/*"
                }
            }
        },
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::596322993031:user/[red]"
            },
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:DeleteObject"
            ],
            "Resource": "arn:aws:s3:::buckets.email/domain.co/user/*"
        }
    ]
}

Diese Regeln werden zusammen mit SES verwendet, um eine E-Mail zu empfangen, ermöglichen es jedoch einem externen Benutzer, die Dateien anzuzeigen, die von SES in den Bucket gelegt wurden. Ich habe die Anweisungen von hier aus befolgt: https://aws.amazon.com/blogs/security/writing-iam-policies-grant-access-to-user-specific-folders-in-an-amazon-s3-bucket/

Außerdem müssen Sie domain.co/user/bei Verwendung des SDK das Präfix als WITH-Schrägstrich am Ende angeben, da sonst der Zugriff verweigert wird. hoffe es hilft jedem

zavr
quelle