Estou usando um endpoint do site do S3 como origem de minha distribuição do CloudFront. Por que estou recebendo erros 403 Access Denied?

Última atualização: 17/02/2021

Estou usando um bucket do Amazon Simple Storage Service (Amazon S3) como origem de minha distribuição do Amazon CloudFront. Estou usando o endpoint do site estático do Amazon S3 como nome de domínio da origem. Por que o CloudFront está exibindo erros 403 Access Denied do Amazon S3?

Descrição breve

Para corrigir erros Access Denied, confirme se o nome de domínio da origem da distribuição é um endpoint do site do Amazon S3 ou um endpoint da API REST do Amazon S3. Siga estas etapas para confirmar o tipo de endpoint:

  1. Abra o console do CloudFront.
  2. Escolha a distribuição do CloudFront e selecione Distribution Settings (Configurações da distribuição).
  3. Escolha a aba Origins and Origin Groups (Origens e grupos de origens).
  4. Confirme o nome de domínio em Origin Domain Name and Path (Nome de domínio e caminho da origem) e verifique o tipo de endpoint com base no formato do nome de domínio.

Os endpoints da API REST seguem este formato:

DOC-EXAMPLE-BUCKET.s3.amazonaws.com

Observação: lembre-se de seguir as regras de nomeação de buckets do Amazon S3.

Os endpoints do site seguem este formato:

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

Observação: dependendo da região da AWS o formato do endpoint pode ser com traços (s3-website-Region) ou pontos (s3-website.Region).

Se a sua distribuição estiver usando um endpoint da API REST, consulte Estou usando um endpoint da API REST do Amazon S3 como origem de minha distribuição do CloudFront. Por que estou recebendo erros do tipo “403 Acesso recusado”?

Se a sua distribuição estiver usando um endpoint do site, verifique os seguintes requisitos para evitar esses erros:

  • Os objetos do bucket precisam ser publicamente acessíveis.
  • Os objetos do bucket não podem estar criptografados pelo AWS Key Management Service (AWS KMS).
  • A política do bucket precisa permitir o acesso a s3:GetObject.
  • Se a política do bucket conceder o acesso público de leitura, a conta que tiver o bucket também precisará ter o objeto.
  • O objeto solicitado precisa estar no bucket.
  • O Amazon S3 Block Public Access precisa estar desativado no bucket.
  • Caso a opção Requester Pays (Pagamento a cargo do solicitante) esteja habilitada, a solicitação precisará incluir o parâmetro request-payer.
  • Se você estiver usando um cabeçalho Referer para restringir o acesso do CloudFront à origem do Amazon S3, verifique o cabeçalho personalizado.

Observação: caso você não queira permitir o acesso público (anônimo) aos objetos do Amazon S3, altere a configuração para que ela use o endpoint da API REST do Amazon S3 como origem da distribuição. Depois, configure a distribuição e o bucket do S3 para restringir o acesso usando uma identidade do acesso de origem (OAI). Consulte Usar um endpoint da API REST como origem com acesso restrito por uma OAI em Como uso o CloudFront para publicar um site estático hospedado no Amazon S3?

Resolução

Os objetos do bucket precisam ser publicamente acessíveis

As distribuições que usam um endpoint do site aceitam somente conteúdo publicamente acessível. Para saber se um objeto do bucket do S3 está publicamente acessível, abra o URL do objeto em um navegador da Web. Também é possível executar um comando curl no URL.

Veja a seguir um exemplo de URL de um objeto do Amazon S3.

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

Se o navegador da Web ou comando curl exibir um erro Access Denied, será porque o objeto não está publicamente acessível.

Escolha uma das seguintes formas para permitir o acesso público de leitura do objeto:

Os objetos do bucket não podem ser criptografados pelo AWS KMS

As distribuições do CloudFront não aceitam objetos criptografados pelo AWS KMS. É preciso remover a criptografia do KMS dos objetos do Amazon S3 que você quer publicar usando a distribuição.

