Restringir o acesso a uma origem do Amazon Simple Storage Service - Amazon CloudFront

Restringir o acesso a uma origem do Amazon Simple Storage Service

O CloudFront fornece duas maneiras para enviar solicitações autenticadas a uma origem do Amazon S3: controle de acesso à origem (OAC) e identidade do acesso de origem (OAI). O OAC ajuda a proteger suas origens, assim como no Amazon S3. Recomendamos o uso do OAC porque ele é compatível com:

  • Todos os buckets do Amazon S3 em todas as Regiões da AWS; por exemplo, regiões opcionais lançadas após dezembro de 2022.

  • Criptografia do lado do servidor com o AWS KMS (SSE-KMS) do Amazon S3

  • Solicitações dinâmicas (PUT e DELETE) para o Amazon S3

A identidade do acesso de origem (OAI) não funciona para cenários na lista anterior, ou exige outras soluções alternativas nesses casos. Os tópicos a seguir descrevem como usar o controle de acesso de origem (OAC) com uma origem do Amazon S3. Para obter informações sobre como migrar da identidade do acesso de origem (OAI) para o controle de acesso de origem (OAC), consulte Migrar da identidade do acesso de origem (OAI) para o controle de acesso à origem (OAC).

Observações
  • Ao usar o CloudFront OAC com origens de bucket do Amazon S3, você deve definir a Propriedade de objeto do Amazon S3 como Proprietário do bucket aplicado, o padrão para novos buckets do Amazon S3. Se você precisar de ACLs, use a configuração Proprietário do bucket preferido para manter o controle sobre os objetos enviados via CloudFront.

  • Se usar um bucket do Amazon S3 configurado como um endpoint de site, você deverá configurá-lo com o CloudFront como uma origem personalizada. Isso significa que você não pode usar o OAC (nem a OAI). O OAC não é compatível com o redirecionamento de origem usando o Lambda@Edge.

Tópicos

Criar um controle de acesso à origem

Conclua as etapas descritas nos tópicos a seguir para configurar um novo controle de acesso à origem no CloudFront.

Pré-requisitos

Antes de criar e configurar o controle de acesso à origem (OAC), você deve ter uma distribuição do CloudFront com uma origem de bucket do Amazon S3. Essa origem deve ser um bucket normal do S3, não um bucket configurado como endpoint de site. Para obter mais informações sobre como configurar uma distribuição do CloudFront com uma origem de bucket do S3, consulte Conceitos básicos de uma distribuição básica do CloudFront.

nota

Ao usar o OAC para proteger sua origem de bucket do S3, a comunicação entre o CloudFront e o Amazon S3 é sempre por meio de HTTPS, independentemente de suas configurações específicas.

Conceder permissão ao controle de acesso à origem para acessar o bucket do S3

Antes de criar um controle de acesso à origem (OAC) ou configurá-lo em uma distribuição do CloudFront, verifique se o OAC tem permissão para acessar a origem do bucket do S3. Faça isso depois de criar uma distribuição do CloudFront, mas antes de adicionar o OAC à origem do S3 na configuração de distribuição.

Para conceder permissão ao OAC para acessar o bucket do S3, use uma política de bucket do S3 para possibilitar que a entidade principal de serviço do CloudFront (cloudfront.amazonaws.com) acesse o bucket Use um elemento Condition na política para permitir que o CloudFront acesse o bucket somente quando a solicitação for em nome da distribuição do CloudFront que contém a origem do S3.

Para obter informações sobre como adicionar ou modificar uma política de bucket, consulte Adicionar uma política de bucket usando o console do Amazon S3 no Guia do usuário do Amazon S3.

Veja a seguir exemplos de políticas de bucket do S3 que permitem que um OAC do CloudFront acesse uma origem do S3.

