Direkt zum Inhalt

Warum erhalte ich die Fehlermeldung „403 Access Denied“, wenn ich einen S3-REST-API-Endpunkt als Ursprung meiner CloudFront-Distribution verwende?

Lesedauer: 8 Minute
0

Ich möchte den Fehler „403 Access Denied“ beheben, den Amazon CloudFront vom Amazon Simple Storage Service (Amazon S3) zurückgibt.

Kurzbeschreibung

Verwende die folgenden Konfigurationen, um den Fehler „Access Denied“ zu vermeiden:

  • Mache die S3-Objekte öffentlich zugänglich.
  • Verwende Ursprungszugriffskontrolle (OAC) für S3-Buckets, die Objekte enthalten, die serverseitig mit dem AWS Key Management Service (AWS KMS) verschlüsselt sind.
    Hinweis: Du musst OAC anstelle der Ursprungszugriffidentität (OAI) verwenden, da OAI keine mit AWS KMS verschlüsselten Objekte bereitstellt.
  • Ändere die S3-Bucket-Richtlinie so, dass sie den Zugriff auf s3:GetObject ermöglicht.
  • Stelle sicher, dass das AWS-Konto, dem der S3-Bucket gehört, auch das Objekt besitzt.
  • Bestätige, dass die angeforderten Objekte im S3-Bucket vorhanden sind.
  • Definiere ein Standard-Stammobjekt, damit Kunden das Stammverzeichnis der Distribution anfordern können.
  • Für eine OAI-Konfiguration musst du die OAI in die S3-Bucket-Richtlinie aufnehmen. Für eine OAC-Konfiguration musst du den CloudFront-Serviceprinzipal in die S3-Bucket-Richtlinie aufnehmen.

Lösung

Hinweis: Wenn du beim Ausführen von AWS Command Line Interface (AWS CLI)-Befehlen Fehlermeldungen erhältst, findest du weitere Informationen dazu unter Problembehandlung bei der AWS CLI. Stelle außerdem sicher, dass du die neueste Version der AWS CLI verwendest.

S3-Objekte öffentlich zugänglich machen

Um festzustellen, ob die Objekte im S3-Bucket öffentlich zugänglich sind, öffne die URL des S3-Objekts in einem Webbrowser. Oder führe einen curl-Befehl für die URL aus.

Das Folgende ist eine Beispiel-URL eines S3-Objekts:

https://DOC-EXAMPLE-BUCKET.s3.amazonaws.com/index.html

Wenn entweder der Webbrowser oder der Befehl curl den Fehler „Access Denied“ zurückgibt, ist das Objekt nicht öffentlich zugänglich.

Um das Objekt öffentlich zugänglich zu machen, führe eine der folgenden Aktionen aus:

OAC für Objekte verwenden, die mit AWS KMS verschlüsselt sind

Um OAC zu verwenden, füge der AWS-KMS-Verschlüsselungsrichtlinie eine Anweisung hinzu, die dem CloudFront-Serviceprinzipal die Berechtigung erteilt, den Schlüssel zu verwenden. Du kannst auch Lambda @Edge anstelle von OAC verwenden. Weitere Informationen findest du unter Bereitstellen von SSE-KMS-verschlüsselten Inhalten aus S3 mithilfe von CloudFront.

Um zu bestätigen, dass du das Objekt mit AWS KMS verschlüsselt hast, führe eine der folgenden Aktionen durch:

  • Verwende die S3-Konsole, um die Eigenschaften des Objekts anzuzeigen. Überprüfe das Dialogfeld Verschlüsselung. Wenn AWS KMS ausgewählt ist, ist das Objekt mit AWS KMS verschlüsselt.
  • Führe den Befehl head-object aus. Wenn der Befehl ServerSideEncryption als aws:kms zurückgibt, ist das Objekt mit AWS KMS-verschlüsselt.

Zugriff auf s3:GetObject zulassen

Auch wenn du eine explizite Anweisung Genehmigen für s3:GetObject in der Bucket-Richtlinie hast, stelle sicher, dass keine Konflikte mit einer expliziten Anweisung „Verweigern“ entstanden sind. Eine explizite Anweisung Verweigern überschreibt eine explizite Anweisung Genehmigen. Weitere Informationen zu den Anweisungen Verweigern und Genehmigen findest du unter Logik der Logik zur Bewertung von Richtlinien.

