Sto usando un endpoint REST API S3 come origine della mia distribuzione CloudFront. Perché ricevo gli errori 403 di accesso negato?

11 minuti di lettura
0

Utilizzo un bucket Amazon Simple Storage Service (Amazon S3) come origine della mia distribuzione Amazon CloudFront. Sto usando l'endpoint di REST API S3 come nome di dominio di origine. CloudFront restituisce gli errori 403 di accesso negato di Amazon S3.

Breve descrizione

Per risolvere gli errori di accesso negato, determina se il nome di dominio di origine della tua distribuzione è un endpoint del sito Web S3 o un endpoint di REST API S3. Segui questi passaggi per trovare il tipo di endpoint:

1.    Apri la console CloudFront.

2.    Seleziona la tua distribuzione CloudFront. Quindi, scegli Impostazioni di distribuzione.

3.    Scegli la scheda Origini e gruppi di origine.

4.    Controlla il nome di dominio in Nome e percorso di dominio origine. Quindi, determina il tipo di endpoint in base al formato del nome di dominio. Gli endpoint di REST API utilizzano questi formati:

DOC-EXAMPLE-BUCKET.s3.region.amazonaws.com
DOC-EXAMPLE-BUCKET.s3.amazonaws.com

Importante: il formato bucket-name.s3.amazonaws.com non funziona per le regioni avviate nel 2019 o versioni successive. Gli endpoint del sito Web utilizzano questo formato:

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

Se la tua distribuzione utilizza un endpoint di sito Web statico S3, potresti ricevere errori 403 Access Denied. Per ulteriori informazioni, consulta Sto utilizzando un endpoint del sito web di S3 come origine della distribuzione di CloudFront. Perché ricevo gli errori 403 di accesso negato?

Se la tua distribuzione utilizza un endpoint REST API, verifica che le tue configurazioni soddisfino i seguenti requisiti per evitare errori di accesso negato:

  • Se non configuri né l’access control (OAC) all’origine né l’utilizzo di un'identità di accesso all'origine, gli oggetti devono essere accessibili al pubblico. In alternativa, è necessario richiedere gli oggetti con AWS Signature versione 4.
  • Se il bucket S3 contiene oggetti crittografati da AWS Key Management Service (AWS KMS), è necessario utilizzare OAC anziché OAI.
  • La policy del bucket S3 deve consentire l'accesso a s3:GetObject.
  • Se la policy del bucket concede l'accesso, anche l'account AWS proprietario del bucket S3 deve possedere l'oggetto.
  • Gli oggetti richiesti devono esistere nel bucket S3.
  • Se i client richiedono la radice della tua distribuzione, devi definire un oggetto root predefinito.
  • Se hai configurato un OAI, l'OAI deve essere incluso nella policy del bucket S3.
  • Se hai configurato un OAC, l'entità del servizio CloudFront deve essere inclusa nella policy del bucket S3. Se hai configurato un OAI, l'OAI deve essere incluso nella tua policy del bucket S3.
  • Se non configuri né OAC né OAI, il blocco dell'accesso pubblico Amazon S3 deve essere disattivato nel bucket.

Risoluzione

Se non configuri né OAC né OAI, i tuoi oggetti devono essere accessibili al pubblico o richiesti con AWS Signature versione 4.

Per determinare se gli oggetti nel bucket S3 sono accessibili pubblicamente, apri l'URL dell'oggetto S3 in un browser web. Oppure, esegui un comando curl sull'URL.

Di seguito è riportato un esempio di URL di un oggetto S3:

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

Se il browser Web o il comando curl restituiscono un errore di accesso negato, l'oggetto non è accessibile pubblicamente. Se l'oggetto non è accessibile pubblicamente, utilizza una delle seguenti configurazioni:

Oggetti crittografati da AWS Key Management Service (AWS SSE-KMS)

Se il bucket s3 contiene oggetti crittografati da AWS Key Management Service (AWS SSE-KMS), è necessario utilizzare OAC anziché OAI.

Gli oggetti crittografati con AWS KMS possono essere serviti con CloudFront configurando OAC. A tale scopo, aggiungi un'istruzione alla policy della chiave AWS KMS che conceda al responsabile del servizio CloudFront il permission to use the key. Per servire oggetti crittografati con AWS KMS senza configurare OAC, distribuisci la chiave AWS KMS crittografata da un bucket S3 utilizzando Lambda@Edge.

