Ich verwende einen S3-Website-Endpunkt als Ursprung für meine CloudFront-Verteilung. Warum erhalte ich die Fehler 403-Access-Denied (Zugriff verweigert)?

Lesedauer: 11 Minute
0

Ich nutze einen Bucket von Amazon Simple Storage Service (Amazon S3) als Ursprung meiner Amazon-CloudFront-Verteilung und möchte 403-Fehler beheben.

Kurzbeschreibung

Um Zugriffsverweigerungs-Fehler zu beheben, ermitteln Sie zuerst, ob der Ursprungs-Domänenname Ihrer Verteilung ein S3-Website-Endpunkt oder ein S3-REST-API-Endpunkt ist. Falls Ihre Verteilung einen Website-Endpunkt verwendet, lesen Sie dann die Abschnitte zur Fehlerbehebung durch.

Auflösung

Bestimmen Sie den Endpunkttyp Ihres Ursprungs-Domänennamens für die Verteilung

1.    Öffnen Sie die CloudFront-Konsole.

2.    Wählen Sie Ihre CloudFront-Verteilung aus. Wählen Sie dann Distribution Settings (Verteilungs-Einstellungen).

3.    Wählen Sie die Registerkarte Origins and Origin Groups (Ursprünge und Ursprungsgruppen).

4.    Überprüfen Sie den Domänennamen unter Origin Domain Name and Path (Ursprungs-Domänenname- und Pfad). Bestimmen Sie den Endpunkttyp anhand des Formats des Domänennamens:

REST-API-Endpunkte verwenden das folgende Format:

DOC-EXAMPLE-BUCKET.s3.amazonaws.com

Website-Endpunkte verwenden folgendes Format:

DOC-EXAMPLE-BUCKET.s3-website-us-east-1.amazonaws.com

Hinweis: Je nach AWS-Region verwendet das Endpunktformat möglicherweise das Bindestrichformat (s3-website-Region) oder das Punktformat (s3-website.Region). Wenn Ihre Verteilung einen REST-API-Endpunkt verwendet, lesen Sie Ich verwende einen S3-REST-API-Endpunkt als Ursprung meiner CloudFront-Verteilung. Warum erhalte ich 403 Access Denied (Zugriff verweigert)-Fehler?

Wenn Ihre Verteilung einen Website-Endpunkt verwendet, überprüfen Sie die folgenden Anforderungen, um Zugriffsverweigerungsfehler zu vermeiden.

Wenn Sie OAI verwenden, stellen Sie sicher, dass die Objekte im Bucket nicht von AWS KMS verschlüsselt sind

CloudFront-Verteilungen unterstützen keine verschlüsselten Objekte mit AWS Key Management Service (AWS KMS), wenn Ursprungszugriffsidentität (OAI) verwendet wird. Sie müssen die AWS-KMS-Verschlüsselung aus den S3-Objekten entfernen, die Sie mithilfe der Verteilung bereitstellen möchten. Anstatt die AWS-KMS-Verschlüsselung zu verwenden, verwenden Sie AES-256, um Ihre Objekte zu verschlüsseln.

Ermitteln Sie, ob die Objekte mit AWS KMS verschlüsselt worden sind

So überprüfen Sie, ob die Objekte in Ihrem Bucket mit AWS KMS verschlüsselt worden sind:

Verwenden Sie die Amazon-S3-Konsole, um die Eigenschaften des Objekts anzuzeigen. Prüfen Sie das Dialogfeld Verschlüsselung. Wenn AWS-KMS ausgewählt ist, ist das Objekt AWS-KMS-verschlüsselt.

-oder-

Führen Sie den Befehl head-object mithilfe der AWS Command Line Interface (AWS CLI) aus. Wenn der Befehl ServerSideEncryption als aws:kms zurückgibt, ist das Objekt AWS-KMS-verschlüsselt.

Hinweis: Wenn Sie beim Ausführen von AWS-CLI-Befehlen Fehlermeldungen erhalten, stellen Sie sicher, dass Sie die neueste Version der AWS CLI verwenden.

Verändern der Verschlüsselungseinstellungen eines Objekts

