Estou usando o recurso de site estático do Amazon S3, mas recebo um erro de acesso negado. Por que isto está acontecendo?

Data da última atualização: 22-12-2021

Estou usando um bucket do Amazon Simple Storage Service (Amazon S3) para hospedar um site estático com o endpoint de site estático do S3. Por que estou recebendo um erro de acesso negado?

Breve descrição

Se você estiver tentando hospedar um site estático usando o Amazon S3, mas estiver recebendo um erro de Access Denied (Acesso negado), verifique os seguintes requisitos:

  • Os objetos do bucket precisam ser acessíveis publicamente.
  • A política de bucket do S3 deve permitir o acesso à ação s3:GetObject.
  • A conta da AWS que possui o bucket também deve ser proprietária do objeto.
  • Os objetos não podem ser criptografados pelo AWS Key Management Service (AWS KMS).
  • Os objetos solicitados devem existir no bucket do S3.
  • O bloqueio de acesso público do Amazon S3 deve ser desabilitado no nível do bucket e da conta.

Resolução

Os objetos do bucket precisam ser acessíveis publicamente

O endpoint de site estático do S3 oferece suporte apenas a conteúdo acessível publicamente. Para verificar se um objeto em seu bucket do S3 está acessível publicamente, abra o URL do objeto em um navegador da Web. Como alternativa, você pode executar um comando cURL no URL.

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

http://doc-example-bucket.s3-website-us-east-1.amazonaws.com/index.html
Se um erro de Access Denied (Acesso negado) for retornado pelo navegador da Web ou pelo comando cURL, o objeto não estará acessível publicamente. Para permitir o acesso público de leitura ao objeto do S3, crie uma política de bucket que permita o acesso público de leitura a todos os objetos no bucket.

A política do bucket do S3 precisa permitir o acesso à ação s3:GetObject

Revise sua política de bucket e verifique se não há nenhuma instrução de negação que bloqueie o acesso público de leitura à ação s3:GetObject. Mesmo que você tenha uma instrução de permissão explícita para s3:GetObject em sua política de bucket, confirme se não há uma instrução de negação explícita conflitante. Uma instrução de negação explícita sempre substituirá uma instrução de permissão explícita.

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

1.    Abra o console do Amazon S3.

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

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

4.    Revise a política de bucket para ver se há instruções com “Ação”: “s3:GetObject” ou “Ação”: “s3:*”.

5.    (Opcional) Modifique a política de bucket. Por exemplo, você pode remover ou editar instruções que bloqueiam o acesso público de leitura a s3:GetObject.

A conta da AWS que possui o bucket também deve ser proprietária do objeto

Para permitir o acesso público de leitura aos objetos, 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 o objeto.

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

Para verificar se o bucket e os objetos do Amazon S3 pertencem à mesma conta da AWS, execute as seguintes etapas:

1.    Para recuperar o ID canônico do S3 do proprietário do bucket, use o seguinte comando:

aws s3api list-buckets --query Owner.ID

2.    Para recuperar o ID canônico do S3 do proprietário do objeto, use o seguinte comando:

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

Observação: este exemplo mostra um único objeto. Para verificar vários objetos, use o comando list.

3.    Confirme se os IDs canônicos do proprietário do bucket e do proprietário do objeto são correspondentes. Se eles não coincidirem, é porque o bucket e o objeto têm proprietários distintos.

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 Permissions (Permissões) do respectivo bucket ou objeto.

4.    Se os IDs canônicos do bucket e do proprietário do objeto não coincidirem, altere o proprietário do objeto para o proprietário do bucket.

Na conta do proprietário do objeto, execute o seguinte comando para recuperar as permissões da ACL atribuídas ao objeto:

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

Se o objeto não tiver as permissões bucket-owner-full-control da ACL, execute o seguinte 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

Se o objeto tiver as permissões  bucket-owner-full-control da ACL, execute o seguinte comando na conta do proprietário do bucket. Esse comando altera 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

Você também pode usar a propriedade de objeto do S3 para conceder ao proprietário do bucket a propriedade automática de quaisquer objetos carregados por usuários anônimos ou outras contas da AWS.

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

O AWS KMS não oferece suporte a solicitações anônimas. Como resultado, qualquer bucket do Amazon S3 que permita acesso anônimo ou público não se aplicará a objetos criptografados com o AWS KMS. Você deve remover a criptografia do KMS dos objetos que deseja atender usando o endpoint de site estático do Amazon S3.

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

Você pode verificar se um objeto em seu bucket está criptografado pelo KMS usando os seguintes métodos:

  • Use o console do Amazon S3 para visualizar as propriedades do objeto. Revise a caixa de diálogo Encryption (Criptografia). Se o AWS-KMS for selecionado, o objeto será criptografado pelo 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 KMS.

Observação: se você receber erros ao executar comandos da AWS CLI, verifique se está usando a versão mais recente da AWS CLI.

Para alterar as configurações de criptografia do objeto usando o console do Amazon S3, consulte Especificação da criptografia do Amazon S3.

Para alterar as configurações de criptografia do objeto usando a AWS CLI, verifique se o bucket do objeto não tem criptografia padrão. Se o bucket não tiver criptografia padrão, remova a criptografia do objeto copiando o objeto sobre ele mesmo:

 

aws s3 cp s3://DOC-EXAMPLE-BUCKET/index.html s3://DOC-EXAMPLE-BUCKET/index.html --storage-class STANDARD
Aviso: copiar o objeto sobre ele mesmo remove as configurações de storage-class e website-redirect-location. Para manter essas configurações no novo objeto, especifique explicitamente os valores storage-class ou website-redirect-location na solicitação de cópia.

Os objetos solicitados devem existir no bucket do S3

Se um usuário que executa a solicitação não tiver permissões s3:ListBucket, o usuário receberá um erro de Access Denied ( Acesso negado) para objetos ausentes.

Você pode executar o comando head-object da AWS CLI para verificar se existe um objeto no bucket.

Observação: os nomes de objeto do S3 diferenciam maiúsculas de minúsculas. Se a solicitação não tiver um nome de objeto válido, o Amazon S3 informará que o objeto está ausente.

Se o objeto existir no bucket, o erro Access Denied (Acesso negado) não estará mascarando um erro 404 Not Found (404 Não encontrado). Verifique outros requisitos de configuração para resolver o erro Access Denied (Acesso negado).

Se o objeto não existir no bucket, o erro Access Denied (Acesso negado) estará mascarando um erro 404 Not Found (404 Não encontrado). Solucione o problema relacionado ao objeto ausente.

Observação: não é uma prática recomendada de segurança habilitar o acesso público s3:ListBucket. Habilitar o acesso público s3:ListBucket permite que os usuários vejam e listem todos os objetos de um bucket. Esse acesso 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 baixar o objeto.

O bloqueio de acesso público do Amazon S3 precisa estar desabilitado no bucket

As configurações de bloqueio de acesso público do Amazon S3 podem ser aplicadas a buckets individuais ou contas da AWS. Confirme se não há configurações de bloqueio de acesso público do Amazon S3 aplicadas ao bucket do S3 ou à conta da AWS. Essas configurações podem substituir as permissões que permitem o acesso público de leitura.


Este artigo ajudou?


Precisa de ajuda com faturamento ou suporte técnico?