Utilizza uno dei seguenti modi per verificare se un oggetto nel tuo bucket è crittografato con AWS KMS:

  • Usa la console Amazon S3 per visualizzare le proprietà dell'oggetto. Esamina la finestra di dialogo Crittografia. Se è selezionato AWS KMS, l'oggetto è crittografato con AWS KMS.
  • In alternativa, puoi eseguire il comando head-object utilizzando l'Interfaccia della linea di comando AWS (AWS CLI). Se il comando restituisce ServerSideEncryption come aws:kms, l'oggetto è crittografato con AWS KMS. In caso di errori durante l'esecuzione dei comandi dell'Interfaccia della Linea di Comando (AWS CLI), assicurati utilizzare la versione pièu recente di AWS CLI.
    Nota: OAI non supporta la fornitura di oggetti crittografati con AWS KMS.

La policy del bucket S3 deve consentire l'accesso a s3:GetObject

Per utilizzare una distribuzione con un endpoint REST API S3, la tua policy del bucket deve consentire S3:GetObject agli utenti pubblici o all'OAI di CloudFront. Anche se hai un'istruzione di autorizzazione esplicita per S3:GetObject nella tua policy del bucket, conferma che non vi sia un'istruzione di negazione esplicita in conflitto. Un'istruzione di rifiuto esplicita ha sempre la precedenza su un'istruzione esplicita di autorizzazione.

Segui questi passaggi per rivedere la tua policy sui bucket per S3:GetObject:

1.    Apri il bucket S3 dalla console Amazon S3.

2.    Scegli la scheda Autorizzazioni.

3.    Scegli la policy del bucket.

4.    Rivedi la policy del bucket per le istruzioni con "Action": "s3:GetObject" o "Action": "s3:*". La policy di esempio riportata di seguito include un'istruzione di autorizzazione che concede a un OAC CloudFront l'accesso a s3:GetObject. Include anche una dichiarazione che concede a CloudFront OAI l'accesso a s3:GetObject e un'istruzione di autorizzazione che concede l'accesso pubblico a s3:GetObject. Tuttavia, esiste un'esplicita istruzione di rifiuto per s3:GetObject che blocca l'accesso a meno che la richiesta non provenga da uno specifico Amazon Virtual Private Cloud (Amazon VPC):

{
  "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"
        }
      }
    }
  ]
}

5.    Modifica la policy del bucket per rimuovere o modificare le istruzioni che bloccano l'accesso OAI di CloudFront o l'accesso pubblico a s3:GetObject

Nota: CloudFront memorizza nella cache i risultati di un errore di accesso negato per un massimo di cinque minuti. Dopo aver rimosso un'istruzione di rifiuto dalla policy del bucket, puoi eseguire un'invalidazione sulla tua distribuzione per rimuovere l'oggetto dalla cache.

Proprietà di bucket e oggetti S3

Affinché una policy del bucket possa essere applicata ad account o servizi esterni, anche l'account AWS proprietario del bucket deve possedere gli oggetti. Un bucket o un oggetto è di proprietà dell'account dell'identità AWS Identity and Access Management (IAM) che ha creato il bucket o l'oggetto.

Nota: il requisito della proprietà degli oggetti si applica all'accesso concesso da una policy del bucket. Non si applica all'accesso concesso dalla lista di controllo degli accessi (ACL) dell'oggetto.

Segui questi passaggi per verificare se il bucket e gli oggetti hanno lo stesso proprietario:

1.    Esegui questo comando AWS CLI per ottenere l'ID canonico S3 del proprietario del bucket:

aws s3api list-buckets --query Owner.ID

2.    Esegui questo comando per ottenere l'ID canonico S3 del proprietario dell'oggetto:

Nota: questo esempio mostra un singolo oggetto, ma è possibile utilizzare il comando elenco per controllare diversi oggetti.

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

3.    Se gli ID canonici non corrispondono, il bucket e l'oggetto hanno proprietari diversi.

Nota: puoi anche utilizzare la console Amazon S3 per controllare i proprietari di bucket e oggetti. I proprietari si trovano nella scheda Autorizzazioni del rispettivo bucket o oggetto.

Segui questi passaggi per cambiare il proprietario dell'oggetto con il proprietario del bucket:

1.    Dall'account AWS del proprietario dell'oggetto, esegui questo comando per recuperare le autorizzazioni dell'elenco di controllo degli accessi (ACL) assegnate all'oggetto:

aws s3api get-object-acl --bucket DOC-EXAMPLE-BUCKET --key object-name

2.    Se l'oggetto dispone delle autorizzazioni ACL bucket-owner-full-control, vai al passaggio 3. Se l'oggetto non dispone delle autorizzazioni ACL bucket-owner-full-control, esegui questo comando dall'account del proprietario dell'oggetto:

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

3.    Dall'account del proprietario del bucket, esegui questo comando per cambiare il proprietario dell'oggetto copiando l'oggetto su se stesso:

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

