Estou usando um endpoint da API REST do S3 como origem da minha distribuição do CloudFront. Por que estou recebendo erros 403 de acesso negado?

12 minuto de leitura
0

Estou usando um bucket do Amazon Simple Storage Service (Amazon S3) como origem da minha distribuição do Amazon CloudFront. Estou usando o endpoint da API REST do S3 como nome de domínio de origem. O CloudFront está retornando erros 403 de acesso negado do Amazon S3.

Breve descrição

Para solucionar erros de acesso negado, determine se o nome de domínio de origem da sua distribuição é um endpoint de site do S3 ou um endpoint da API REST do S3. Siga estas etapas para encontrar o tipo de endpoint:

1.    Abra o console do CloudFront.

2.    Selecione sua distribuição do CloudFront. Em seguida, escolha Configurações de distribuição.

3.    Escolha a guia Origens e grupos de origem.

4.    Revise o nome do domínio em Nome e caminho do domínio de origem. Em seguida, determine o tipo de endpoint com base no formato do nome de domínio. Os endpoints da API REST usam esses formatos:

DOC-EXAMPLE-BUCKET.s3.region.amazonaws.com
DOC-EXAMPLE-BUCKET.s3.amazonaws.com

Importante: o formato bucket-name.s3.amazonaws.com não funciona para Regiões lançadas em 2019 ou posteriormente. Os endpoints de site estáticos usam este formato:

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

Se sua distribuição estiver usando um endpoint de site estático do S3, você poderá receber erros 403 de acesso negado. Para obter mais informações, consulte Estou usando um endpoint de site S3 como origem da minha distribuição do CloudFront. Por que estou recebendo erros 403 de acesso negado?

Se sua distribuição estiver usando um endpoint da API REST, verifique se suas configurações atendem aos seguintes requisitos para evitar erros de acesso negado:

  • Se você não configurar o controle de acesso de origem (OAC) ou a identidade de acesso de origem (OAI), os objetos deverão estar acessíveis ao público. Ou você deve solicitar os objetos com o AWS Signature versão 4.
  • Se o bucket do S3 contiver objetos criptografados pelo AWS Key Management Service (AWS KMS), o OAC deverá ser usado em vez do OAI.
  • A política de bucket do S3 deve permitir acesso a s3:GetObject.
  • Se a política do bucket conceder acesso, a conta da AWS que possui o bucket do S3 também deverá ser proprietária do objeto.
  • Os objetos solicitados devem existir no bucket do S3.
  • Se os clientes solicitarem a raiz da sua distribuição, você deverá definir um objeto raiz padrão.
  • Se você configurou um OAI, o OAI deve ser incluído na política de bucket do S3.
  • Se você configurou um OAC, o principal de serviço do CloudFront deverá ser incluído na política de bucket do S3. Se você configurou um OAI, o OAI deve ser incluído na sua política de bucket do S3.
  • Se você não configurar o OAC ou o OAI, o Amazon S3 Block Public Access deverá ser desativado no bucket.

Resolução

Se você não configurar o OAC ou o OAI, seus objetos deverão ser acessíveis publicamente ou solicitados com o AWS Signature versão 4.

Para determinar se os objetos em seu bucket do S3 estão acessíveis ao público, abra a URL do objeto do S3 em um navegador da web. Ou execute um comando curl na 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 de acesso negado, o objeto não estará acessível publicamente. Se o objeto não estiver acessível publicamente, use uma das seguintes configurações:

Objetos criptografados pelo AWS Key Management Service (AWS SSE-KMS)

Se o bucket s3 contiver objetos criptografados pelo AWS Key Management Service (AWS SSE-KMS), o OAC deverá ser usado em vez do OAI.

Objetos criptografados pelo AWS KMS podem ser servidos com o CloudFront configurando o OAC. Para fazer isso, adicione uma declaração à política de chaves do AWS KMS que conceda ao principal de serviço do CloudFront a permissão para usar a chave. Para servir objetos criptografados pelo AWS KMS sem configurar o OAC, forneça a chave do AWS KMS criptografada de um bucket do S3 usando o Lambda@Edge.