exemplo Política de bucket do S3 que permite acesso somente leitura a um OAC do CloudFront
{ "Version": "2012-10-17", "Statement": { "Sid": "AllowCloudFrontServicePrincipalReadOnly", "Effect": "Allow", "Principal": { "Service": "cloudfront.amazonaws.com" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::<S3 bucket name>/*", "Condition": { "StringEquals": { "AWS:SourceArn": "arn:aws:cloudfront::111122223333:distribution/<CloudFront distribution ID>" } } } }
exemplo Política de bucket do S3 que permite acesso de leitura e gravação a um OAC do CloudFront
{ "Version": "2012-10-17", "Statement": { "Sid": "AllowCloudFrontServicePrincipalReadWrite", "Effect": "Allow", "Principal": { "Service": "cloudfront.amazonaws.com" }, "Action": [ "s3:GetObject", "s3:PutObject" ], "Resource": "arn:aws:s3:::<S3 bucket name>/*", "Condition": { "StringEquals": { "AWS:SourceArn": "arn:aws:cloudfront::111122223333:distribution/<CloudFront distribution ID>" } } } }

SSE-KMS

Se os objetos na origem do bucket do S3 forem criptografados usando criptografia do lado do servidor com o AWS Key Management Service (SSE-KMS), o OAC deverá ter permissão para usar a chave do AWS KMS. Para conceder permissão ao OAC para usar a chave do KMS, adicione uma instrução à política de chaves do KMS. Para obter informações sobre como modificar uma política de chaves, consulte Alterar uma política de chaves no Guia do desenvolvedor do AWS Key Management Service.

O exemplo a seguir mostra uma declaração de política de chaves do KMS que permite ao OAC usar a chave do KMS.

exemplo Declaração de política de chaves do KMS que permite a um OAC do CloudFront acessar uma chave KMS para o SSE-KMS
{ "Sid": "AllowCloudFrontServicePrincipalSSE-KMS", "Effect": "Allow", "Principal": { "Service": [ "cloudfront.amazonaws.com" ] }, "Action": [ "kms:Decrypt", "kms:Encrypt", "kms:GenerateDataKey*" ], "Resource": "*", "Condition": { "StringEquals": { "AWS:SourceArn": "arn:aws:cloudfront::111122223333:distribution/<CloudFront distribution ID>" } } }

Criar o controle de acesso à origem

Para criar um controle de acesso à origem (OAC), você pode usar o AWS Management Console, o AWS CloudFormation, a AWS CLI ou a API do CloudFront.

Console
Como criar um controle de acesso à origem
  1. Faça login no AWS Management Console e abra o console do CloudFront em https://console.aws.amazon.com/cloudfront/v4/home.

  2. No painel de navegação, selecione Origem access (Acesso à origem).

  3. Selecione Create control setting (Criar configuração de controle).

  4. No formulário Create control setting (Criar configuração de controle), faça o seguinte:

    1. No painel Details (Detalhes), insira um Name (Nome) e (opcionalmente) uma Description (Descrição) para o controle de acesso à origem.

    2. No painel Settings (Configurações), recomendamos que você deixe a configuração padrão (Sign requests (recommended) [Solicitações de assinatura (recomendado)]. Para ter mais informações, consulte Configurações avançadas para controle de acesso à origem.

  5. Selecione S3 no menu suspenso Origin type (Tipo de origem).

  6. Escolha Criar.

    Depois que o OAC for criado, anote o Name (Nome). Você precisará dele no procedimento a seguir.

Como adicionar um controle de acesso à origem a uma origem do S3 em uma distribuição
  1. Abra o console do CloudFront em https://console.aws.amazon.com/cloudfront/v4/home.

  2. Escolha uma distribuição com uma origem do S3 à qual você deseja adicionar o OAC e, depois, selecione a guia Origins (Origens).

  3. Selecione a origem do S3 à qual você deseja adicionar o OAC e, depois, Edit (Editar).

  4. Em Origin access (Acesso à origem), selecione Origin access control settings (recommended) (Configurações de controle de acesso à origem [recomendado]).

  5. No menu suspenso Origin access control (Controle de acesso à origem), selecione o OAC que você deseja usar.

  6. Escolha Salvar alterações.

A distribuição começa a ser implantada em todos os locais da borda do CloudFront. Quando um local da borda recebe a nova configuração, ele assina todas as solicitações enviadas à origem do bucket do S3.

CloudFormation

Para criar um controle de acesso à origem (OAC) com o AWS CloudFormation, use o tipo de recurso AWS::CloudFront::OriginAccessControl. O exemplo a seguir mostra a sintaxe do modelo AWS CloudFormation no formato YAML, para criar um controle de acesso à origem.

Type: AWS::CloudFront::OriginAccessControl Properties: OriginAccessControlConfig: Description: An optional description for the origin access control Name: ExampleOAC OriginAccessControlOriginType: s3 SigningBehavior: always SigningProtocol: sigv4

Para obter mais informações, consulte AWS::CloudFront::OriginAccessControl no Guia do usuário do AWS CloudFormation.

CLI

Para criar um controle de acesso à origem com a AWS Command Line Interface (AWS CLI), use o comando aws cloudfront create-origin-access-control. É possível usar um arquivo de entrada para fornecer os parâmetros de entrada do comando, em vez de especificar cada parâmetro individual como entrada na linha de comando.

Como criar um controle de acesso à origem (CLI com arquivo de entrada)
  1. Use o comando a seguir para criar um arquivo chamado origin-access-control.yaml. Esse arquivo contém todos os parâmetros de entrada para o comando create-origin-access-control.

    aws cloudfront create-origin-access-control --generate-cli-skeleton yaml-input > origin-access-control.yaml
  2. Abra o arquivo origin-access-control.yaml que você acabou de criar. Edite o arquivo para adicionar um nome para o OAC, uma descrição (opcional) e alterar SigningBehavior para always. Salve o arquivo.

    Para obter mais informações sobre outras configurações de OAC, consulte Configurações avançadas para controle de acesso à origem.

  3. Use o comando a seguir para criar o controle de acesso à origem usando parâmetros de entrada do arquivo origin-access-control.yaml.

    aws cloudfront create-origin-access-control --cli-input-yaml file://origin-access-control.yaml

    Anote o valor do Id na saída do comando. Você precisa dele para adicionar o OAC a uma origem de bucket do S3 em uma distribuição do CloudFront.

Como anexar um OAC a uma origem de bucket do S3 em uma distribuição existente (CLI com arquivo de entrada)
  1. Use o comando a seguir para salvar a configuração da distribuição do CloudFront à qual você deseja adicionar o OAC. A distribuição deve ter uma origem de bucket do S3.

    aws cloudfront get-distribution-config --id <CloudFront distribution ID> --output yaml > dist-config.yaml
  2. Abra o arquivo chamado dist-config.yaml que você acabou de criar. Edite o arquivo fazendo as seguintes alterações:

    • No objeto Origins, adicione o ID do OAC ao campo chamado OriginAccessControlId.

    • Remova o valor do campo chamado OriginAccessIdentity, se houver.

    • Renomeie o campo ETag para IfMatch, mas não altere o valor do campo.

    Ao concluir, salve o arquivo.

  3. Use o comando a seguir para atualizar a distribuição para usar o controle de acesso à origem.

    aws cloudfront update-distribution --id <CloudFront distribution ID> --cli-input-yaml file://dist-config.yaml

A distribuição começa a ser implantada em todos os locais da borda do CloudFront. Quando um local da borda recebe a nova configuração, ele assina todas as solicitações enviadas à origem do bucket do S3.

API

Para criar um controle de acesso à origem com a API do CloudFront, use CreateOriginAccessControl. Para obter mais informações sobre os campos especificados nessa chamada de API, consulte a documentação de referência de API do seu AWS SDK ou de outro cliente de API.

Assim que criar um controle de acesso à origem, você pode anexá-lo a uma origem de bucket do S3 em uma distribuição usando uma das seguintes chamadas de API:

Para as duas chamadas de API, forneça o ID de controle de acesso à origem no campo OriginAccessControlId, dentro de uma origem. Para mais informações sobre os outros campos especificados nessas chamadas de API, consulte Referência de configurações da distribuição e a documentação de referência da API do AWS SDK ou de outro cliente de API.

Excluir uma distribuição com um OAC anexado a um bucket do S3

Se precisar excluir uma distribuição com um OAC anexado a um bucket do S3, exclua a distribuição antes de excluir a origem do bucket do S3. Como alternativa, inclua a Região no nome de domínio de origem. Se isso não for possível, é possível remover o OAC da distribuição mudando para público antes da exclusão. Para ter mais informações, consulte Excluir uma distribuição do .

Migrar da identidade do acesso de origem (OAI) para o controle de acesso à origem (OAC)

Para migrar de uma identidade do acesso de origem (OAI) herdada para um controle de acesso à origem (OAC), primeiro atualize a origem do bucket do S3 para permitir que a OAI e o OAC acessem o conteúdo do bucket. Isso garante que o CloudFront nunca perca o acesso ao bucket durante a transição. Para permitir que a OAI e o OAC acessem um bucket do S3, atualize a política de bucket para incluir duas declarações, uma para cada tipo de entidade principal.

O exemplo de política de bucket do S3 a seguir permite que uma OAI e um OAC acessem uma origem do S3.

exemplo Política de bucket do S3 que permite acesso somente leitura a uma OAI e um OAC
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowCloudFrontServicePrincipalReadOnly", "Effect": "Allow", "Principal": { "Service": "cloudfront.amazonaws.com" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::<S3 bucket name>/*", "Condition": { "StringEquals": { "AWS:SourceArn": "arn:aws:cloudfront::111122223333:distribution/<CloudFront distribution ID>" } } }, { "Sid": "AllowLegacyOAIReadOnly", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity <origin access identity ID>" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::<S3 bucket name>/*" } ] }

Depois de atualizar a política de bucket da origem do S3 para permitir o acesso à OAI e ao OAC, você pode atualizar a configuração de distribuição para usar o OAC em vez da OAI. Para ter mais informações, consulte Criar um controle de acesso à origem.

Depois que a distribuição estiver totalmente implantada, você poderá remover a declaração na política de bucket que permite o acesso à OAI. Para ter mais informações, consulte Conceder permissão ao controle de acesso à origem para acessar o bucket do S3.

Configurações avançadas para controle de acesso à origem

O recurso de controle de acesso à origem do CloudFront inclui configurações avançadas destinadas somente a casos de uso específicos. Use as configurações recomendadas, a menos que você precise usar as configurações avançadas para uma necessidade específica.

O controle de acesso à origem contém uma configuração chamada Signing behavior (Comportamento de assinatura) (no console) ou SigningBehavior (na API, na CLI e no AWS CloudFormation). Essa configuração fornece as seguintes opções:

Always sign origin requests (recommended setting) [Sempre assinar solicitações de origem (configuração recomendada)]

Recomendamos usar essa configuração, chamada Sign requests (recommended) [Assinar solicitações (recomendado)] no console, ou always na API, na CLI e no AWS CloudFormation. Com essa configuração, o CloudFront sempre assina todas as solicitações enviadas à origem do bucket do S3.

Never sign origin requests (Nunca assinar solicitações de origem)

Essa configuração é chamada Do not sign requests (Não assinar solicitações) no console ou never na API, na CLI e no AWS CloudFormation. Use essa configuração para desativar o controle de acesso à origem para todas as origens em todas as distribuições que usam esse controle. Isso pode economizar tempo e esforço em comparação com a remoção individual de um controle de acesso à origem de todas as origens e distribuições que o usam. Com essa configuração, o CloudFront não assina nenhuma solicitação enviada à origem do bucket do S3.

Atenção

Para usar essa configuração, a origem do bucket do S3 deve estar acessível ao público. Se você usar essa configuração com uma origem de bucket do S3 que não esteja acessível ao público, o CloudFront não poderá acessar a origem. A origem do bucket do S3 retorna erros ao CloudFront e o CloudFront transmite esses erros aos visualizadores.

Não substituir o cabeçalho Authorization do visualizador (cliente)

Essa configuração é chamada Do not override authorization header (Não substituir o cabeçalho de autorização) no console ou no-override na API, na CLI e no AWS CloudFormation. Use essa configuração quando quiser que o CloudFront assine solicitações de origem somente quando a solicitação do visualizador correspondente não incluir um cabeçalho Authorization. Com essa configuração, o CloudFront transmite o cabeçalho Authorization da solicitação do visualizador quando houver, mas assina a solicitação de origem (adicionando seu próprio cabeçalho Authorization) quando a solicitação do visualizador não inclui um cabeçalho Authorization.

Atenção

Para transmitir o cabeçalho Authorization da solicitação do visualizador, você deve adicionar o cabeçalho Authorization a uma política de cache para todos os comportamentos de cache que usam origens de bucket do S3 associadas a esse controle de acesso à origem.

Usar uma identidade de acesso à origem (herdada, não recomendado)

A identidade do acesso de origem (OAI) do CloudFront fornece funcionalidade semelhante ao controle de acesso à origem (OAC), mas não funciona em todos os cenários. É por isso que recomendamos usar o OAC em vez da OAI. O OAI não é compatível especificamente com:

  • Buckets do Amazon S3 em todas as Regiões da AWS, inclusive regiões opcionais.

  • Criptografia do lado do servidor com o AWS KMS (SSE-KMS) do Amazon S3

  • Solicitações dinâmicas (PUT, POST ou DELETE) para o Amazon S3

  • Novas Regiões da AWS lançadas após dezembro de 2022

Para obter informações sobre como migrar de OAI para OAC, consulte Migrar da identidade do acesso de origem (OAI) para o controle de acesso à origem (OAC).

Ao criar uma OAI ou adicionar uma a uma distribuição com o console do CloudFront, é possível atualizar automaticamente a política de bucket do Amazon S3 para conceder à OAI permissão para acessar seu bucket. Você também pode optar por criar ou atualizar manualmente a política do bucket. Seja qual for o método usado, você ainda deverá revisar as permissões para se certificar de que:

  • Sua OAI do CloudFront pode acessar arquivos no bucket em nome dos visualizadores que os solicitam por meio do CloudFront.

  • Os visualizadores não podem usar URLs do Amazon S3 para acessar seus arquivos fora do CloudFront.

Importante

Se você configurar o CloudFront para aceitar e encaminhar todos os métodos HTTP compatíveis com o CloudFront, certifique-se de conceder à OAI do CloudFront as permissões desejadas. Por exemplo, se você configurar o CloudFront para aceitar e encaminhar solicitações que usem o método DELETE, configure sua política de bucket para lidar com as solicitações DELETE de maneira adequada, para que os visualizadores possam excluir somente os arquivos desejados.

Usar políticas de bucket do Amazon S3

É possível conceder a uma OAI do CloudFront acesso a arquivos em um bucket do Amazon S3 criando ou atualizando a política de bucket das seguintes maneiras:

  • Usando a guia Permissions (Permissões) do bucket do Amazon S3 no console do Amazon S3.

  • Usando o PutBucketPolicy na API do Amazon S3.

  • Usando o console do CloudFront. Ao adicionar uma OAI às suas configurações de origem no console do CloudFront, é possível escolher Yes, update the bucket policy (Sim, atualizar a política de bucket) para informar o CloudFront para atualizar a política de bucket em seu nome.

Se você atualizar a política de bucket manualmente, certifique-se de:

  • Especificar a OAI correta como Principal na política.

  • Conceder à OAI as permissões necessárias para acessar objetos em nome dos visualizadores.

Para obter mais informações, consulte as seções a seguir.

Especificar uma OAI como Principal em uma política de bucket

Para especificar uma OAI como Principal em uma política de bucket do Amazon S3, use o nome do recurso da Amazon (ARN) da OAI, que inclui o respectivo ID. Por exemplo:

"Principal": { "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity <origin access identity ID>" }

Encontre o ID do OAI no console do CloudFront Security (Segurança), Origin access (Acesso à origem), Identities (legacy) (Identidades [legado]). Como alternativa, use ListCloudFrontOriginAccessIdentities na API do CloudFront.

Conceder permissões a uma OAI

Para conceder permissões à OAI para acessar objetos em seu bucket do Amazon S3, use ações na política que se relacionem a operações de API específicas do Amazon S3. Por exemplo, a ação s3:GetObject possibilita que a OAI leia objetos no bucket. Para obter mais informações, consulte os exemplos na seção a seguir, ou consulte Ações do Amazon S3 no Guia do usuário do Amazon Simple Storage Service.

Exemplos de política de bucket do Amazon S3

Os exemplos a seguir mostram políticas de bucket do Amazon S3 que permitem que a OAI do CloudFront acesse um bucket do S3.

Encontre o ID do OAI no console do CloudFront Security (Segurança), Origin access (Acesso à origem), Identities (legacy) (Identidades [legado]). Como alternativa, use ListCloudFrontOriginAccessIdentities na API do CloudFront.

exemplo Política de bucket do Amazon S3 que concede à OAI acesso de leitura

O exemplo a seguir permite que a OAI leia objetos no bucket especificado (s3:GetObject).

{ "Version": "2012-10-17", "Id": "PolicyForCloudFrontPrivateContent", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity <origin access identity ID>" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::<S3 bucket name>/*" } ] }
exemplo Política de bucket do Amazon S3 que concede à OAI acesso de leitura e gravação

O exemplo a seguir permite que a OAI leia e grave objetos no bucket especificado (s3:GetObject e s3:PutObject). Isso permite que os visualizadores façam upload de arquivos no bucket do Amazon S3 por meio do CloudFront.

{ "Version": "2012-10-17", "Id": "PolicyForCloudFrontPrivateContent", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity <origin access identity ID>" }, "Action": [ "s3:GetObject", "s3:PutObject" ], "Resource": "arn:aws:s3:::<S3 bucket name>/*" } ] }

Usar ACLs de objeto do Amazon S3 (não recomendado)

Importante

Recomendamos o uso de políticas de bucket do Amazon S3 para conceder a uma OAI acesso a um bucket do S3. Você pode usar listas de controle de acesso (ACLs) conforme descrito nesta seção, mas não recomendamos fazê-lo.

O Amazon S3 recomenda a configuração de S3 Object Ownership (Propriedade do objeto do S3) como bucket owner enforced (aplicado pelo proprietário do bucket), o que significa que as ACLs estão desabilitadas para o bucket e os objetos nele contidos. Ao aplicar essa configuração para Object Ownership (Propriedade de objeto), você deve usar políticas de bucket para conceder acesso à OAI (consulte a seção anterior).

Esta seção a seguir é apenas para casos de uso herdados que exigem ACLs.

É possível conceder a uma OAI do CloudFront acesso a arquivos em um bucket do Amazon S3 criando ou atualizando a ACL do arquivo das seguintes maneiras:

Ao conceder acesso a uma OAI usando uma ACL, é necessário especificar a OAI por meio de seu ID de usuário canônico do Amazon S3. No console do CloudFront, é possível encontrar este ID em Security (Segurança), Origin access (Acesso à origem), Identities (legacy) (Identidades [legado]). Se estiver usando a API do CloudFront, use o valor do elemento S3CanonicalUserId retornado quando você criou a OAI ou chame ListCloudFrontOriginAccessIdentities na API do CloudFront.

As regiões mais recentes do Amazon S3 exigem o uso do Signature Version 4 para solicitações autenticadas. (Para ver as versões de assinatura com suporte em cada região do Amazon S3, consulte Endpoints e cotas do Amazon Simple Storage Service na Referência geral da AWS). Se estiver usando uma identidade de acesso de origem e seu bucket estiver em uma das regiões que exijam o Signature versão 4, observe o seguinte:

  • As solicitações DELETE, GET, HEAD, OPTIONS e PATCH são compatíveis sem qualificações.

  • As solicitações POST não são compatíveis.