Observação: em vez de usar a criptografia do AWS KMS, use o AES-256 para criptografar os objetos.

Siga um destes métodos para conferir se um objeto do bucket está criptografado pelo KMS:

Para alterar as configurações de criptografia do objeto usando o console do Amazon S3, consulte Como criptografo um objeto do Amazon S3?

Para alterar as configurações de criptografia do objeto usando a AWS CLI, primeiro verifique se o bucket do objeto não tem uma criptografia-padrão. Se não tiver, execute o seguinte comando para remover a criptografia do objeto copiando o objeto e substituindo-o por ele mesmo:

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

Aviso: se você fizer isso, as configurações de storage-class e website-redirect-location serão removidas. Para preservar as configurações no objeto novo, especifique os valores de storage-class ou website-redirect-location com clareza na solicitação da cópia.

A política do bucket precisa permitir o acesso a s3:GetObject

Para usar uma distribuição com um endpoint do site do Amazon S3, a política do bucket não pode ter uma instrução de negação que proíba o acesso público de leitura da ação s3:GetObject.

Mesmo que a instrução de permissão referente a s3:GetObject seja explícita, confirme se não há uma instrução de negação explícita conflitante. As instruções de negação explícita sempre se sobrepõem às instruções de permissão explícita.

Siga estas etapas para analisar a política do bucket referente a s3:GetObject:

1.    Abra o bucket do S3 no console do Amazon S3.

2.    Escolha a aba Permissions (Permissões).

3.    Escolha Bucket Policy (Política do bucket).

4.    Verifique se na política há instruções do tipo "Action": "s3:GetObject" ou "Action": "s3:*".

O exemplo de política a seguir contém uma instrução de permissão explícita referente ao acesso público a s3:GetObject. Porém, também há uma instrução de negação explícita para s3:GetObject que bloqueia o acesso, a menos que a solicitação seja de uma Amazon Virtual Private Cloud (Amazon VPC) específica.

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

5.    Modifique a política do bucket para remover ou editar instruções que bloqueiem o acesso público de leitura de s3:GetObject.

Observação: o CloudFront armazena resultados de erros Access Denied pelo período especificado na TTL mínima de armazenamento de erros. O valor-padrão é um minuto. Depois de remover a instrução de negação da política do bucket, execute uma anulação na distribuição para remover o objeto do cache.

Se a política do bucket conceder o acesso público de leitura, a conta da AWS que tiver o bucket também precisará ter o objeto

Para que a política do bucket permita o acesso público de leitura dos objetos, a conta da AWS que tem o bucket também precisa ter os objetos. O bucket ou objeto pertence à conta da identidade do AWS Identity and Access Management (IAM) que criou o item.

Observação: o requisito object-ownership é válido para o acesso público de leitura concedido por uma política do bucket. Ele não é válido para o acesso público de leitura concedido pela lista de controle de acesso (ACL) do objeto.

Siga estas etapas para conferir se o bucket e os objetos têm o mesmo proprietário:

1.    Execute este comando na AWS CLI para obter o ID-padrão do Amazon S3 do proprietário do bucket:

aws s3api list-buckets --query Owner.ID

2.    Execute este comando para obter o ID-padrão do Amazon S3 do proprietário do objeto:

Observação: o exemplo mostra apenas um item, mas você pode usar o comando list para conferir vários objetos.

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

3.    Caso os IDs-padrão não sejam iguais, o bucket e o objeto têm proprietários diferentes.

Observação: também é possível usar o console do Amazon S3 para conferir os proprietários do bucket e do objeto. Os proprietários se encontram na aba Permissions (Permissões) do respectivo item.

Siga estas etapas para alterar o proprietário do objeto para o do bucket:

1.    Na conta do proprietário do objeto, execute este comando para ver as permissões da ACL atribuídas ao item:

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

2.    Se o objeto tiver permissões bucket-owner-full-control da ACL, pule para a etapa 3. Caso o objeto não tenha permissões bucket-owner-full-control da ACL, execute este comando na conta do proprietário do item:

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

