Perché ho ricevuto l'errore "Access Denied" quando ho utilizzato l'endpoint di hosting di siti web statici Amazon S3?

6 minuti di lettura
0

Ho utilizzato un bucket Amazon Simple Storage Service (Amazon S3) per ospitare un sito web statico con l'endpoint di hosting di siti web statici S3. Desidero risolvere l'errore "Access Denied" che ho ricevuto dall'endpoint di hosting di siti web statici S3.

Risoluzione

Nota: se ricevi errori quando esegui i comandi dell'Interfaccia della linea di comando AWS (AWS CLI), consulta Risoluzione degli errori per AWS CLI. Inoltre, assicurati di utilizzare la versione più recente di AWS CLI.

Gli oggetti nel bucket devono essere accessibili pubblicamente

L'endpoint di un sito web statico S3 supporta solo contenuti accessibili pubblicamente. Per verificare se un oggetto nel bucket S3 è accessibile pubblicamente, apri l'URL dell'oggetto in un browser web. In alternativa, puoi eseguire un comando curl sull'URL.

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

http://doc-example-bucket.s3-website-us-east-1.amazonaws.com/index.html

Se il browser web o il comando curl restituisce un errore di Access Denied, l'oggetto non è accessibile pubblicamente. Per risolvere il problema, crea una policy del bucket che consenta l'accesso pubblico in lettura per tutti gli oggetti nel bucket.

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

Controlla se la tua policy del bucket contiene istruzioni Nega che bloccano l'accesso pubblico in lettura all'azione s3:GetObject. Anche quando hai un'istruzione Consenti esplicita per s3:GetObject inella policy del bucket, un'istruzione di diniego esplicita ha sempre la priorità su un'istruzione di consenso esplicita.

Per verificare la policy del bucket, completa i seguenti passaggi:

  1. Apri la console Amazon S3, quindi seleziona il bucket.
  2. Scegli la scheda Autorizzazioni.
  3. Nella policy del bucket, cerca le istruzioni con "Action": "s3:GetObject" or "Action": "s3:*".
  4. Se un'istruzione blocca l'accesso pubblico in lettura a s3:GetObject, modifica la policy del bucket.

L'account AWS proprietario del bucket deve essere anche proprietario dell'oggetto

Per consentire l'accesso pubblico in lettura agli oggetti, l'account AWS proprietario del bucket deve essere proprietario anche degli oggetti. L'account dell'identità AWS Identity and Access Management (AWS IAM) che ha creato il bucket o l'oggetto è proprietario del bucket o dell'oggetto.

Nota: la proprietà degli oggetti S3 non si applica all'accesso pubblico in lettura concesso dalla lista di controllo degli accessi (ACL) dell'oggetto.

Puoi utilizzare la console Amazon S3 per controllare i proprietari di bucket e oggetti. I proprietari sono indicati nella scheda Autorizzazioni del bucket o dell'oggetto.

Per utilizzare AWS CLI per verificare se lo stesso account possiede il bucket e gli oggetti Amazon S3, completa i seguenti passaggi:

  1. Per recuperare l'ID canonico S3 del proprietario del bucket, esegui il comando list-buckets:

    aws s3api list-buckets --query Owner.ID
    
  2. Per recuperare l'ID canonico S3 del proprietario dell'oggetto, esegui il comando list-objects:

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

    Nota: il comando precedente restituisce un solo oggetto. Per controllare diversi oggetti, esegui il comando list.

  3. Se gli ID canonici del proprietario del bucket e dell'oggetto non corrispondono, imposta il proprietario del bucket come proprietario dell'oggetto. Dall'account del proprietario dell'oggetto, esegui il comando get-object-acl per recuperare le autorizzazioni ACL assegnate all'oggetto:

    aws s3api get-object-acl --bucket DOC-EXAMPLE-BUCKET --key object-name
    
  4. Se l'oggetto non dispone delle autorizzazioni ACL bucket-owner-full-control, esegui il comando put-object-acl dall'account del proprietario dell'oggetto:

    aws s3api put-object-acl --bucket DOC-EXAMPLE-BUCKET --key object-name --acl bucket-owner-full-control
    
  5. Se l'oggetto dispone delle autorizzazioni ACL bucket-owner-full-control, esegui il seguente comando dall'account del proprietario del bucket:

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

    Nota: il comando precedente copia l'oggetto su se stesso e ne modifica il proprietario.

