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

9 minuto de leitura
0

Estou usando um bucket do Amazon Simple Storage Service (Amazon S3) como origem de minha distribuição do Amazon CloudFront e quero solucionar erros 403.

Resolução

Para solucionar problemas de distribuição do CloudFront com endpoints do site Amazon S3 como origem, conclua as tarefas a seguir.

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

Analise a criptografia de objetos em seu bucket

O AWS Key Management Service (AWS KMS) não oferece suporte a solicitações anônimas. Os buckets do Amazon S3 que permitem acesso anônimo ou público não aplicam esse acesso a objetos criptografados com o AWS KMS. Remova a criptografia do AWS KMS dos objetos do S3 que você deseja servir. Em vez da criptografia do AWS KMS, use o AES-256 para criptografar seus objetos.

Determine se os objetos são criptografados pelo AWS KMS

Para verificar se os objetos em seu bucket estão criptografados pelo AWS KMS, conclua as seguintes tarefas:

Visualize as propriedades do objeto no console do Amazon S3. Se AWS-KMS for selecionado na caixa de diálogo Criptografia, o objeto será criptografado pelo AWS KMS.

Ou execute a AWS CLI para executar o comando head-object. Se o comando retornar ServerSideEncryption como aws:kms, o objeto será criptografado pelo AWS KMS.

Alterar as configurações de criptografia de um objeto

Para usar o console do Amazon S3 para alterar as configurações de criptografia do objeto, consulte Especificando criptografia no lado do servidor com o AWS KMS (SSE-KMS).

Para usar a CLI da AWS para alterar as configurações de criptografia do objeto, verifique se o bucket do objeto não tem o AWS KMS como criptografia padrão. Se o bucket tiver o AWS KMS como criptografia padrão, altere a criptografia para SSE-S3.

Se o bucket não tiver criptografia padrão, execute o seguinte comando para copiar o objeto sobre si mesmo e remover a criptografia do objeto:

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

Observação: substitua DOC-EXAMPLE-BUCKET pelo nome do seu bucket. Quando você copia o objeto sobre si mesmo, a ação remove as configurações de storage-class e website-redirect-location. Para manter essas configurações no novo objeto, especifique explicitamente esses valores na solicitação de cópia.

Revise sua política de bucket

Sua política de bucket não pode ter uma declaração de negação que bloqueie o acesso público de leitura à ação s3:GetObject.

Se você tiver uma declaração de permissão explícita para s3:GetObject, certifique-se de que não haja uma declaração de negação explícita que entre em conflito com a declaração. Uma declaração de negação explícita sempre substitui uma declaração de permissão explícita.

Para revisar sua política de bucket para s3:GetObject, conclua as seguintes etapas:

  1. Abra o console do Amazon S3 e, em seguida, navegue até seu bucket do 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:*”.
  5. Modifique a política do bucket para remover ou editar declarações que bloqueiam o acesso público de leitura a s3:GetObject.

Por exemplo, a política a seguir contém uma declaração de permissão explícita para acesso público a s3:GetObject. No entanto, ela também contém uma declaração de negação explícita para acesso a s3:GetObject, a menos que a solicitação seja de uma Amazon Virtual Private Cloud (Amazon VPC) específica. Modifique essa política para permitir a ação s3:GetObject:

{
  "Version": "2012-10-17",
  "Id": "PolicyForCloudFrontPrivateContent",
  "Statement": [
    {
      "Sid": "Allow-OAI-Access-To-Bucket",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity EAF5#########"
      },
      "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"
        }
      }
    }
  ]
}

A política a seguir é um exemplo de uma política de bucket do Amazon S3 que permite acesso público somente para leitura ao endpoint do site do S3:

{
   "Version": "2012-10-17",
    "Statement": {
    "Sid": "AllowPublicReadOnly",
    "Effect": "Allow",
    "Principal": "*",
    "Action": "s3:GetObject",
    "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
  }
}

Verifique a propriedade do bucket e do objeto

Para que uma política de bucket permita o acesso público de leitura a objetos, a conta da AWS que possui o bucket também deve ser proprietária dos objetos.

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

Confirme se o bucket e os objetos têm o mesmo proprietário

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

Para usar a CLI da AWS para verificar os proprietários do bucket e do objeto, execute os seguintes comandos:

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

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: a saída do comando de exemplo anterior mostra um único objeto, mas você pode usar 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.

Atualize a propriedade do objeto