Informationen zum Ändern der Verschlüsselungseinstellungen des Objekts mithilfe der Amazon-S3-Konsole finden Sie unter Festlegen der serverseitigen Verschlüsselung mit AWS KMS (SSE-KMS).

Um die Verschlüsselungseinstellungen des Objekts mithilfe der AWS CLI zu ändern, stellen Sie zunächst sicher, dass der Bucket des Objekts nicht über die Standardverschlüsselung verfügt. Wenn der Bucket keine Standardverschlüsselung hat, führen Sie den folgenden Befehl aus, um die Verschlüsselung des Objekts zu entfernen, mit dem Sie das Objekt über sich selbst kopieren. Ersetzen Sie DOC-EXAMPLE-BUCKET durch den Namen Ihres Buckets:

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

Warnung: Beim Kopieren des Objekts über sich selbst werden die Einstellungen für storage-class und website-redirect-location entfernt. Um diese Einstellungen im neuen Objekt beizubehalten, stellen Sie sicher, dass Sie diese Werte in der Kopieranforderung explizit angeben.

Wenn Sie OAC verwenden, vergewissern Sie sich, dass das OAC über die richtigen Berechtigungen verfügt

Eine Origin Access Control (OAC) unterstützt die serverseitige Amazon-S3-Verschlüsselung mit AWS KMS. Um auf AWS-KMS-verschlüsselte S3-Objekte zugreifen zu können, muss OAC über die Berechtigungen zur Verwendung des AWS-KMS-Schlüssels verfügen. Weitere Informationen finden Sie im Abschnitt SSE-KMS unter Erteilen der Origin Access Control für den Zugriff auf den S3-Bucket.

Vergewissern Sie sich, dass es in der Bucket-Richtlinie für die s3:GetObject-Aktion keine ausdrückliche „Zugriffsverweigerung“ gibt

Ihre Bucket-Richtlinie darf keine Anweisung zur Zugriffsverweigerung enthalten, die den öffentlichen Lesezugriff auf die s3:GetObject-Aktion blockiert.

Wenn Sie eine ausdrückliche Anweisung zum Erlauben für s3:GetObject in Ihrer Bucket-Richtlinie haben, stellen Sie sicher, dass es keine widersprüchliche explizite Anweisung zur Zugriffsverweigerung gibt. Eine explizite Anweisung zur Zugriffsverweigerung hat immer Vorrang vor einer expliziten Anweisung zum Erlauben.

So überprüfen Sie Ihre Bucket-Richtlinie für s3:GetObject:

1.    Öffnen Sie den S3-Bucket Ihrer Website von der Amazon-S3-Konsole aus.

2.    Wählen Sie die Registerkarte Berechtigungen.

3.    Wählen Sie Bucket-Richtlinie aus.

4.    Überprüfen Sie die Bucket-Richtlinie auf Anweisungen mit „Aktion“: „s3:GetObject“ oder „Aktion“: „s3:*“.

5.    Ändern Sie die Bucket-Richtlinie, um Anweisungen zu entfernen oder zu bearbeiten, die den öffentlichen Lesezugriff auf s3:GetObject blockieren.

Die folgende Beispielrichtlinie enthält eine explizite Anweisung zum Erlauben des öffentlichen Zugriffs auf s3:GetObject. Es gibt jedoch auch eine explizite Zugriffsverweigerungs-Anweisung für s3:GetObject, die den Zugriff blockiert, es sei denn, die Anfrage stammt von einer bestimmten Amazon Virtual Private Cloud (Amazon VPC). Diese Richtlinie muss geändert werden, um die Aktion s3:GetObject zu erlauben.

{
  "Version": "2012-10-17",
  "Id": "PolicyForCloudFrontPrivateContent",
  "Statement": [
    {
      "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"
        }
      }
    }
  ]
}

Die folgende Richtlinie ist ein Beispiel für eine Amazon-S3-Bucket-Richtlinie, die den schreibgeschützten Zugriff auf ein CloudFront-OAC ermöglicht:

{
  "Version": "2012-10-17",
  "Statement": {
    "Sid": "AllowCloudFrontServicePrincipalReadOnly",
    "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"
      }
    }
  }
}

Falls die Bucket-Richtlinie öffentlichen Lesezugriff gewährt, bestätigen Sie, dass das AWS-Konto, das Eigentümer des Buckets ist, ebenfalls Eigentümer des Objekts ist

