Zugriff verweigert Beim Aufrufen der PutObject-Operation mit Berechtigung auf Bucket-Ebene

105

Ich folgte dem Beispiel auf http://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_examples.html#iam-policy-example-s3 , um einem Benutzer Zugriff auf nur einen Bucket zu gewähren.

Ich habe dann die Konfiguration mit dem W3 Total Cache Wordpress Plugin getestet. Der Test ist fehlgeschlagen.

Ich habe auch versucht, das Problem mit zu reproduzieren

aws s3 cp --acl=public-read --cache-control='max-age=604800, public' ./test.txt s3://my-bucket/

und das scheiterte mit

upload failed: ./test.txt to s3://my-bucket/test.txt A client error (AccessDenied) occurred when calling the PutObject operation: Access Denied

Warum kann ich nicht in meinen Eimer hochladen?

Greg
quelle

Antworten:

202

Um meine eigene Frage zu beantworten:

Die Beispielrichtlinie gewährte PutObject-Zugriff, aber ich musste auch PutObjectAcl-Zugriff gewähren.

Ich musste mich ändern

"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject"

vom Beispiel bis:

"s3:PutObject",
"s3:PutObjectAcl",
"s3:GetObject",
"s3:GetObjectAcl",
"s3:DeleteObject"

Sie müssen auch sicherstellen, dass Ihr Bucket so konfiguriert ist, dass Clients eine öffentlich zugängliche ACL festlegen können, indem Sie diese beiden Kontrollkästchen deaktivieren:

Geben Sie hier die Bildbeschreibung ein

Greg
quelle
2
Danke dir! Ich bin mir nicht sicher, warum die Dokumentation von Amazon deaktiviert ist. Möglicherweise möchten Sie auch "s3: AbortMultipartUpload" einfügen, damit ein abgebrochener Upload ordnungsgemäß gelöscht werden kann.
Hashcut
Beispiele für S3-Richtlinien finden Sie hier docs.aws.amazon.com/IAM/latest/UserGuide/…
E.Big
1
Übrigens funktioniert es bei mir nicht. Boto3-Interaktion, auch mit s3fullaccess-Richtlinie Ich erhalte "AccessDenied for PutObject"
E.Big
2
In meinem Fall funktioniert es mit AWS cli, aber es ist nicht mit boto
Hardik Gajjar
3
Ich hatte vollen S3-Zugriff, aber es fehlten die neuen öffentlichen ACLs blockieren und öffentliche Objekte hochladen. Danke dir!
the_ccalderon
35

Ich hatte ein ähnliches Problem. Ich habe das ACL-Zeug nicht benutzt, also brauchte ich es nicht s3:PutObjectAcl.

In meinem Fall habe ich Folgendes getan (in Serverless Framework YML):

- Effect: Allow
  Action:
    - s3:PutObject
  Resource: "arn:aws:s3:::MyBucketName"

Anstatt:

- Effect: Allow
  Action:
    - s3:PutObject
  Resource: "arn:aws:s3:::MyBucketName/*"

