Ir para o conteúdo

Estou usando um endpoint do S3 API REST como origem de minha distribuição do CloudFront. Por que estou recebendo erros "403 Access Denied" (Acesso negado)?

9 minuto de leitura
0

Quero solucionar os erros "403 Access Denied" que o Amazon CloudFront retorna do Amazon Simple Storage Service (Amazon S3).

Breve descrição

Para evitar erros "Access Denied", use as seguintes configurações:

  • Torne os objetos do S3 acessíveis ao público.
  • Use o controle de acesso de origem (OAC) para buckets do S3 que contêm objetos criptografados no lado do servidor com o AWS Key Management Service (AWS KMS).
    Observação: você deve usar o OAC em vez da identidade do acesso de origem (OAI) porque este não atende a objetos criptografados do AWS KMS.
  • Modifique a política de bucket do S3 para que ela permita o acesso a s3:GetObject.
  • Certifique-se de que a conta da AWS que possui o bucket do S3 também seja proprietária do objeto.
  • Confirme se os objetos solicitados existem no bucket do S3.
  • Defina um objeto raiz padrão para que os clientes possam solicitar a raiz da sua distribuição.
  • Para uma configuração de OAI, você deve incluir a OAI na política de bucket do S3. Para uma configuração de OAC, você deve incluir a entidade principal de serviço do CloudFront na política de bucket do S3.

Resolução

Observação: se você receber erros ao executar comandos da AWS Command Line Interface (AWS CLI), consulte Solução de problemas da AWS CLI. Além disso, verifique se você está usando a versão mais recente da AWS CLI.

Tornar os objetos do S3 acessíveis ao público

Para determinar se os objetos em seu bucket do S3 estão acessíveis ao público, abra o URL do objeto do S3 em um navegador da web. Ou execute um comando curl no URL.

Veja a seguir um exemplo de URL de um objeto do S3:

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

Se o navegador da web ou o comando curl retornarem um erro "Access Denied", o objeto não estará acessível publicamente.

Para tornar o objeto acessível ao público, execute uma das seguintes ações:

Usar o OAC para objetos criptografados pelo AWS KMS

Para usar o OAC, adicione uma declaração à política de chave do AWS KMS que conceda à entidade principal de serviço do CloudFront a permissão para usar a chave. Também é possível usar o Lambda@Edge em vez do OAC. Para obter mais informações, consulte Atender a conteúdos criptografados com SSE-KMS do S3 usando o CloudFront.

Para confirmar que você criptografou seu objeto com o AWS KMS, execute uma das seguintes ações:

  • Use o console do S3 para visualizar as propriedades do objeto. Revise a caixa de diálogo Criptografia. Se o AWS KMS for selecionado, o objeto será criptografado pelo AWS KMS.
  • Execute o comando head-object. Se o comando retornar ServerSideEncryption como aws:kms, o objeto será criptografado pelo AWS KMS.

Permitir acesso a s3:GetObject

Mesmo que você tenha uma declaração Allow explícita para s3:GetObject em sua política de bucket, confirme se não há conflito com uma declaração de negação explícita. Uma declaração Deny explícita substitui uma declaração Allow explícita. Para obter mais informações sobre instruções Deny e Allow, consulte Lógica da avaliação de política.

Para confirmar se sua política de bucket permite s3:GetObject e nenhuma declaração Deny explícita, conclua as seguintes etapas:

  1. Abra o console do Amazon S3.

  2. Selecione seu bucket.

  3. Escolha a guia Permissões.

  4. Selecione a Política de bucket.

  5. Verifique se há declarações com "Action": "s3:GetObject" ou "Action": "s3:*".
    O exemplo de política a seguir inclui instruções Allow que concedem ao CloudFront OAC e CloudFront OAI acesso a s3:GetObject. Além disso, inclui uma declaração Allow que concede acesso público a s3:GetObject. No entanto, há uma declaração Deny 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": "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. Modifique a política de bucket para remover ou editar declarações que bloqueiam CloudFront OAI, CloudFront OAC ou o acesso público a s3:GetObject.

Observação: o CloudFront armazena em cache os resultados do erro "Access Denied" por até 5 minutos. Depois de remover uma declaração Deny da política de bucket, é possível executar uma invalidação em sua distribuição para remover o objeto do cache.

Propriedade de concessão de buckets e objetos do S3