Damit eine Bucket-Richtlinie öffentlichen Lesezugriff auf Objekte erlaubt, muss das AWS-Konto, dem der Bucket gehört, auch Eigentümer der Objekte sein. Für bestehende Amazon-S3-Buckets sind die Einstellungen höchstwahrscheinlich auf die Standardeinstellungen für Objekteigentümer festgelegt. Dies ist das AWS-Konto des AWS Identity and Access Management (IAM), das das Objekt in den Bucket hochgeladen hat.

Hinweis: Die Anforderung der Objekt-Eigentümerschaft gilt für den öffentlichen Lesezugriff, der durch eine Bucket-Richtlinie gewährt wird. Sie gilt nicht für den öffentlichen Lesezugriff, der von der Zugriffssteuerungsliste (ACL) des Objekts gewährt wird.

Vergewissern Sie sich, dass der Bucket und die Objekte den gleichen Besitzer haben

Nutzen Sie die folgenden Schritte, um zu überprüfen, ob der Bucket und die Objekte denselben Besitzer haben. Sie können auch die Amazon-S3-Konsole verwenden, um die Bucket- und Objekt-Eigentümer zu überprüfen. Die Besitzer befinden sich auf der Registerkarte Permissions (Berechtigungen) des jeweiligen Buckets oder Objekts.

1.    Führen Sie den folgenden AWS-CLI-Befehl aus, um die kanonische S3-ID des Bucket-Eigentümers abzurufen:

aws s3api list-buckets --query Owner.ID

2.    Führen Sie den folgenden Befehl aus, um die kanonische S3-ID des Objekt-Eigentümers abzurufen:

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

Dieses Beispiel zeigt ein einzelnes Objekt, aber Sie können den Listen-Befehl verwenden, um mehrere Objekte zu überprüfen.

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

Objekteigentümerschaft aktualisieren

Bucket-Besitzer können den Besitz von Objekten mit S3-Objekteigentümerschaft verwalten. Bei allen neuen S3-Buckets ist die Einstellung zum Erzwingen des Bucket-Besitzers standardmäßig aktiviert. Informationen zum Aktualisieren eines vorhandenen Buckets finden Sie unter Objekt-Eigentümerschaft für einen vorhandenen Bucket festlegen. Wenn die Einstellung zum Erzwingen des Bucket-Eigentümers aktiviert ist, sind die Bucket-Eigentümer die Objekt-Eigentümer für alle Objekte im Bucket. Wenn die Einstellung zum Erzwingen des Bucket-Eigentümers aktiviert ist, werden außerdem alle ACLs in einem Bucket und seinen Objekten deaktiviert.

Es ist eine bewährte Methode, dass Bucket-Eigentümer die Einstellung zum Erzwingen des Bucket-Eigentümers für alle Buckets verwenden und Berechtigungen über IAM- und Bucket-Richtlinien verwalten.

Um die ACLs für Ihren Bucket zu entfernen und die Eigentümerschaft an allen Objekten im Bucket zu übernehmen, führen Sie den folgenden Befehl aus:

aws s3api put-bucket-ownership-controls --bucket example-bucket --ownership-controls 'Rules=[{ObjectOwnership=BucketOwnerEnforced}]'

Falls Sie die ACLs für Ihren S3-Bucket nicht deaktivieren möchten, können Sie auch den Eigentümer des Objekts in den Bucket-Eigentümer ändern.  Gehen Sie dazu wie folgt vor:

1.    Führen Sie im Konto des Objektbesitzers diesen Befehl aus, um die dem Objekt zugewiesenen 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-Eigentümer mit vollem Zugriff verfügt, fahren Sie mit Schritt 3 fort. Wenn das Objekt keine ACL-Berechtigungen für Bucket-Eigentümer-Vollzugriff hat, führen Sie den folgenden Befehl aus dem Konto des Objekt-Eigentümers aus. Ersetzen Sie DOC-EXAMPLE-BUCKET mit dem Namen Ihres Buckets.

aws s3api put-object-acl --bucket DOC-EXAMPLE-BUCKET --key object-name --acl bucket-owner-full-control