Gehe wie folgt vor, um zu bestätigen, dass die Bucket-Richtlinie s3:GetObject und keine expliziten Anweisungen Verweigern zulässt:

  1. Öffne die Amazon-S3-Konsole.

  2. Wähle den Bucket aus.

  3. Wähle die Registerkarte Berechtigungen.

  4. Wähle Bucket-Richtlinie.

  5. Suche nach Anweisungen mit "Action": "s3:GetObject" oder "Action": "s3:*".
    Die folgende Beispielrichtlinie enthält die Anweisungen Genehmigen, die CloudFront OAC und CloudFront OAI Zugriff auf s3:GetObject gewähren. Es enthält auch eine Anweisung Genehmigen, die öffentlichen Zugriff auf s3:GetObject gewährt. Es gibt jedoch eine explizite Anweisung Verweigern für s3:GetObject, die den Zugriff blockiert, sofern die Anfrage nicht von einer bestimmten Amazon Virtual Private Cloud (Amazon VPC) stammt.

    {    "Version": "2012-10-17",  
      "Id":  
        "PolicyForCloudFrontPrivateContent",  
      "Statement": [{  
          "Sid": "Allow-OAC-Access-To-Bucket",  
            "Effect": "Allow",  
            "Principal":  
        {  
                "Service": "cloudfront.amazonaws.com"  
            },  
            "Action": "s3:GetObject",  
    
        "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*",  
            "Condition": {  
                "StringEquals": {  
    
        "AWS:SourceArn": "arn:aws:cloudfront::111122223333:distribution/EDFDVBD6EXAMPLE"  
                }  
            }  
          },  
    
        {  
          "Sid": "Allow-OAI-Access-To-Bucket",  
          "Effect": "Allow",  
          "Principal": {  
            "AWS": "arn:aws:iam::cloudfront:user/CloudFront  
        Origin Access Identity EAF5XXXXXXXXX"  
          },  
          "Action": "s3:GetObject",  
          "Resource": [  
            "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"  
    
        ]  
        },  
        {  
          "Sid": "Allow-Public-Access-To-Bucket",  
          "Effect": "Allow",  
          "Principal": "*",  
    
        "Action": "s3:GetObject",  
          "Resource": [  
            "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"  
          ]  
        },  
        {  
    
        "Sid": "Access-to-specific-VPCE-only",  
          "Effect": "Deny",  
          "Principal": "*",  
          "Action": "s3:GetObject",  
          "Resource":  
        [  
            "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"  
          ],  
          "Condition": {  
            "StringNotEquals": {  
    
        "aws:sourceVpce": "vpce-1a2b3c4d"  
            }  
          }  
        }  
      ]  
    }
  6. Ändere die Bucket-Richtlinie, um Anweisungen zu entfernen oder zu bearbeiten, die CloudFront-OAI-, CloudFront OAC- oder den öffentlichen Zugriff auf s3:GetObject blockieren.

Hinweis: CloudFront speichert die Ergebnisse eines Fehlers des Typs „Access Denied“ für bis zu 5 Minuten im Cache. Nachdem du eine Anweisung Verweigern aus der Bucket-Richtlinie entfernt hast, kannst du eine Aufhebung ausführen für die Distribution, um das Objekt aus dem Cache zu entfernen.

Besitz von S3-Buckets und Objekten gewähren

Verifiziere, dass das Konto der AWS Identity and Access Management (IAM)-Identität, das den Bucket oder das Objekt erstellt hat, den Bucket oder das Objekt besitzt.

Hinweis: Die Anforderung des Objektbesitzes gilt nur für den Zugriff, den eine Bucket-Richtlinie gewährt. Es gilt nicht für den Zugriff, den die Zugriffssteuerungsliste (ACL) des Objekts gewährt.

Gehe wie folgt vor, um zu überprüfen, ob der Bucket und Objekte denselben Eigentümer haben:

  1. Führe den Befehl list-buckets aus, um die kanonische S3-ID des Bucket-Besitzers abzurufen:

    aws s3api list-buckets --query Owner.ID
  2. Führe den Befehl list-objects aus, um die kanonische S3-ID des Objektbesitzers zu erhalten:

    aws s3api list-objects --bucket DOC-EXAMPLE-BUCKET --prefix index.html

    Hinweis: Der vorherige Beispielbefehl zeigt ein einzelnes Objekt, aber du kannst den Befehl list-objects ausführen, um mehrere Objekte zu überprüfen.

Wenn die kanonischen IDs nicht übereinstimmen, haben der Bucket und das Objekt unterschiedliche Besitzer.

Hinweis: Du kannst auch die Amazon-S3-Konsole verwenden, um die Bucket- und Objekteigentümer zu überprüfen. Du findest die Besitzer auf der Registerkarte Berechtigungen des Buckets oder Objekts.