Welches fügt ein /*am Ende des Bucket ARN.

Hoffe das hilft.

Movermeyer
quelle
1
Ich brauchte den mit / *
cyrf
Dies war auch bei mir der Fall
Visualspark
9

Für den Fall, dass dies jemand anderem hilft, habe ich in meinem Fall ein CMK verwendet (es hat mit der Standardtaste aws / s3 einwandfrei funktioniert).

Ich musste meine Definition des Verschlüsselungsschlüssels in IAM aufrufen und den bei boto3 angemeldeten programmatischen Benutzer zur Liste der Benutzer hinzufügen, die "diesen Schlüssel zum Ver- und Entschlüsseln von Daten aus Anwendungen und bei Verwendung von in KMS integrierten AWS-Diensten verwenden können".

PeskyGnat
quelle
Das hat mir geholfen. Vielen Dank! Gleicher Fehler wie Berechtigungen, aber tatsächlich die Verschlüsselung.
Vicente Rocha
9

Ich habe gerade meinen Kopf gegen eine Wand geschlagen und versucht, S3-Uploads für große Dateien zum Laufen zu bringen. Anfangs war mein Fehler:

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

Dann habe ich versucht, eine kleinere Datei zu kopieren und bekam:

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

Ich konnte Objekte gut auflisten, aber ich konnte nichts anderes tun, obwohl ich s3:*Berechtigungen in meiner Rollenrichtlinie hatte. Am Ende habe ich die Richtlinie dahingehend überarbeitet:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:DeleteObject"
            ],
            "Resource": "arn:aws:s3:::my-bucket/*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucketMultipartUploads",
                "s3:AbortMultipartUpload",
                "s3:ListMultipartUploadParts"
            ],
            "Resource": [
                "arn:aws:s3:::my-bucket",
                "arn:aws:s3:::my-bucket/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": "s3:ListBucket",
            "Resource": "*"
        }
    ]
}

Jetzt kann ich jede Datei hochladen. Ersetzen Sie my-bucketdurch Ihren Eimernamen. Ich hoffe, das hilft jemand anderem, der das durchmacht.

Ken J.
quelle
2
Dies ergibt: Fehlendes erforderliches Feld Principal :(
Sameera K
2
Ich erhalte auch die folgende Fehlermeldung: Fehlendes erforderliches Feld Principal
Karan Sharma
Wie machst du das in yml
ichimaru
Achtung: Dadurch erhält Ihr IAM-Benutzer / Ihre IAM-Rolle Zugriff auf die Liste der Schlüssel in allen Buckets. Vorsichtig verwenden; Vermeiden Sie es im Idealfall, jemals etwas zu verwenden "Resource": "*".
Darian Moody
Fügen Sie - "Principal": "*", - unter "Effect": "Allow" hinzu, um das Problem mit dem fehlenden erforderlichen Feld zu lösen
meck373
6

Ich hatte ein ähnliches Problem beim Hochladen in einen mit KWS-Verschlüsselung geschützten S3-Bucket. Ich habe eine minimale Richtlinie, die das Hinzufügen von Objekten unter einem bestimmten s3-Schlüssel ermöglicht.

Ich musste meiner Richtlinie die folgenden KMS-Berechtigungen hinzufügen, damit die Rolle Objekte in den Bucket einfügen kann. (Könnte etwas mehr sein als unbedingt erforderlich)

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "kms:ListKeys",
                "kms:GenerateRandom",
                "kms:ListAliases",
                "s3:PutAccountPublicAccessBlock",
                "s3:GetAccountPublicAccessBlock",
                "s3:ListAllMyBuckets",
                "s3:HeadBucket"
            ],
            "Resource": "*"
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "kms:ImportKeyMaterial",
                "kms:ListKeyPolicies",
                "kms:ListRetirableGrants",
                "kms:GetKeyPolicy",
                "kms:GenerateDataKeyWithoutPlaintext",
                "kms:ListResourceTags",
                "kms:ReEncryptFrom",
                "kms:ListGrants",
                "kms:GetParametersForImport",
                "kms:TagResource",
                "kms:Encrypt",
                "kms:GetKeyRotationStatus",
                "kms:GenerateDataKey",
                "kms:ReEncryptTo",
                "kms:DescribeKey"
            ],
            "Resource": "arn:aws:kms:<MY-REGION>:<MY-ACCOUNT>:key/<MY-KEY-GUID>"
        },
        {
            "Sid": "VisualEditor2",
            "Effect": "Allow",
            "Action": [
            <The S3 actions>
            ],
            "Resource": [
                "arn:aws:s3:::<MY-BUCKET-NAME>",
                "arn:aws:s3:::<MY-BUCKET-NAME>/<MY-BUCKET-KEY>/*"
            ]
        }
    ]
}
Spangen
quelle
Genial. Ich habe die Berechtigungen vom verwalteten Standardschlüssel aws/s3in eine IAM-Richtlinie kopiert, die einer Rolle zugeordnet ist (nicht in der KMS-Richtlinie), und es funktioniert gut. Die einzigen Aktionen Ich habe gegen den KMS ARN erforderlich waren: kms:Encrypt, kms:Decrypt, kms:ReEncrypt*, kms:GenerateDataKey*, kms:DescribeKey. Dann nur noch die Standard-S3-Berechtigungen.
30.
3

Ich hatte die gleiche Fehlermeldung für einen Fehler, den ich gemacht habe: Stellen Sie sicher, dass Sie eine korrekte s3-URL verwenden, wie z. s3://my-bucket-name/

(Wenn mein-Eimer-Name offensichtlich die Wurzel Ihres aws s3 ist)

Ich bestehe darauf, denn wenn Sie den s3-Bucket aus Ihrem Browser kopieren, erhalten Sie so etwas wie https://s3.console.aws.amazon.com/s3/buckets/my-bucket-name/?region=my-aws-regiontab=overview

Daher habe ich den Fehler gemacht, der Folgendes s3://buckets/my-bucket-nameaufwirft:

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

amiabl
quelle
1

Für mich habe ich abgelaufene Authentifizierungsschlüssel verwendet. Neue generiert und boomt.

Mark Jackson
quelle
1

Ähnlich wie in einem Beitrag oben (außer dass ich Administratoranmeldeinformationen verwendet habe), damit S3-Uploads mit einer großen 50-Millionen-Datei funktionieren.

Anfangs war mein Fehler:

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

Ich habe den multipart_threshold auf über 50M gestellt

aws configure set default.s3.multipart_threshold 64MB

und ich bekam:

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

Ich habe die Einstellungen für den öffentlichen Zugriff des Buckets überprüft und alles war erlaubt. Daher habe ich festgestellt, dass der öffentliche Zugriff auf Kontoebene für alle S3-Buckets blockiert werden kann :

S3 kann öffentliche ACL auf Kontoebene blockieren

Dovka
quelle
0

Wenn Sie Ihren eigenen vom Kunden verwalteten KMS-Schlüssel für die S3-Verschlüsselung angegeben haben, müssen Sie auch das Flag angeben --server-side-encryption aws:kms, zum Beispiel:

aws s3api put-object --bucket bucket --key objectKey --body /path/to/file --server-side-encryption aws:kms

Wenn Sie das Flag nicht hinzufügen, --server-side-encryption aws:kmszeigt die CLI einen AccessDeniedFehler an

Benjamin Slabbert
quelle
0

Wenn Sie den öffentlichen Zugriff für den Bucket festgelegt haben und dieser immer noch nicht funktioniert, bearbeiten Sie die Bucker-Richtlinie und fügen Sie Folgendes ein:

    {
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "s3:PutObject",
                "s3:PutObjectAcl",
                "s3:GetObject",
                "s3:GetObjectAcl",
                "s3:DeleteObject"
            ],
            "Resource": [
                "arn:aws:s3:::yourbucketnamehere",
                "arn:aws:s3:::yourbucketnamehere/*"
            ],
            "Effect": "Allow",
            "Principal": "*"
        }
    ]
}
Den Pat
quelle
0

Ich konnte das Problem lösen, indem ich über Richtlinien einen vollständigen s3-Zugriff auf Lambda gewährte. Erstellen Sie eine neue Rolle für Lambda und fügen Sie die Richtlinie mit vollständigem S3-Zugriff hinzu.

Hoffe das wird helfen.

tiefes bajaj
quelle