Sto utilizzando un endpoint del sito web di S3 come origine della distribuzione di CloudFront. Perché ricevo messaggi di errore 403 di accesso negato?

12 minuti di lettura
0

Sto utilizzando un bucket di Amazon Simple Storage Service (Amazon S3) come origine della distribuzione di Amazon CloudFront, e desidero risolvere gli errori 403.

Breve descrizione

Per risolvere problemi legati a errori di accesso negato, per prima cosa stabilisci se il nome del dominio di origine della distribuzione è un endpoint del sito web S3 o un endpoint dell'API REST S3. Quindi, se la tua distribuzione utilizza un endpoint del sito Web, controlla le sezioni relative alla risoluzione dei problemi.

Risoluzione

Determina il tipo di endpoint del nome del dominio di origine

1.    Apri la console CloudFront.

2.    Scegli la tua distribuzione CloudFront. Quindi, scegli Distribution Settings (Impostazioni di distribuzione).

3.    Scegli la scheda Origins and Origin Groups (Origini e gruppi di origini).

4.    Controlla il nome del dominio in Origin Domain Name and Path (Nome e percorso del dominio di origine). Determina il tipo di endpoint in base al formato del nome di dominio:

Gli endpoint API Rest utilizzano il seguente formato:

DOC-EXAMPLE-BUCKET.s3.amazonaws.com

Gli endpoint del sito Web utilizzano il seguente formato:

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

Nota: a seconda della Regione AWS, il formato dell'endpoint potrebbe utilizzare il formato trattino (s3-website-Region) o il formato punto (s3-website.Region). Se la distribuzione utilizza un endpoint API REST, consulta Sto usando un endpoint dell'API REST S3 come origine della mia distribuzione CloudFront. Perché ricevo messaggi di errore 403 di accesso negato?

Se la distribuzione utilizza un endpoint del sito web, verifica i requisiti indicati nelle sezioni seguenti per evitare gli errori di accesso negato.

Se usi OAI, conferma che gli oggetti nel bucket non siano crittografati da AWS KMS

Le distribuzioni CloudFront non supportano gli oggetti crittografati dal servizio di gestione delle chiavi AWS (AWS KMS) quando utilizzano l'identità di accesso origine (OAI). È necessario rimuovere la crittografia AWS KMS dagli oggetti S3 che desideri fornire utilizzando la distribuzione. Invece di utilizzare la crittografia AWS KMS, utilizza AES-256 per crittografare gli oggetti.

Determina se gli oggetti sono crittografati con AWS KMS

Per verificare se gli oggetti nel tuo bucket sono crittografati con AWS KMS:

Utilizza la console Amazon S3 per visualizzare le proprietà dell'oggetto. Controlla la finestra di dialogo Encryption (Crittografia). Se è selezionata l'opzione AWS-KMS, l'oggetto viene crittografato con AWS KMS.

-oppure-

Esegui 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.

Nota: se ricevi un messaggio di errore quando esegui comandi AWS CLI, assicurati di utilizzare la versione di AWS CLI più recente.

Modifica le impostazioni di crittografia di un oggetto

Per modificare le impostazioni di crittografia dell'oggetto utilizzando la console di Amazon S3, consulta Specifica della crittografia lato server con AWS KMS (SSE-KMS).

Per modificare le impostazioni di crittografia dell'oggetto utilizzando l'interfaccia a riga di comando di AWS, verifica innanzitutto che il bucket dell'oggetto non abbia una crittografia predefinita. Se il bucket non ha una crittografia predefinita, esegui il comando seguente per rimuovere la crittografia dell'oggetto sovrascrivendo l'oggetto. Sostituisci DOC-EXAMPLE-BUCKET con il nome del tuo bucket:

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

Attenzione: la sovrascrittura dell'oggetto rimuove le impostazioni per storage-class e website-redirect-location. Per mantenere queste impostazioni nel nuovo oggetto, assicurati di specificare esplicitamente questi valori nella richiesta di copia.

Se usi OAC, verifica che l'OAC abbia le giuste autorizzazioni

Un controllo dell'accesso origine (OAC) supporta la crittografia lato server Amazon S3 con AWS KMS. Per accedere agli oggetti S3 crittografati con AWS KMS, OAC deve avere il permesso di utilizzare la chiave AWS KMS. Per ulteriori informazioni, consulta la sezione SSE-KMS per Giving the origin access control permission to access the S3 bucket (Autorizzare il controllo dell'accesso origine per accedere al bucket S3).

Verifica che non vi sia alcun "diniego" esplicito nella policy del bucket per l'azione s3:GetObject

La policy bucket non deve avere un'istruzione di dieniego che blocchi l'accesso pubblico in lettura all'azione s3:GetObject.

Anche se disponi di un'istruzione di autorizzazione esplicita per s3:GetObject nella policy del bucket, conferma che non sia presente un'istruzione di diniego esplicita che sia in conflitto con la prima. Un'istruzione di diniego esplicita annulla sempre un'istruzione di autorizzazione esplicita.