Os proprietários de buckets podem gerenciar a propriedade de objetos com a Propriedade de objeto do S3. A configuração de Propriedade de objeto do S3 é ativada por padrão para todos os novos buckets do S3. Para atualizar um bucket existente, consulte Configurar Object Ownership em um bucket existente.

É uma prática recomendada que os proprietários de buckets usem a configuração de Propriedade de objeto do S3 em todos os buckets. Além disso, é uma prática recomendada gerenciar permissões por meio de funções e políticas de bucket do AWS Identity and Access Management (IAM).

Para remover ACLs do seu bucket e se apropriar de todos os objetos no bucket, execute o comando put-bucket-ownership-controls:

aws s3api put-bucket-ownership-controls --bucket example-bucket --ownership-controls 'Rules=[{ObjectOwnership=BucketOwnerEnforced}]'

Se você não quiser desativar as ACLs em seu bucket do S3, altere o proprietário do objeto para o 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 de ACL atribuídas ao objeto:

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

    Observação: se o objeto tiver permissões de ACL bucket-owner-full-control, vá para a etapa 3.

  2. 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

    Observação: substitua DOC-EXAMPLE-BUCKET pelo nome do seu bucket. Substitua DOC-EXAMPLE-BUCKET pelo nome do seu bucket.

Revise as configurações de Bloqueio de acesso público para o bucket

Certifique-se de que nenhuma configuração de Bloqueio de acesso público do Amazon S3 seja aplicada ao bucket ou à conta. Essas configurações podem substituir as permissões que permitem o acesso público de leitura. As configurações de Bloqueio de Acesso Público do Amazon S3 podem ser aplicadas a buckets individuais ou contas da AWS.

Confirme se os objetos no bucket estão acessíveis ao público

Uma distribuição que usa um endpoint de site oferece suporte somente a conteúdo acessível ao público. Para determinar se um objeto em seu bucket do S3 está acessível ao público, abra o URL do objeto do endpoint do site do S3 em um navegador da web. Ou execute um comando curl no URL.

Exemplo:

http://DOC-EXAMPLE-BUCKET.s3-website-us-east-1.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 ao público.

Para permitir o acesso público de leitura, conclua uma das seguintes tarefas:

Analise a opção Pagamento pelo solicitante

Se Pagamento pelo solicitante estiver ativado, desative a opção. Os buckets do Pagamento pelo solicitante não permitem acesso por meio de um endpoint de site.

Revise seu cabeçalho personalizado

Se você usar o cabeçalho indicador para restringir o acesso do CloudFront à origem do endpoint do seu site S3, verifique sua política de bucket. Verifique se o valor secreto ou token definido na política de bucket do S3 corresponde ao valor no cabeçalho personalizado de origem do CloudFront.

Para usar uma declaração de negação explícita na política de bucket, deve haver uma instrução allow que conceda acesso com base no cabeçalho indicador. Você não pode conceder acesso apenas com uma declaração de negação explícita.

Por exemplo, a política de bucket a seguir concede acesso à origem do S3 quando a solicitação contém a string “aws:Referer":"MY_SECRET_TOKEN_CONFIGURED_ON_CLOUDFRONT_ORIGIN_CUSTOM_HEADER”.

O cabeçalho personalizado de origem do CloudFront deve ter as seguintes configurações:

  • Cabeçalho: indicador
  • Valor: MY_SECRET_TOKEN_CONFIGURED_ON_CLOUDFRONT_ORIGIN_CUSTOM_HEADER

Exemplo de política de bucket:

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

Observação: como Principal é um valor curinga (“Principal”:“*”), o exemplo de política de bucket concede acesso público (anônimo) ao bucket. Por causa da declaração de condição, a solicitação deve incluir o cabeçalho indicador e o valor do cabeçalho deve corresponder ao valor na política do bucket. Se a declaração de condição não for atendida, você não poderá acessar a origem do S3.

Revise a conta de gerenciamento da sua organização

Use a conta de gerenciamento da sua organização no AWS Organizations para verificar as políticas de negação de controle de serviço (SCPs). Analise as políticas de negação da ação s3:GetObject que está anexada à raiz da organização, à unidade organizacional (OU) ou diretamente à sua conta.

Informações relacionadas

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

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

Como soluciono erros 403 Acesso Negado do Amazon S3?

Como uso o CloudFront para servir um site estático hospedado no Amazon S3?

AWS OFICIAL
AWS OFICIALAtualizada há 4 meses