Verifique se a conta da identidade do AWS Identity and Access Management (AWS IAM) que criou o bucket ou objeto é proprietária do bucket ou objeto.

Observação: o requisito de propriedade do objeto se aplica somente ao acesso público de leitura concedido por uma política de bucket. Ela não se aplica ao acesso concedido pela lista de controle de acesso (ACL) do objeto.

Para verificar se o bucket e os objetos têm o mesmo proprietário, conclua as seguintes etapas:

  1. Execute o comando list-buckets para obter o ID canônico do S3 do proprietário do bucket:

    aws s3api list-buckets --query Owner.ID
  2. Execute o comando list-objects para obter o ID canônico do S3 do proprietário do objeto:

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

    Observação: o comando de exemplo anterior mostra um único objeto, mas é possível executar o comando list-objects para verificar vários objetos.

Se os IDs canônicos não corresponderem, o bucket e o objeto terão proprietários diferentes.

Observação: também é possível usar o console do Amazon S3 para verificar os proprietários do bucket e do objeto. É possível encontrar os proprietários na guia Permissões do bucket ou objeto.

Para alterar o proprietário do objeto para proprietário do bucket, conclua as seguintes etapas:

  1. Na conta do proprietário do objeto, execute o comando get-object-acl para recuperar as permissões da ACL:

    aws s3api get-object-acl --bucket DOC-EXAMPLE-BUCKET --key object-name
  2. Se o objeto tiver permissões de ACL bucket-owner-full-control, vá para a etapa 3. Se o objeto não tiver permissões de ACL bucket-owner-full-control, execute o comando put-object-acl na conta do proprietário do objeto:

    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 o seguinte comando para copiar o objeto sobre si mesmo e alterar o proprietário do objeto:

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

    Observação: substitua --storage-class pela sua classe de armazenamento.

Mover os objetos para o bucket

Para verificar se há um objeto no bucket, execute o comando head-object.

Observação: os nomes dos objetos do S3 diferenciam maiúsculas de minúsculas. Confirme se a solicitação de objeto enviada ao CloudFront corresponde ao nome do objeto do S3. Se a solicitação não tiver o nome de objeto correto, o Amazon S3 responderá como se o objeto estivesse ausente. Para identificar o objeto que o CloudFront solicita do Amazon S3, use o registro em log de acesso ao servidor.

Se o objeto existir no bucket, o erro "Access Denied" não mascara o erro "404 Not Found". Verifique outros requisitos de configuração para resolver o erro "Access Denied".

Se o objeto não estiver no bucket, o erro "Access Denied" mascara o erro "404 Not Found". É preciso solucionar o problema relacionado ao objeto ausente.

Definir um objeto raiz padrão

Para definir um objeto raiz padrão, consulte Especificar um objeto raiz padrão.

Observação: é uma prática recomendada de segurança negar o acesso público de s3:ListBucket. Se você permitir o acesso público de s3:ListBucket, os usuários poderão ver e listar todos os objetos em um bucket. Isso expõe os detalhes dos metadados do objeto, como chave e tamanho, para todos os usuários.

Adicione as permissões da entidade principal do serviço OAI ou do CloudFront na política de bucket do S3

Para verificar se sua política de bucket permite a OAI, abra o console do Amazon S3. Encontre seu bucket e, em seguida, na guia Permissões, escolha Política de bucket.

O exemplo de política a seguir inclui uma declaração Allow para a entidade principal de serviço do CloudFront quando você configura o 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"  

    }  
     }  
      }

O exemplo de política a seguir inclui uma declaração Allow para 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/*"  
}

Para atualizar sua política de bucket no console do CloudFront, conclua as seguintes etapas:

  1. Abra o console do CloudFront.
  2. Selecione sua distribuição.
  3. Escolha a guia Origens e grupos de origem.
  4. Selecione a origem do S3 e, em seguida, escolha Editar.
  5. Em Restringir acesso ao bucket, escolha Sim.
  6. Para Identidade do acesso de origem, escolha uma identidade ou crie uma nova.
  7. Em Conceder permissões de leitura no bucket, escolha Sim, atualizar política de bucket.
  8. Escolha Sim, editar.

Informações relacionadas

Solucionar problemas de códigos de status de resposta de erros no CloudFront

Como solucionar os erros 403 de Acesso Negado do Amazon S3?

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