Use uma das seguintes maneiras de verificar se um objeto em seu bucket está criptografado pelo AWS KMS:

  • Use o console do Amazon 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 usando a AWS Command Line Interface (AWS CLI). Se o comando retornar ServerSideEncryption como aws:kms, o objeto será criptografado pelo AWS KMS. Se você receber erros ao executar comandos da AWS CLI, verifique se está usando a versão mais recente da AWS CLI.
    Observação: o OAI não oferece suporte ao serviço de objetos criptografados pelo AWS KMS.

A política de bucket do S3 deve permitir o acesso a s3:GetObject

Para usar uma distribuição com um endpoint da API REST do S3, sua política de bucket deve permitir o s3:GetObject para usuários públicos ou para o OAI do CloudFront. Mesmo que você tenha uma declaração de permissão explícita para s3:GetObject em sua política de bucket, confirme se não há uma declaração de negação explícita conflitante. Uma declaração de negação explícita sempre substitui uma declaração de permissão explícita.

Siga estas etapas para revisar sua política de bucket para s3:GetObject:

1.    Abra seu bucket do S3 a partir do console do Amazon S3.

2.    Escolha a guia Permissões.

3.    Selecione Política do bucket.

4.    Analise a política do bucket para obter declarações com “Action”: “s3:GetObject” ou “Action”: “s3:*”. O exemplo de política abaixo inclui uma declaração de permissão que concede a um OAC do CloudFront acesso ao s3:GetObject. Também inclui uma declaração que concede acesso do CloudFront OAI ao s3:GetObject e uma declaração de permissão que concede acesso público ao s3:GetObject. No entanto, há uma declaraçã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": "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"
        }
      }
    }
  ]
}

5.    Modifique a política do bucket para remover ou editar declarações que bloqueiam o acesso OAI do CloudFront ou o acesso público ao s3:GetObject

Observação: o CloudFront armazena em cache os resultados de um erro de acesso negado por até cinco minutos. Depois de remover uma declaração de negação da política de bucket, você pode executar uma invalidação em sua distribuição para remover o objeto do cache.

Propriedade de buckets e objetos do S3

Para que uma política de bucket seja aplicada a contas ou serviços externos, a conta da AWS que possui o bucket também deve possuir os objetos. Um bucket ou objeto pertence à conta da identidade do AWS Identity and Access Management (IAM) que criou o bucket ou objeto.

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

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

1.    Execute este comando da AWS CLI para obter o ID canônico S3 do proprietário do bucket:

aws s3api list-buckets --query Owner.ID

2.    Execute este comando para obter o ID canônico S3 do proprietário do objeto:

Observação: esse exemplo mostra um único objeto, mas você pode usar o comando list para verificar vários objetos.

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

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

Observação: você também pode usar o console do Amazon S3 para verificar os proprietários do bucket e do objeto. Os proprietários são encontrados na guia Permissões do respectivo bucket ou objeto.

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

1.    Na conta da AWS do proprietário do objeto, execute este comando para recuperar as permissões da lista de controle de acesso (ACL) atribuídas ao objeto:

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

2.    Se o objeto tiver permissões de ACL de controle total do proprietário do bucket, vá para a etapa nº 3. Se o objeto não tiver permissões de ACL de controle total do proprietário do bucket, execute esse comando 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 este comando para alterar o proprietário do objeto copiando o objeto sobre si mesmo:

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

Observação: certifique-se de alterar o valor --storage-class no comando de exemplo para a classe de armazenamento aplicável ao seu caso de uso.

Os objetos solicitados devem existir no bucket

Se um usuário não tiver permissões s3:ListBucket, ele receberá erros de acesso negado para objetos ausentes, em vez de erros 404 não encontrados. Execute o comando head-object da AWS CLI para verificar se existe um objeto no bucket.