Nota: assicurati di sostituire il valore --storage-class nel comando di esempio con la classe di archiviazione applicabile a ciascun caso specifico.

Gli oggetti richiesti devono esistere nel bucket

Se un utente non dispone delle autorizzazioni s3:ListBucket, riceve gli errori di accesso negato per gli oggetti mancanti anziché gli errori 404 Not Found. Esegui il comando AWS CLI head-object per verificare se esiste un oggetto nel bucket.

Nota: verifica che la richiesta di oggetto inviata a CloudFront corrisponda esattamente al nome dell'oggetto S3. I nomi degli oggetti S3 fanno distinzione tra maiuscole e minuscole. Se la richiesta non ha il nome dell'oggetto corretto, Amazon S3 risponde come se l'oggetto fosse mancante. Per identificare quale oggetto CloudFront richiede ad Amazon S3, utilizza registrazione degli accessi al server.

Se l'oggetto esiste nel bucket, l'errore di Accesso negato non maschera un errore 404 Not Found. Controlla gli altri requisiti di configurazione per risolvere l'errore di Accesso negato.

Se l'oggetto non è nel bucket, l'errore di Accesso negato maschera un errore 404 Not Found. Risolvi il problema relativo all'oggetto mancante.

Nota: non è una best practice di sicurezza consentire l'accesso pubblico a s3:ListBucket. Consentire l'accesso pubblico a s3:ListBucket consente agli utenti di vedere ed elencare tutti gli oggetti in un bucket. Ciò espone i dettagli dei metadati dell'oggetto, come chiave e dimensione, agli utenti anche se gli utenti non dispongono delle autorizzazioni per scaricare l'oggetto.

Se i client richiedono la root della tua distribuzione, devi definire un oggetto root predefinito

Se la tua distribuzione non ha un oggetto root predefinito definito e un richiedente non dispone dell'accesso s3:ListBucket, il richiedente riceve un errore di accesso negato. Il richiedente riceve questo errore anziché un errore 404 Not Found quando richiede la root della distribuzione.

Per definire un oggetto root predefinito, consulta Specificazione di un oggetto root predefinito.

Nota: non è una best practice di sicurezza consentire l'accesso pubblico a s3:ListBucket. Consentire l'accesso pubblico a s3:ListBucket consente agli utenti di vedere ed elencare tutti gli oggetti in un bucket. Ciò espone i dettagli dei metadati dell'oggetto, come chiave e dimensione, agli utenti anche se gli utenti non dispongono delle autorizzazioni per scaricare l'oggetto.

Autorizzazioni per OAC o OAI

Se hai configurato un OAC, è necessario includere un service principale CloudFront nella policy del bucket S3. Se hai configurato un OAI, l'OAI deve essere incluso nella tua policy del bucket s3

Per verificare se la tua policy del bucket consente l'OAI, apri il bucket S3 nella console Amazon S3. Quindi, scegli la scheda Autorizzazioni e rivedi la policy del bucket. Nella politica di esempio riportata di seguito, la prima dichiarazione è un'istruzione di autorizzazione per l'entità del servizio CloudFront quando l'OAC è configurato. La seconda dichiarazione è un'istruzione di autorizzazione per un OAI:

{
      "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": "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/*"
}

Per aggiornare la tua policy sui bucket utilizzando la console CloudFront, segui questi passaggi:

1.    Apri la console CloudFront, quindi scegli la tua distribuzione.

2.    Scegli la scheda Origini e gruppi di origine.

3.    Seleziona l'origine S3, quindi scegli Modifica.

4.    Per Accesso limitato al bucket, scegli .

5.    Per Identità di accesso origine, scegli l'identità esistente o creane una nuova.

6.    Per Concedi autorizzazioni di lettura su bucket, scegli Sì, Aggiorna policy bucket.

7.    Scegli Sì, modifica.

Consentire l'accesso pubblico per la distribuzione senza OAC o OAI

Se la tua distribuzione non utilizza OAC o OAI e gli oggetti non sono richiesti con AWS Signature versione 4, devi consentire l'accesso pubblico agli oggetti. Questo perché una distribuzione con un endpoint REST API supporta solo oggetti leggibili pubblicamente. In questo caso, devi confermare che al bucket non siano applicate impostazioni di blocco dell'accesso pubblico Amazon S3. Queste impostazioni possono sovrascrivere le autorizzazioni che consentono l'accesso pubblico in lettura. Il blocco dell'accesso pubblico Amazon S3 può essere applicato a singoli bucket o account AWS.


Informazioni correlate

Troubleshooting error responses from your origin

Come posso risolvere gli errori 403 di Accesso negato da Amazon S3?

AWS UFFICIALE
AWS UFFICIALEAggiornata un anno fa