Salta al contenuto

Perché ricevo l'errore "403 Access Denied" quando utilizzo l'endpoint di una REST API S3 come origine della mia distribuzione CloudFront?

8 minuti di lettura
0

Desidero risolvere gli errori "403 Access Denied" restituiti da Amazon CloudFront da Amazon Simple Storage Service (Amazon S3).

Breve descrizione

Per evitare errori "Access Denied", utilizza le seguenti configurazioni:

  • Rendi gli oggetti S3 accessibili pubblicamente.
  • Utilizza il controllo dell'accesso origine (OAC) per i bucket S3 che contengono oggetti crittografati lato server con il Servizio di gestione delle chiavi AWS (AWS KMS).
    Nota: è necessario utilizzare OAC anziché l'identità di accesso origine (OAI). perché OAI non fornisce oggetti crittografati di AWS KMS.
  • Modifica la policy del bucket S3 in modo che consenta l'accesso a s3:GetObject.
  • Assicurati che l'account AWS proprietario del bucket S3 sia anche proprietario dell'oggetto.
  • Verifica che gli oggetti richiesti esistano nel bucket S3.
  • Definisci un oggetto root predefinito in modo che i client possano richiedere la root della distribuzione.
  • Per una configurazione OAI, devi includere OAI nella policy del bucket S3. Per una configurazione OAC, devi includere il principale del servizio CloudFront nella policy del bucket 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.

Rendi gli oggetti S3 accessibili pubblicamente

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 restituisce un errore "Access Denied", l'oggetto non è accessibile pubblicamente.

Per rendere l'oggetto accessibile pubblicamente, effettua una delle seguenti azioni:

Utilizza OAC per oggetti crittografati con AWS KMS

Per utilizzare OAC, aggiungi un'istruzione alla policy delle chiavi di AWS KMS che conceda al principale del servizio CloudFront l'autorizzazione all'uso della chiave. Puoi anche utilizza Lambda@Edge al posto di OAC. Per ulteriori informazioni, consulta Serving SSE-KMS encrypted content from S3 using CloudFront (Come fornire contenuti crittografati SSE-KMS da S3 utilizzando CloudFront).

Per verificare di aver crittografato l'oggetto con AWS KMS, intraprendi una delle seguenti azioni:

  • Utilizza la console S3 per visualizzare le proprietà dell'oggetto. Esamina la finestra di dialogo Crittografia. Se è selezionato AWS KMS, l'oggetto è crittografato con AWS KMS.
  • Esegui il comando head-object. Se il comando restituisce ServerSideEncryption come aws:kms, ciò significa che l'oggetto è crittografato con AWS KMS.

Consenti l'accesso a S3:getObject

Anche se hai un'istruzione Allow esplicita per s3:GetObject nella policy del bucket, verifica che non ci siano conflitti con un'istruzione Deny esplicita. Un'istruzione Deny esplicita ha la precedenza su un'istruzione Allow esplicita. Per ulteriori informazioni sulle istruzioni Deny e Allow, consulta Logica di valutazione delle policy.

Per verificare che la policy del bucket consenta s3:GetObject e nessuna dichiarazione Deny esplicita, completa i seguenti passaggi:

  1. Apri la console Amazon S3.

  2. Seleziona il bucket.

  3. Scegli la scheda Autorizzazioni.

  4. Scegli Policy bucket.

  5. Controlla le istruzioni con "Action": "s3:GetObject" o "Action": "s3:*".
    Il seguente esempio di policy include istruzioni Allow che concedono l'accesso OAC e OAI di CloudFront a s3:GetObject. Include anche un'istruzione Allow che concede l'accesso pubblico a s3:GetObject. Tuttavia, esiste un'esplicita istruzione Deny 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"  
            }  
          }  
        }  
      ]  
    }
  6. Modifica la policy del bucket per rimuovere o modificare le istruzioni che bloccano l'accesso OAI o OAC di Cloudfront oppure l'accesso pubblico a s3:GetObject.