3.    Führen Sie im Konto des Bucket-Eigentümers den folgenden Befehl aus, um den Besitzer des Objekts zu ändern, indem Sie das Objekt über sich selbst kopieren. Ersetzen Sie DOC-EXAMPLE-BUCKET mit dem Namen Ihres Buckets.

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

Bestätigen Sie, dass die angeforderten Objekte im Bucket existieren

Wenn der Benutzer nicht über S3:ListBucket-Berechtigungen verfügt, erhält der Benutzer bei nicht vorhandenen Objekten die Fehlermeldung Accessed Denied (Zugriff verweigert) anstelle der Fehlermeldungen 404 Not Found (Nicht gefunden). Führen Sie den AWS-CLI-Befehl head-object aus, um zu überprüfen, ob ein Objekt im Bucket existiert.

Hinweis: Vergewissern Sie sich, dass die an CloudFront gesendete Objektanforderung exakt mit dem S3-Objektnamen übereinstimmt. Bei S3-Objektnamen müssen Sie die Groß-/Kleinschreibung beachten. Wenn die Anforderung nicht den richtigen Objektnamen hat, reagiert Amazon S3 so, als ob das Objekt fehlt. Um zu identifizieren, welches Objekt CloudFront von Amazon S3 anfordert, verwenden Sie die Server-Zugriffsprotokollierung.

Wenn Sie eine Fehlermeldung bezüglich Ihres Standard-Stammobjekts erhalten, stellen Sie sicher, dass Ihr Objektname keine zusätzlichen Zeichen enthält. Beispielsweise sollte index.html in das Feld Standard-Stammobjekt eingegeben werden, und nicht /index.html. Weitere Informationen finden Sie unter Festlegen eines Standard-Stammobjekts.

Wenn das Objekt im Bucket vorhanden ist, maskiert der Access-Denied-Fehler nicht den 404-Not-Found-Fehler. Überprüfen Sie andere Konfigurations-Anforderungen, um den Access-Denied-Fehler zu beheben.

Wenn das Objekt im Bucket nicht vorhanden ist, maskiert der Access-Denied-Fehler einen 404-Not-Found-Fehler. Beheben Sie das Problem im Zusammenhang mit dem fehlenden Objekt.

Hinweis: Es ist keine bewährte Sicherheitsmethode, den öffentlichen Zugriff auf S3:ListBucket zu aktivieren. Durch Aktivieren des öffentlichen s3:ListBucket-Zugriffs können Benutzer alle Objekte in einem Bucket anzeigen und auflisten. Dadurch werden den Benutzern Details zu Objektmetadaten (z. B. Schlüssel und Größe) angezeigt, auch wenn die Benutzer keine Berechtigungen zum Herunterladen des Objekts haben.

Vergewissern Sie sich, dass Amazon S3 Block Public Access für den Bucket deaktiviert ist

Vergewissern Sie sich, dass keine Einstellungen für Amazon S3 Block Public Access auf Ihren S3-Bucket angewendet wurden. Diese Einstellungen können Berechtigungen außer Kraft setzen, die öffentlichen Lesezugriff ermöglichen. Die Einstellungen für Amazon S3 Block Public Access können auf einzelne Buckets oder AWS-Konten angewendet werden.

Bestätigen Sie, dass die Objekte im Bucket öffentlich zugänglich sind

Eine Verteilung, die einen Website-Endpunkt verwendet, unterstützt nur öffentlich zugängliche Inhalte. Um festzustellen, ob ein Objekt in Ihrem S3-Bucket öffentlich zugänglich ist, öffnen Sie die URL des Objekts in einem Webbrowser. Oder Sie führen einen curl-Befehl für die URL aus.

Beispiel:

http://DOC-EXAMPLE-BUCKET.s3-website-us-east-1.amazonaws.com/index.html

Wenn der Webbrowser oder curl-Befehl einen Access-Denied Fehler zurückgibt, ist das Objekt öffentlich nicht zugänglich.

Um öffentlichen Lesezugriff zu ermöglichen:

Erstellen Sie eine Bucket-Richtlinie, die öffentlichen Lesezugriff für alle Objekte im Bucket erlaubt.

-oder-

Verwenden Sie die Amazon-S3-Konsole, um den öffentlichen Lesezugriff für das Objekt zu ermöglichen.