Observação: confirme se a solicitação de objeto enviada ao CloudFront corresponde exatamente ao nome do objeto do S3. Os nomes dos objetos do S3 diferenciam maiúsculas de minúsculas. Se a solicitação não tiver o nome de objeto correto, o Amazon S3 responderá como se o objeto estivesse ausente. Para identificar qual objeto o CloudFront está solicitando do Amazon S3, use registro de acesso ao servidor.

Se o objeto existir no bucket, o erro de Acesso negado não está mascarando um erro 404 Não Encontrado. Verifique outros requisitos de configuração para resolver o erro de Acesso negado.

Se o objeto não estiver no bucket, o erro de Acesso negado está mascarando um erro 404 Não Encontrado. Solucione o problema relacionado ao objeto ausente.

Observação: não é uma prática recomendada de segurança permitir o acesso público ao s3:ListBucket. Permitir o acesso público ao s3:ListBucket permite que os usuários vejam e listem todos os objetos em um bucket. Isso expõe os detalhes dos metadados do objeto, como chave e tamanho, aos usuários, mesmo que eles não tenham permissões para baixar o objeto.

Se os clientes solicitarem a raiz da sua distribuição, você deverá definir um objeto raiz padrão

Se sua distribuição não tiver um objeto raiz padrão definido e um solicitante não tiver acesso ao s3:ListBucket, o solicitante receberá um erro de acesso negado. O solicitante recebe esse erro em vez do erro 404 Não encontrado quando solicita a raiz da sua distribuição.

Para definir um objeto raiz padrão, consulte Especificação de um objeto raiz padrão.

Observação: não é uma prática recomendada de segurança permitir o acesso público ao s3:ListBucket. Permitir o acesso público ao s3:ListBucket permite que os usuários vejam e listem todos os objetos em um bucket. Isso expõe os detalhes dos metadados do objeto, como chave e tamanho, aos usuários, mesmo que eles não tenham permissões para baixar o objeto.

Permissões para OAC ou OAI

Se você configurou um OAC, um principal de serviço do CloudFront deve ser incluído na política de bucket do S3. Se você configurou um OAI, o OAI deve ser incluído na sua política de bucket do s3

Para verificar se sua política de bucket permite o OAI, abra seu bucket do S3 no console do Amazon S3. Em seguida, escolha a guia Permissões e revise a política do bucket. No exemplo de política abaixo, a primeira declaração é uma declaração de permissão para o principal de serviço do CloudFront quando o OAC é configurado. A segunda declaração é uma declaração de permissão para um OAI:

{
      "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": "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 usando o console do CloudFront, siga estas etapas:

1.    Abra o console do CloudFront e escolha sua distribuição.

2.    Escolha a guia Origens e grupos de origem.

3.    Selecione a origem do S3 e, em seguida, escolha Editar.

4.    Em Restringir acesso ao bucket, escolha Sim.

5.    Para Identidade de acesso de origem, escolha a identidade existente ou crie uma nova.

6.    Em Conceder permissões de leitura no bucket, escolha Sim, atualizar política do bucket.

7.    Escolha Sim, editar.

Como permitir acesso público para distribuição sem OAC ou OAI

Se sua distribuição não estiver usando OAC ou OAI e os objetos não forem solicitados com o AWS Signature versão 4, você deverá permitir o acesso público aos objetos. Isso ocorre porque uma distribuição com um endpoint da API REST oferece suporte somente a objetos legíveis publicamente. Nesse caso, você deve confirmar que não há nenhuma configuração de acesso público em bloco do Amazon S3 aplicada ao bucket. Essas configurações substituem as permissões que permitem o acesso público de leitura. As configurações de Bloqueio de Acesso Público do Amazon S3 pode ser aplicado a buckets individuais ou contas da AWS.


Informações relacionadas

Como solucionar problemas de respostas de erro de sua origem

Como soluciono erros 403 Acesso Negado do Amazon S3?

AWS OFICIAL
AWS OFICIALAtualizada há um ano