Per rivedere la policy del bucket per s3:GetObject:

1.    Apri il tuo bucket S3 dalla console Amazon S3.

2.    Scegli la scheda Permissions (Autorizzazioni).

3.    Scegli Bucket Policy (Policy del bucket).

4.    Controlla la policy del bucket cercando le istruzioni con "Action": " s3:GetObject" o "Action": " s3:*".

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

Ad esempio, la seguente policy contiene un'istruzione di permesso esplicita per l'accesso pubblico a S3:GetObject. Tuttavia, contiene anche un'istruzione di diniego esplicita per l’accesso a s3:GetObject a meno che la richiesta non provenga da un Amazon Virtual Private Cloud (Amazon VPC) specifico. Questa policy dovrebbe essere modificata per consentire l'azione s3:GetObject.

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

La policy seguente è un esempio di policy di un bucket Amazon S3 che consente l'accesso in sola lettura a un OAC CloudFront:

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

Se la policy del bucket permette l'accesso pubblico alla lettura, conferma che l'account AWS proprietario del bucket sia anche il proprietario dell'oggetto

Per una policy di bucket che permetta l'accesso pubblico alla lettura degli oggetti, è necessario che l'account AWS proprietario del bucket sia anche proprietario dell'oggetto. Per bucket Amazon S3 esistenti, le impostazioni sono probabilmente configurate in modo predefinito in base alle di proprietà degli oggetti. Questo è l'account AWS di AWS Identity and Access Management (IAM) che ha caricato l'oggetto nel bucket.

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

Conferma che il bucket e gli oggetti abbiano lo stesso proprietario

Segui i seguenti passaggi per verificare se bucket e oggetti hanno lo stesso proprietario. Puoi anche utilizzare la console Amazon S3 per controllare i proprietari di bucket e oggetti. I proprietari si trovano nella scheda Permissions (Autorizzazioni) del rispettivo bucket o oggetto.

1.    Esegui questo comando di 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:

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

Questo esempio mostra un singolo oggetto, ma è possibile utilizzare il comando list per controllare diversi oggetti.

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

Aggiorna la proprietà degli oggetti

I proprietari di bucket possono gestire la proprietà degli oggetti con S3 Object Owndership. Per impostazione predefinita, tutti i bucket S3 nuovi hanno l'impostazione applicata dal proprietario del bucket attivata. Per aggiornare un bucket esistente, consulta Impostazione della proprietà dell'oggetto su un bucket esistente. Quando l'impostazione applicata dal proprietario del bucket è attivata, i proprietari del bucket sono i proprietari degli oggetti per tutti gli oggetti all'interno del bucket. Inoltre, quando l'impostazione applicata dal proprietario del bucket è attivata, tutti gli ACL su un bucket e sui relativi oggetti vengono disattivati.

È best practice che i proprietari dei bucket utilizzino l'impostazione applicata dal proprietario del bucket su tutti i bucket e gestiscano le autorizzazioni tramite le policy IAM e del bucket.

Per rimuovere gli ACL per il tuo bucket e assumere la proprietà di tutti gli oggetti nel bucket, esegui il seguente comando:

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

Se non desideri disattivare gli ACL sul tuo bucket S3, puoi anche cambiare il proprietario dell'oggetto in proprietario del bucket.  Per farlo, segui questi passaggi:

1.    Dall'account del proprietario dell'oggetto, esegui questo comando per recuperare le autorizzazioni ACL assegnate all'oggetto:

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

2.    Se l'oggetto ha autorizzazioni ACL bucket-owner-full-control, passa direttamente alla fase 3. Se l'oggetto non dispone di autorizzazioni ACL per il controllo completo da parte del proprietario del bucket, esegui il seguente comando dall'account del proprietario dell'oggetto. Sostituisci DOC-EXAMPLE-BUCKET con il nome del tuo bucket.

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 sovrascrivendo l'oggetto. Sostituisci DOC-EXAMPLE-BUCKET con il nome del tuo bucket.

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

Conferma che gli oggetti richiesti siano presenti nel bucket

Se un utente non ha autorizzazioni S3:ListBucket, riceverà messaggi di errore di Accesso negato per oggetti mancanti invece di messaggi di errore 404 Non trovato. Esegui il comando della AWS CLI head-object per verificare se esiste un oggetto nel bucket.

Nota: controlla che la richiesta dell'oggetto inviata a CloudFront corrisponda esattamente al nome dell'oggetto S3. I nomi degli oggetti S3 fanno distinzione fra maiuscole e minuscole. Se la richiesta non presenta il nome corretto dell'oggetto, Amazon S3 risponderà come se l'oggetto fosse mancante. Per identificare quale oggetto CloudFront sta richiedendo ad Amazon S3, utilizza i log di accesso al server.

Se ricevi un errore relativo all'oggetto root predefinito, assicurati che il nome del tuo oggetto non contenga caratteri aggiuntivi. Ad esempio, nel campoDefault Root Object (Oggetto root predefinito) deve essere immesso index.html invece di /index.html. Per ulteriori informazioni, consulta Come specificare un oggetto root predefinito.