3.    Na conta do proprietário do bucket, execute este comando para alterar o proprietário do objeto copiando o item e substituindo-o por ele mesmo:

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

Os objetos solicitados precisam estar no bucket

Se o usuário não tiver permissões s3:ListBucket, ele receberá erros Access Denied por objetos ausentes em vez de erros 404 Not Found. Execute o comando head-object na AWS CLI para conferir se há algum objeto no bucket.

Observação: confirme se a solicitação do objeto enviada para o CloudFront é exatamente igual ao nome do objeto do Amazon S3. Os nomes dos objetos do Amazon S3 diferenciam maiúsculas de minúsculas. Se a solicitação não tiver o nome correto do objeto, o Amazon S3 responderá que o item não existe. Para identificar qual objeto o CloudFront está solicitando do Amazon S3, use o registro em log de acessos ao servidor.

Caso o objeto esteja no bucket, o erro Access Denied não está encobrindo um erro 404 Not Found. Verifique outros requisitos de configuração para corrigir o erro Access Denied.

Se o objeto não está no bucket, o erro Access Denied está encobrindo um erro 404 Not Found. Solucione o problema relacionado ao objeto ausente.

Observação: permitir o acesso público a s3:ListBucket não é uma prática recomendada de segurança. A concessão do acesso público a s3:ListBucket permite que os usuários vejam e listem todos os objetos do bucket. Essa ação mostra os detalhes dos metadados do objeto (por exemplo, chave e tamanho) para os usuários mesmo que eles não tenham permissão para fazer download do item.

O Amazon S3 Block Public Access precisa estar desativado no bucket

Confirme se as configurações do Amazon S3 Block Public Access não foram aplicadas ao bucket. Elas podem prevalecer sobre as permissões de acesso público de leitura. As configurações do Amazon S3 Block Public Access podem ser aplicadas a buckets ou contas específicos da AWS.

Caso a opção Requester Pays (Pagamento a cargo do solicitante) esteja habilitada, a solicitação precisará incluir o parâmetro request-payer

Se a opção Requester Pays (Pagamento a cargo do solicitante) estiver habilitada no bucket, o acesso anônimo a ele não será permitido. Os usuários de outras contas precisarão especificar o parâmetro request-payer quando enviarem as solicitações para o bucket. Caso contrário, eles receberão um erro Access Denied.

Se você estiver usando um cabeçalho Referer para restringir o acesso do CloudFront à origem do Amazon S3, verifique o cabeçalho personalizado

Caso você esteja usando um cabeçalho Referer para restringir o acesso do CloudFront à origem do endpoint do site do Amazon S3, confira o valor ou token secreto definido na política do bucket do S3. Depois, confirme se o valor é igual ao do cabeçalho personalizado da origem do CloudFront.

Se houver uma instrução de negação explícita na política do bucket, confirme se também há uma instrução de permissão que conceda o acesso com base no cabeçalho Referer. Não é possível conceder o acesso somente com uma instrução de negação explícita.

Por exemplo, a seguinte política do bucket concede o acesso à origem do Amazon S3 quando a solicitação contém a string "aws:Referer":"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"}
      }
    }
  ]
}

Nesse exemplo, o cabeçalho personalizado da origem do CloudFront precisa ser:

  • Header (Cabeçalho): Referer
  • Value (Valor): MY_SECRET_TOKEN_CONFIGURED_ON_CLOUDFRONT_ORIGIN_CUSTOM_HEADER

Observação: a política do bucket do exemplo concede o acesso público (anônimo) ao bucket porque o Principal é um valor curinga ("Principal":"*"). Porém, devido à instrução de condição, o acesso à origem do Amazon S3 será concedido somente se a solicitação incluir o cabeçalho Referer e o valor do cabeçalho for igual ao da política do bucket.


Este artigo foi útil?


Precisa de ajuda com faturamento ou suporte técnico?