Gehe wie folgt vor, um den Eigentümer des Objekts in den Bucket-Eigentümer zu ändern:

  1. Führe vom Konto des Eigentümers des Objekts den Befehl get-object-acl aus, um die ACL-Berechtigungen abzurufen:

    aws s3api get-object-acl --bucket DOC-EXAMPLE-BUCKET --key object-name
  2. Wenn das Objekt über ACL-Berechtigungen für bucket-owner-full-control verfügt, fahre mit Schritt Nr. 3 fort. Wenn das Objekt keine ACL-Berechtigungen für bucket-owner-full-control hat, führe den Befehl put-object-acl vom Konto des Objektbesitzers aus:

    aws s3api put-object-acl --bucket DOC-EXAMPLE-BUCKET      --key object-name --acl bucket-owner-full-control
  3. Führe vom Konto des Bucket-Besitzers aus den folgenden Befehl aus, um das Objekt selbst zu kopieren und den Besitzer des Objekts zu ändern:

    aws s3 cp s3://DOC-EXAMPLE-BUCKET/index.html      s3://DOC-EXAMPLE-BUCKET/index.html --storage-class STANDARD

    Hinweis: Ersetze --storage-class durch die Speicherklasse.

Die Objekte in den Bucket verschieben

Um zu überprüfen, ob ein Objekt im Bucket existiert, führe den Befehl head-object aus.

Hinweis: Bei S3-Objektnamen wird zwischen Groß- und Kleinschreibung unterschieden. Vergewissere dich, dass die Objektanforderung, die an CloudFront gesendet wird, mit dem S3-Objektnamen übereinstimmt. Wenn die Anfrage nicht den richtigen Objektnamen hat, reagiert Amazon S3 so, als ob das Objekt fehlt. Verwende die Server-Zugriffsprotokollierung, um das Objekt zu identifizieren, das CloudFront von Amazon S3 anfordert.

Wenn das Objekt im Bucket vorhanden ist, maskiert der „Access Denied“-Fehler nicht den „404 Not Found“-Fehler. Überprüfe weitere Konfigurationsanforderungen, um den Fehler „Access Denied“ zu beheben.

Wenn das Objekt sich nicht im Bucket befindet, maskiert der Fehler „Access Denied“ einen Fehler „404 Not Found“. Du musst das Problem im Zusammenhang mit dem fehlenden Objekt beheben.

Ein Standard-Stammobjekt definieren

Informationen zum Definieren eines Standard-Stammobjekts findest du unter Standard-Stammobjekts angeben.

Hinweis: Es ist eine bewährte Sicherheitsmethode, den öffentlichen s3:ListBucket-Zugriff zu verweigern. Wenn du den öffentlichen s3:ListBucket-Zugriff zulassen, können Benutzer alle Objekte in einem Bucket sehen und auflisten. Dadurch werden Metadatendetails des Objekts wie Schlüssel und Größe für alle Benutzer verfügbar gemacht.

Der S3-Bucket-Richtlinie OAI- oder CloudFront-Serviceprinzipalberechtigungen hinzufügen

Um zu überprüfen, ob die Bucket-Richtlinie OAI zulässt, öffne die Amazon S3-Konsole. Suche den Bucket und wähle dann auf der Registerkarte Berechtigungen die Option Bucket-Richtlinie.

Die folgende Beispielrichtlinie enthält eine Anweisung Genehmigen für den CloudFront-Serviceprinzipal, wenn du OAC konfigurierst:

{                "Sid": "Allow-OAC-Access-To-Bucket",  
        "Effect": "Allow",  
        "Principal": {  

    "Service": "cloudfront.amazonaws.com"  
        },  
        "Action": "s3:GetObject",  
        "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*",  

    "Condition": {  
            "StringEquals": {  
                "AWS:SourceArn": "arn:aws:cloudfront::111122223333:distribution/EDFDVBD6EXAMPLE"  

    }  
     }  
      }

Die folgende Beispielrichtlinie enthält eine Anweisung Genehmigen für OAI:

{    "Sid": "1",  
  "Effect": "Allow",  
  "Principal": {  
    "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin  
    Access Identity EAF5XXXXXXXXX"  
  },  
  "Action": "s3:GetObject",  
  "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"  
}

Gehe wie folgt vor, um die Bucket-Richtlinie auf der CloudFront-Konsole zu aktualisieren:

  1. Öffne die CloudFront-Konsole.
  2. Wähle die Distribution aus.
  3. Wähle die Registerkarte Ursprünge und Ursprungsgruppen.
  4. Wähle den S3-Ursprung und anschließend Bearbeiten aus.
  5. Wähle für Zugriff auf den Bucket einschränken die Option Ja.
  6. Wähle für Ursprungszugriffsidentität eine vorhandene Identität oder erstelle eine neue.
  7. Wähle für Leseberechtugungen für den Bucket gewähren die Option Ja, Bucket-Richtlinie aktualisieren.
  8. Wähle Ja, bearbeiten.

Ähnliche Informationen

Problembehandlung bei Fehlerantwort-Statuscodes in CloudFront

Wie behebe ich Fehler „403 Access Denied“ von Amazon S3?

Warum erhalte ich die Fehlermeldung „403 access denied“, wenn ich einen Amazon S3-Website-Endpunkt als Ursprung meiner CloudFront-Distribution verwende?