View a markdown version of this page

Restringir o acesso a uma origem do AWS Lambda Web Function - Amazon CloudFront

Restringir o acesso a uma origem do AWS Lambda Web Function

Você pode usar o controle de acesso de origem (OAC) para restringir o acesso a uma origem do AWS Lambda Web Function. Uma Lambda Web Function fornece seu próprio endpoint HTTPS regional ou global, que você usa como domínio de origem para sua distribuição do CloudFront. Para obter mais informações sobre as Lambda Web Functions, consulte AWS Lambda Web Functions no AWS Lambda Guia do desenvolvedor.

nota

O OAC com Lambda Web Functions não é compatível com endpoints globais que incluem Regiões opcionais. Se o endpoint rotear uma solicitação para uma Região opcional, o CloudFront não poderá assinar a solicitação para essa Região. Em seguida, a origem retornará um erro HTTP 403 (Forbidden). Todas as regiões associadas ao endpoint global devem ser regiões que estão ativadas por padrão.

Para obter mais informações sobre como usar o OAC com uma origem de URL de função do Lambda, consulte Restringir o acesso a uma origem do URL de função do AWS Lambda.

Pré-requisitos

Antes de criar e configurar o OAC, você deve ter uma distribuição do CloudFront com uma Lambda Web Function como origem. O nome de domínio de origem é o nome do host do endpoint da Lambda Web Function. O CloudFront identifica o tipo de endpoint a partir do nome do host:

  • Endpoint regional (HomeRegion e PerRegion tipos de endpoint) – O nome do host termina em .lambda-web.AWS-Region.on.aws

  • Endpoint global (tipo de endpoint MultiRegion) – O nome do host termina em .lambda-web.global.on.aws

Sua configuração também deve atender aos seguintes requisitos:

  • Tipo de autenticação do endpoint – O tipo de autenticação do endpoint deve ser IamAuth. Com IamAuth, o endpoint usa AWS Identity and Access Management (IAM) para autenticar e autorizar solicitações. Para solicitações do CloudFront, a autorização baseia-se na política baseada em recursos da Lambda Web Function. O CloudFront assina solicitações em nome do visualizador, e o endpoint valida a assinatura. Para obter mais informações, consulte Integração do CloudFront no AWS Lambda Guia do desenvolvedor.

  • Política de cache – Se sua Lambda Web Function usa o cabeçalho Authorization do visualizador, você deve adicionar o cabeçalho à política de cache. Esse requisito se aplica a todos os comportamentos de cache que usam a origem. Para solicitações GET e HEAD, o CloudFront remove o cabeçalho Authorization antes de encaminhar a solicitação, a menos que o cabeçalho esteja na política de cache. Para obter mais informações, consulte Cabeçalhos de solicitação HTTP e comportamento do CloudFront (origens do Amazon S3 e personalizadas).

  • Política de solicitação de origem – Use uma política de solicitação de origem que exclua o cabeçalho Host do visualizador. Os endpoints da Lambda Web Function esperam que o cabeçalho Host contenha o nome do domínio de origem, não o nome de domínio da distribuição do CloudFront. Se o cabeçalho Host contiver o nome de domínio da distribuição, o endpoint retornará um erro HTTP 404 (Não encontrado). Se você usar uma política de solicitação de origem gerenciada, use AllViewerExceptHostHeader, não AllViewer. Para obter mais informações, consulte AllViewerExceptHostHeader.

nota

Os gatilhos de solicitação de origem e resposta de origem do Lambda@Edge não são compatíveis com comportamentos de cache que usam uma origem do Lambda Web Function com OAC. Isso se aplica a endpoints regionais e globais, bem como a origens acessadas diretamente ou por meio de um grupo de origens. O CloudFront rejeita uma configuração de distribuição que contenha ambos.

Conceder permissão ao CloudFront para acessar a Lambda Web Function

Anexe uma política baseada em recursos à Lambda Web Function que permite a entidade principal de serviço do CloudFront (cloudfront.amazonaws.com) invocar o endpoint. A ação do IAM para invocar um endpoint é lambda:InvokeWebFunctionEndpoint. A política é anexada à Lambda Web Function, mas cada instrução pode definir o escopo da Resource para um ARN de endpoint específico. Use um elemento Condition para permitir que o CloudFront acesse o endpoint somente quando a solicitação for em nome da distribuição do CloudFront que contém a origem.

exemplo Política baseada em recurso para o CloudFront OAC
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowCloudFrontOACAccess", "Effect": "Allow", "Principal": { "Service": "cloudfront.amazonaws.com" }, "Action": "lambda:InvokeWebFunctionEndpoint", "Resource": "arn:aws:lambda:us-east-1:111122223333:web-function/my-function/endpoint/prod", "Condition": { "StringEquals": { "aws:SourceArn": "arn:aws:cloudfront::111122223333:distribution/EDFDVBD6EXAMPLE" } } } ] }

Para anexar a política baseada em recursos, use o comando put-resource-policy com o ARN da função (não um ARN de endpoint):

aws lambda-web put-resource-policy \ --resource-arn "arn:aws:lambda:us-east-1:111122223333:web-function/my-function" \ --policy file://policy.json \ --region us-east-1

Você pode revisar ou remover a política com os comandos get-resource-policy e delete-resource-policy.

nota