Puoi anche utilizzare la proprietà degli oggetti S3 per concedere al proprietario del bucket la proprietà automatica di qualsiasi oggetto caricato da utenti anonimi o altri account AWS.

Non puoi utilizzare la crittografia AWS KMS per gli oggetti

Il Servizio AWS di gestione delle chiavi (AWS KMS) non supporta richieste anonime. Di conseguenza, i bucket Amazon S3 che consentono l'accesso anonimo o pubblico non sono utilizzabili dagli oggetti crittografati con AWS KMS. Per eliminare la crittografia AWS KMS dagli oggetti, devi utilizzare l'endpoint del sito web statico Amazon S3.

Nota: invece della crittografia AWS KMS, utilizza la crittografia lato server con chiavi gestite da Amazon S3 per crittografare gli oggetti.

Per verificare se hai utilizzato la crittografia KMS sugli oggetti, puoi utilizzare la console Amazon S3. Nella pagina Panoramica degli oggetti , controlla se AWS-KMS è selezionato nella finestra di dialogo ** Crittografia**. Puoi anche eseguire il comando AWS CLI head-object. Se il comando restituisce server-side encryption come aws:kms, l'oggetto è crittografato con AWS KMS.

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

Per modificare le impostazioni di crittografia dell'oggetto utilizzando AWS CLI, verifica che il bucket dell'oggetto non abbia una crittografia predefinita. Se il bucket non ha una crittografia predefinita, esegui il seguente comando per copiare l'oggetto su se stesso e rimuoverne la crittografia:

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

Attenzione: Amazon S3 rimuove le impostazioni per storage-class e website-redirect-location quando copi l'oggetto su se stesso. Per mantenere queste impostazioni nel nuovo oggetto, assicurati di specificare esplicitamente i valori storage-class o website-redirect-location nella richiesta di copia.

Se hai attivato il controllo delle versioni sul bucket, la crittografia predefinita crea una nuova versione dell'oggetto quando la modifichi.

Gli oggetti richiesti devono esistere nel bucket S3

Se un utente che esegue la richiesta non dispone delle autorizzazioni s3:ListBucket, riceve un errore Access Denied per gli oggetti mancanti.

Per verificare se l'oggetto esiste nel bucket, esegui il comando AWS CLI head-object.

Nota: i nomi degli oggetti S3 fanno distinzione tra maiuscole e minuscole. Se la richiesta non ha un nome oggetto valido, Amazon S3 segnala che l'oggetto è mancante.

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

Se l'oggetto non esiste nel bucket, l'errore Access Denied maschera un errore 404 Not Found. Risolvi il problema relativo all'oggetto mancante.

Nota: è consigliabile non attivare l'accesso pubblico a s3:ListBucket. L'accesso pubblico a s3:ListBucket consente agli utenti di vedere ed elencare tutti gli oggetti in un bucket. Tale accesso espone agli utenti i dettagli dei metadati dell'oggetto, come chiave e dimensione, anche se non dispongono delle autorizzazioni per scaricare l'oggetto.

Disattiva il Blocco dell'accesso pubblico Amazon S3 sul bucket

Il Blocco dell'accesso pubblico Amazon S3 può bloccare le autorizzazioni che consentono l'accesso pubblico in lettura. Verifica non aver configurato le impostazioni del Blocco dell’accesso pubblico Amazon S3 né sull'account né sul bucket S3.

Informazioni correlate

Hosting Internal HTTPS Static Websites with Application Load Balancer, S3, and AWS PrivateLink (Hosting di siti web statici HTTPS interni con Application Load Balancer, S3 e AWS PrivateLink)