Se l'oggetto esiste nel bucket, l'errore di accesso negato non sta nascondendo un errore 404 Non trovato. Verificare altri requisiti di configurazione per risolvere l'errore di accesso negato.

Se l'oggetto non esiste nel bucket, l'errore di Accesso negato nasconde un errore 404 Non trovato. Risolvi il problema relativo all'oggetto mancante.

Nota: non è una procedura di best practice per la sicurezza abilitare l'accesso pubblico a s3:ListBucket. L'attivazione dell'accesso pubblico a s3:ListBucket permette agli utenti di visualizzare ed elencare tutti gli oggetti presenti in un bucket. Ciò espone i dettagli dei metadati dell'oggetto (per esempio, chiave e dimensione) agli utenti anche se questi non hanno le autorizzazioni per scaricarlo.

Conferma che Amazon S3 Block Public Access sia disattivato per il bucket

Conferma che non siano state applicate impostazioni di blocco dell'accesso pubblico di Amazon S3 al bucket. Queste impostazioni possono sostituire le autorizzazioni che consentono l'accesso pubblico in lettura. Le impostazioni di blocco dell'accesso pubblico di Amazon S3 possono essere applicate a singoli bucket o account AWS.

Conferma che gli oggetti nel bucket siano accessibili al pubblico

Una distribuzione che utilizza un endpoint del sito web supporta solo contenuti pubblicamente accessibili. Per stabilire se un oggetto presente nel bucket S3 è pubblicamente accessibile, apri l'URL dell'oggetto in un browser Web. In alternativa, esegui un comando curl sull'URL.

Ad esempio:

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

Se il browser Web o il comando curl restituiscono un errore Accesso negato, allora l'oggetto non è accessibile pubblicamente.

Per consentire l'accesso pubblico in lettura:

Crea una policy del bucket che consenta l'accesso pubblico alla lettura per tutti gli oggetti nel bucket.

-oppure-

Utilizza la console Amazon S3 per consentire l'accesso pubblico in lettura per l'oggetto.

Se la funzione Requester Pays (Pagamento a carico del richiedente) è attivata, verifica che la richiesta includa il parametro request-payer

Se la funzione Requester Pays (Pagamento a carico del richiedente) è attivata per un bucket, allora l'accesso anonimo al bucket non è consentito. È necessario che gli utenti di altri account specifichino il parametro request-payer quando inviano richieste al bucket. altrimenti riceveranno un messaggio di errore di accesso negato.

Se utilizzi un'intestazione Referer per limitare l'accesso da CloudFront alla tua origine S3, controlla l'intestazione personalizzata

Se utilizzi l'intestazione Referer per limitare l'accesso da CloudFront alla tua origine dell'endpoint del sito Web S3, controlla il valore segreto o il token impostato sulla policy del bucket S3. Quindi, verifica che il valore segreto o il token corrisponda al valore nell'intestazione personalizzata di origine di CloudFront.

Se stai utilizzando un'istruzione di rifiuto esplicito nella policy del bucket, conferma che c'è anche un'istruzione di permesso che concede l'accesso in base all'intestazione Referer. Non è possibile concedere l'accesso solo con un'istruzione di rifiuto esplicita.

Per esempio, la policy del bucket seguente consente l'accesso all'origine S3 quando la richiesta contiene la stringa "aws:Referer":"MY_SECRET_TOKEN_CONFIGURED_ON_CLOUDFRONT_ORIGIN_CUSTOM_HEADER"
L'intestazione personalizzata di origine di CloudFront deve essere:

  • Intestazione: Referer
  • Valore: 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"}
      }
    }
  ]
}

Nota: la policy del bucket di esempio concede l'accesso pubblico (anonimo) al bucket perché il Principale è un valore jolly ("Principal":"*"). Tuttavia, per via dell'istruzione della condizione, l'accesso all'origine S3 è consentito solo se la richiesta include l'intestazione Referer e il valore dell'intestazione coincide con il valore presente nella policy del bucket.

Conferma che non ci siano policy di controllo dei servizi (SCP) di "diniego" esplicite collegate all'account di gestione della tua organizzazione

Le policy di controllo del servizio (SCP) sono un tipo di policy dell'organizzazione che puoi utilizzare per gestire le autorizzazioni nell'organizzazione. Utilizzo del tuo account di gestione dell'organizzazione in AWS Organizations per verificare se esiste una policy di diniego (per l'azione s3:GetObject) collegata alla root dell'organizzazione, all'unità organizzativa (OU) o direttamente al tuo account AWS.


Informazioni correlate

Risolvere i problemi relativi alle risposte agli errori dall'origine

In che modo è possibile risolvere gli errori 403 di accesso negato da Simple Storage Service (Amazon S3)?

Come posso utilizzare CloudFront per un sito web statico ospitato in Amazon S3?