Para endpoints que abrangem mais de uma Região, o Lambda replica as alterações de política em todas as regiões que atendem ao endpoint. Uma política nova ou atualizada pode levar algum tempo para entrar em vigor em cada Região. Para obter mais informações, consulte Replicação e consistência eventual no AWS Lambda Guia do desenvolvedor do.

Criar o controle de acesso à origem

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

Console
Como criar um controle de acesso à origem
  1. Faça login no Console de gerenciamento da AWS 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. Selecione Lambda no menu suspenso Tipo de origem. Esse tipo de origem é usado tanto para URLs de função do Lambda e Lambda Web Functions.

    3. Se sua origem for um endpoint global (o nome do host termina em .lambda-web.global.on.aws), selecione a opção Usar protocolo de assinatura SigV4a. Para um endpoint regional (o nome do host termina em .lambda-web.AWS-Region.on.aws), deixe essa opção desmarcada.

    4. Em Comportamento de assinatura, escolha Sempre assinar, preservar a autorização do visualizador. Essa opção aparece em Assinar solicitações (recomendado), que vem selecionada por padrão. Origens do Lambda Web Function oferecem suporte apenas a esse comportamento de assinatura. Para obter mais informações, consulte Comportamento de assinatura.

  5. Escolha Criar.

Para adicionar um controle de acesso de origem a uma origem do Lambda Web Function 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 Lambda Web Function à qual deseja adicionar o OAC e escolha a guia Origens.

  3. Selecione a origem Lambda Web Function à qual deseja adicionar o OAC e escolha 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 para a origem do Lambda Web Function.

CLI

Use o comando create-origin-access-control. Para um endpoint regional (o nome do host termina em .lambda-web.AWS-Region.on.aws), use o protocolo de assinatura sigv4:

aws cloudfront create-origin-access-control \ --origin-access-control-config '{ "Name": "my-lambda-web-oac", "Description": "OAC for Lambda Web Function origin", "SigningProtocol": "sigv4", "SigningBehavior": "always-amz-auth", "OriginAccessControlOriginType": "lambda" }'

Para um endpoint global (o nome do host termina em .lambda-web.global.on.aws), use o protocolo de assinatura sigv4a:

aws cloudfront create-origin-access-control \ --origin-access-control-config '{ "Name": "my-lambda-web-global-oac", "Description": "OAC for global Lambda Web Function origin", "SigningProtocol": "sigv4a", "SigningBehavior": "always-amz-auth", "OriginAccessControlOriginType": "lambda" }'
CloudFormation

Especifique os seguintes valores em OriginAccessControlConfig:

  • SigningProtocol: sigv4 (endpoint regional) ou sigv4a (endpoint global)

  • SigningBehavior: always-amz-auth

  • OriginAccessControlOriginType: lambda

exemplo CloudFormationModelo do
Type: AWS::CloudFront::OriginAccessControl Properties: OriginAccessControlConfig: Description: An optional description for the origin access control Name: my-lambda-web-oac OriginAccessControlOriginType: lambda SigningBehavior: always-amz-auth SigningProtocol: sigv4a

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

O OAC entra em vigor para cada solicitação somente após a conclusão da implantação da distribuição. Para um endpoint que abrange mais de uma Região, a política baseada em recursos que você anexou anteriormente também deve concluir a replicação para cada Região que atende ao endpoint. Até que ambos sejam concluídos, algumas solicitações poderão receber uma resposta HTTP 403 transitória da origem. Esses erros são resolvidos automaticamente depois que a distribuição conclui a implantação e a política conclui a replicação.

Comportamento de assinatura

Origens do Lambda Web Function oferecem suporte apenas ao comportamento de assinatura always-amz-auth (Sempre assinar, preservar autorização do visualizador no console). O CloudFront sempre assina todas as solicitações enviadas à Lambda Web Function, mas não substitui o cabeçalho Authorization da solicitação do visualizador. Em vez disso, o CloudFront adiciona sua assinatura em um cabeçalho dedicado do CloudFront e passa o cabeçalho Authorization do visualizador para a origem sem modificações. Com esse comportamento, sua Lambda Web Function pode receber o cabeçalho original Authorization do visualizador (por exemplo, para realizar sua própria autenticação ou autorização). O CloudFront ainda assina todas as solicitações que envia para a origem. Para encaminhar o cabeçalho Authorization do visualizador, você deve adicioná-lo a uma política de cache para cada comportamento de cache que usa a origem.

Os outros comportamentos de assinatura (always, never, e no-override) não são compatíveis com as origens do Lambda Web Function. O comportamento de assinatura always-amz-auth não é compatível com nenhum outro tipo de origem, incluindo origens de URL da função do Lambda.

Para solicitações PUT, POST, e PATCH, o CloudFront assina a solicitação de origem com uma carga útil não assinada (UNSIGNED-PAYLOAD). O corpo da solicitação não é coberto pela assinatura do CloudFront. A assinatura ainda cobre o método da solicitação, o caminho, a string de consulta e os cabeçalhos que identificam sua distribuição. Portanto, o endpoint pode verificar se cada solicitação vem do CloudFront em nome de sua distribuição antes de invocar sua Lambda Web Function. O corpo da solicitação é protegido em trânsito pela conexão HTTPS entre o CloudFront e o endpoint. Você não precisa incluir um cabeçalho x-amz-content-sha256 nas solicitações para o CloudFront. Se um visualizador enviar um, o CloudFront não o usará ao assinar a solicitação de origem.