**Nota:**CloudFront memorizza nella cache i risultati di un errore di "Access Denied" per un massimo di 5 minuti. Dopo aver rimosso un'istruzione Deny dalla policy del bucket, puoi eseguire un'invalidazione sulla distribuzione per rimuovere l'oggetto dalla cache.

Concedi la proprietà di bucket e oggetti S3

Verifica che l'account dell'identità AWS Identity and Access Management (AWS IAM) che ha creato il bucket o l'oggetto sia il proprietario del bucket o dell'oggetto.

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

Per verificare se il bucket e gli oggetti hanno lo stesso proprietario, completa i seguenti passaggi:

  1. Esegui il comando list-buckets per ottenere l'ID canonico S3 del proprietario del bucket:

    aws s3api list-buckets --query Owner.ID
  2. Esegui il comando list-objects per ottenere l'ID canonico S3 del proprietario dell'oggetto:

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

    Nota: l'esempio di comando precedente mostra un singolo oggetto, ma è possibile eseguire il comando list-objects per controllare diversi oggetti.

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 sono indicati nella scheda Autorizzazioni del bucket o dell'oggetto.

Per fare in modo che il proprietario del bucket diventi il proprietario dell'oggetto, completa i seguenti passaggi:

  1. Dall'account del proprietario dell'oggetto, esegui il comando get-object-acl per recuperare le autorizzazioni ACL:

    aws s3api get-object-acl --bucket DOC-EXAMPLE-BUCKET --key object-name
  2. Se l'oggetto ha le autorizzazioni ACL bucket-owner-full-control, procedi al passaggio 3. Se l'oggetto non ha le 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
  3. Dall'account del proprietario del bucket, esegui questo comando per copiare l'oggetto su se stesso e modificarne:

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

    Nota: sostituisci --storage-class con la tua classe di storage.

Sposta gli oggetti nel bucket

Per verificare se un oggetto esiste nel bucket, esegui il comando head-object.

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

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 è nel bucket, l'errore "Access Denied" maschera un l'errore "404 Not Found". Devi risolvere il problema relativo all'oggetto mancante.

Definisci un oggetto root predefinito

Per definire un oggetto root predefinito, consulta Specificare un oggetto root predefinito.

Nota: per motivi di sicurezza, è consigliabile negare l'accesso pubblico a s3:ListBucket. Se consenti l'accesso pubblico a s3:ListBucket, gli utenti possono visualizzare ed elencare tutti gli oggetti contenuti in un bucket. Pertanto, i dettagli dei metadati degli oggetti (ad esempio, chiave e dimensione) sono visibili a tutti gli utenti.

Aggiungi le autorizzazioni del principale del servizio CloudFront o OAI alla policy del bucket S3

Per verificare se la policy del bucket consente OAI, apri la console Amazon S3. Individua il bucket, quindi, nella scheda Autorizzazioni, scegli Policy bucket.

Il seguente esempio di policy include un'istruzione Allow per il principale del servizio CloudFront quando configuri OAC:

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

    }  
     }  
      }

Il seguente esempio di policy include un'istruzione Allow per 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/*"  
}

Per aggiornare la policy del bucket dalla console CloudFront, completa i seguenti passaggi:

  1. Apri la console CloudFront.
  2. Seleziona la distribuzione.
  3. Scegli la scheda Origins and Origin Groups (Origini e gruppi di origine).
  4. Seleziona l'origine S3, quindi scegli Modifica.
  5. Per Restrict Bucket Access (Limita l'accesso al bucket), scegli .
  6. Per Origin Access Identity (Identità di accesso origine), scegli un'identità esistente o creane una nuova.
  7. Per Grant read permissions on bucket (Concedi autorizzazioni di lettura su bucket), scegli Yes, update bucket policy (Sì, aggiorna policy bucket).
  8. Scegli Yes, edit (Sì, modifica).

Informazioni correlate

Risoluzione dei problemi relativi ai codici di stato della risposta agli errori in CloudFront

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

Perché ricevo l'errore “403 access denied” quando utilizzo un endpoint del sito Web Amazon S3 come origine della distribuzione CloudFront?