Wenn Zahlung durch den Anforderer aktiviert ist, vergewissern Sie sich, dass die Anfrage den Parameter request-payer enthält

Wenn Zahlung durch den Anforderer für einen Bucket aktiviert ist, ist der anonyme Zugriff auf den Bucket nicht zulässig. Nutzer anderer Konten müssen den Parameter request-payer angeben, wenn sie Anforderungen an den Bucket senden. Andernfalls erhalten diese Benutzer einen Access-Denied-Fehler.

Wenn Sie einen Referer-Header verwenden, um den Zugriff von CloudFront auf Ihren S3-Ursprung einzuschränken, überprüfen Sie den benutzerdefinierten Header

Wenn Sie den Referer-Header verwenden, um den Zugriff von CloudFront auf den Ursprung Ihres S3-Website-Endpunkts einzuschränken, überprüfen Sie den geheimen Wert oder das Token, das in der S3-Bucket-Richtlinie festgelegt ist. Vergewissern Sie sich dann, dass der geheime Wert oder das Token mit dem Wert im benutzerdefinierten CloudFront-Header übereinstimmt.

Wenn Sie eine explizite Deny-Anweisung in der Bucket-Richtlinie verwenden, vergewissern Sie sich, dass es auch eine Allow-Anweisung gibt, die Zugriff basierend auf dem Referer-Header gewährt. Sie können keinen Zugriff nur mit einer expliziten Zugriffsverweigerungs-Anweisung gewähren.

Die folgende Bucket-Richtlinie gewährt beispielsweise Zugriff auf den S3-Ursprung, wenn die Anforderung die Zeichenfolge "aws:Referer":"MY_SECRET_TOKEN_CONFIGURED_ON_CLOUDFRONT_ORIGIN_CUSTOM_HEADER" enthält.
Die benutzerdefinierte Kopfzeile des CloudFront-Ursprungs muss wie folgt sein:

  • Kopfzeile Referent
  • Wert: MY_SECRET_TOKEN_CONFIGURED_ON_CLOUDFRONT_ORIGIN_CUSTOM_HEADER
{
  "Version":"2012-10-17",
  "Id":"http referer policy example",
  "Statement":[
    {
      "Sid":"Allow get requests originating from my CloudFront with referer header",
      "Effect":"Allow",
      "Principal":"*",
      "Action":"s3:GetObject",
      "Resource":"arn:aws:s3:::DOC-EXAMPLE-BUCKET/*",
      "Condition":{
        "StringLike":{"aws:Referer":"MY_SECRET_TOKEN_CONFIGURED_ON_CLOUDFRONT_ORIGIN_CUSTOM_HEADER"}
      }
    }
  ]
}

Hinweis: Die Beispiel-Bucket-Richtlinie gewährt öffentlichen (anonymen) Zugriff auf den Bucket, da der Prinzipal ein Platzhalterwert ist ("Principal":"*"). Aufgrund der Bedingungsanweisung wird der Zugriff auf den S3-Ursprung jedoch nur gewährt, wenn die Anfrage den Referer-Kopfzeile enthält und der Kopfzeilen-Wert mit dem Wert in der Bucket-Richtlinie übereinstimmt.

Vergewissern Sie sich, dass dem Verwaltungskonto Ihrer Organisation keine expliziten Zugriffsverweigerungsservice-Kontrollrichtlinien (SCPs) beigefügt sind

Service-Kontrollrichtlinien (SCPs) sind eine Art von Organisationsrichtlinie, mit der Sie Berechtigungen in Ihrer Organisation verwalten können. Prüfen Sie mithilfe des Verwaltungskontos Ihrer Organisation in AWS Organizations, ob eine Zugriffsverweigerungsrichtlinie (für die Aktion s3:GetObject) an das Stammverzeichnis der Organisation, an die Organisationseinheit (OU) oder direkt an Ihr AWS-Konto angefügt ist.


Relevante Informationen

Beheben von Fehlerantworten von Ihrem Ursprung aus

Wie behebe ich 403-Access-Denied-Fehler von Amazon S3?

Wie kann ich mit CloudFront eine auf Amazon S3 gehostete statische Website bereitstellen?