O blog da AWS

Aprimorando a segurança e a governança do runtime com a extensão proxy da API AWS Lambda Runtime

Por Anton Aleksandrov, arquiteto principal de soluções Serverless, e Shridhar Pandey, gerente sênior de produtos do AWS Lambda

 

Os runtimes do AWS Lambda usam a API Lambda Runtime para se comunicar com o serviço Lambda. Os runtimes o usam para recuperar eventos de entrada a serem processados pelo manipulador (handler) de funções, retornar respostas bem-sucedidas do manipulador ao serviço Lambda e relatar falhas. Esta postagem mostra como interceptar eventos de entrada e respostas de saída sem alterar o código da função, usando o padrão de proxy da API Runtime.

Essa abordagem permite que fornecedores de segurança e equipes de engenharia forneçam ferramentas aprimoradas e não invasivas de segurança e governança para funções do Lambda. Os casos de uso incluem higienização da carga útil (payload) de eventos, bloqueio de eventos maliciosos e auditoria e aumento de cargas úteis.

Visão geral

A API Lambda Runtime é um endpoint HTTP disponível no ambiente de execução (runtime environment)  do Lambda. Ele permite que o runtime do Lambda que executa o código da função se comunique com o serviço Lambda. Ele é usado por runtimes gerenciados do Lambda, como Node.js ou Python, bem como pelo runtime, que permite que os desenvolvedores criem seu próprio runtime do Lambda em qualquer linguagem de programação de sua escolha.

Os runtimes do Lambda usam a API Runtime para recuperar o próximo evento de entrada a ser processado pelo manipulador (handler) da função e retornar a resposta do serviço Lambda.

As extensões Lambda permitem que você integre as funções do Lambda às ferramentas preferidas da sua organização para monitoramento, observabilidade, segurança e governança. Você pode usar extensões da AWS, parceiros do AWS Lambda Ready e projetos de código aberto para uma ampla variedade de casos de uso. As extensões permitem adicionar funcionalidades, como busca de configurações ou envio de telemetria, sem fazer alterações intrusivas no código da função. As extensões Lambda são empacotadas como camadas Lambda e executadas como um processo separado no ambiente de execução.

É assim que os runtimes e as extensões se comunicam com o serviço Lambda por meio dos endpoints da API Runtime e da API de extensões:

 

AWS Lambda Runtime API and Extensions API endpointsAPI do AWS Lambda Runtime e endpoints da API de extensões

Ao registrar sua extensão no serviço Lambda, você pode especificar que deseja receber o evento INVOKE. O serviço Lambda envia esse evento para a extensão de forma assíncrona quando uma função é invocada.

As informações fornecidas contêm os metadados de invocação da função, mas não a carga útil (payload) do evento. Isso torna o evento útil para fins de observabilidade, mas limitado para casos de uso de segurança e governança de aplicativos, como inspecionar cargas em busca de vulnerabilidades, higienizar entradas e bloquear eventos maliciosos.

O proxy da API Lambda Runtime é um padrão que permite que você se conecte ao ciclo de vida da solicitação de invocação e resposta da função. Ele permite que você use extensões para implementar cenários avançados de segurança, conformidade, governança e observabilidade sem alterações no código da função. Você pode adicionar mecanismos de segurança de tempo de execução, implementar procedimentos de auditoria para dados que entram e saem da função, aprimorar a observabilidade por meio da injeção automática de cabeçalhos de rastreamento e muito mais.

Entendendo o fluxo de trabalho da API Lambda Runtime

É assim que o Lambda Runtime consome a API Lambda Runtime:

How the Lambda Runtime consumes the Lambda Runtime APIComo o Lambda Runtime consome a API Lambda Runtime

Os runtimes do Lambda usam o valor da variável de ambiente AWS_LAMBDA_RUNTIME_API para fazer solicitações da API Runtime. Os dois endpoints principais são /next, que é usado para recuperar o próximo evento a ser processado, e /response, que é usado para retornar os resultados do processamento do evento para o serviço Lambda. Além disso, a API Runtime também fornece endpoints para relatar falhas. Veja as definições completas de protocolo e esquema da API Runtime.

Como funciona a abordagem de proxy da Runtime API

O proxy da API Runtime é um componente que você pode criar para se conectar ao fluxo de trabalho de invocação. Ele envia solicitações e respostas por proxy, permitindo que você as aumente e controle o fluxo de trabalho:

Runtime API proxy hooksGanchos (hooks) de proxy da API Runtime

Quando o serviço Lambda cria um novo ambiente de execução, ele começa inicializando as extensões anexadas à função. O ambiente de execução espera que todas as extensões se registrem no serviço Lambda chamando o endpoint /register da API de extensões e, em seguida, inicializa o tempo de execução. Isso permite que você inicie o listener HTTP do proxy da Runtime API durante a inicialização da extensão, preparando-o para atender às solicitações de tempo de execução.

Runtime API proxy flow

Fluxo de proxy da API Runtime

Por padrão, o valor da variável de ambiente AWS_LAMBDA_RUNTIME_API no processo de runtime aponta para o endpoint 127.0.0.1:9001 da API Lambda Runtime. Em vez disso, você pode usar um script de wrapper para alterar esse valor para apontar para o endpoint do proxy da Runtime API.

Um script de wrapper permite que você personalize o comportamento de inicialização em runtime da sua função Lambda, permitindo que você defina parâmetros de configuração que não podem ser definidos por meio de variáveis de ambiente específicas da linguagem. Você pode adicionar um script de wrapper à sua função definindo a variável de ambiente AWS_LAMBDA_EXEC_WRAPPER. O script de wrapper a seguir pressupõe que o Runtime API Proxy esteja escutando na porta 9009.

#!/bin/bash
export AWS_LAMBDA_RUNTIME_API="127.0.0.1:9009"
exec "$@"
Bash

Você pode adicionar essa linha de exportação a um script de wrapper existente ou criar um novo.

Runtime API proxy exampleExemplo de proxy da API Runtime

O Runtime API Proxy é inicializado pelo serviço Lambda quando um novo ambiente de execução é criado e está pronto para transferir solicitações do runtime do Lambda para a API Runtime antes da primeira invocação.

Implementando a lógica de proxy da API Runtime

A AWS recomenda que você implemente extensões usando uma linguagem de programação que compila em um executável binário, como Golang ou Rust. Isso permite que você use a extensão com qualquer runtime do Lambda. Extensões implementadas em linguagens interpretadas, como JavaScript e Python, ou linguagens que exigem máquinas virtuais adicionais, como Java e C#, só podem ser usadas com esse runtime específico.

Este diagrama mostra um cenário em que tanto os eventos de entrada quanto as respostas de saída são processados pela extensão. Você pode usar esse fluxo de trabalho para auditar cargas de eventos ou respostas, higienizá-las ou injetar propriedades adicionais. Você pode usá-lo para cenários como mascarar números de contas, remover informações de identificação pessoal (PII) ou injetar cabeçalhos de observabilidade.

Runtime API proxy logicLógica de proxy da API Runtime

Esse diagrama demonstra um cenário avançado, em que o primeiro evento de entrada é identificado como malicioso e rejeitado pelo proxy da API Runtime. O manipulador (handler) da função não é invocado. O segundo evento não é sinalizado como malicioso e, portanto, é encaminhado ao manipulador para processamento. Você pode usar esse fluxo de trabalho para cenários de segurança, como proteção de aplicativos em tempo de execução.

Runtime API proxy security scenarioCenário de segurança do proxy Runtime API

Parceiros da AWS usando a solução Runtime API Proxy

“Usar a solução de proxy da API Lambda Runtime é uma abordagem revolucionária para nós. Ele nos permite oferecer suporte a vários runtimes do Lambda com uma única implementação, fornece visibilidade abrangente da execução do Lambda e permite detectar invasores que visam aplicativos Serverless”, diz Julio Guerra, gerente de engenharia de gerenciamento de segurança de aplicativos da Datadog.

“O proxy da API Lambda Runtime é uma solução simples que nos oferece uma maneira conectável de proteger os URLs da função Lambda. Podemos implementar a autorização e o enriquecimento de solicitações sem alterações no código da função”, diz Ilya Zilber, gerente sênior de engenharia de soluções da Okta Inc.

Práticas recomendadas de segurança

As extensões são executadas no mesmo ambiente de execução da função, portanto, elas têm o mesmo nível de acesso a recursos como sistema de arquivos, rede e variáveis de ambiente. As permissões do IAM atribuídas à função são compartilhadas com extensões. Nossa orientação é atribuir os privilégios menos necessários às suas funções.

Sempre instale extensões somente de uma fonte confiável. Use ferramentas de infraestrutura como código (IaC), como o AWS CloudFormation, para simplificar a tarefa de anexar a mesma configuração de extensão, incluindo permissões do AWS Identity and Access Management (IAM), a várias funções. Além disso, as ferramentas do IaC permitem que você tenha um registro de auditoria das extensões e versões que você usou anteriormente.

Ao criar extensões, não registre dados confidenciais. Limpe as cargas e os metadados antes de registrá-los ou mantê-los para fins de auditoria.

Considerações

A abordagem de proxy da API Runtime permite que você se conecte ao fluxo de trabalho (workflow) de solicitação/resposta do Lambda, possibilitando novos casos de uso de segurança e observabilidade. Há várias considerações importantes:

  • Isso exige que você tenha uma boa compreensão do ciclo de vida do ambiente de execução do Lambda e da API Lambda Runtime. Você deve implementar o proxy para todos os endpoints da API Runtime e lidar com possíveis falhas de tempo de execução.
  • Prepare sua extensão para composição em cenários nos quais mais de uma extensão implementa o padrão de proxy da API Runtime. Permita que seus consumidores de extensão configurem a extensão por meio de variáveis de ambiente usando pelo menos dois parâmetros: a porta que seu proxy escuta e o endpoint da API Runtime para o qual seu proxy encaminha as solicitações. O último deve usar como padrão o valor original da variável de ambiente AWS_LAMBDA_RUNTIME_API. Veja os exemplos de implementações abaixo para obter detalhes.
  • O proxy de solicitações de API com respostas padrão em buffer exige trabalho adicional para suportar funções com streaming de carga útil de resposta.
  • O proxy de solicitações de API aumenta a latência. A sobrecarga adicional depende da sua implementação. A AWS recomenda usar linguagens de programação que podem ser compiladas em um binário executável, como Rust e Golang, e manter suas extensões leves e otimizadas.

Exemplos

Você pode encontrar exemplos de extensões implementando o Runtime API Proxy em https://github.com/aws-samples/aws-lambda-extensions/. Veja exemplos de Golang, Rust e Node.js.

Siga as instruções descritas em README.md para ver um tutorial passo a passo sobre como executar a extensão.

Conclusão

Esta postagem apresenta e ilustra o padrão de proxy da API Lambda Runtime. Você pode usar esse padrão para se conectar ao fluxo de trabalho de solicitação e resposta da função Lambda para interceptar, processar, auditar, modificar e bloquear eventos de entrada e respostas do manipulador.

Você pode usar esse padrão para implementar cenários aprimorados de segurança e governança em tempo de execução, bem como cenários de outros domínios. Os clientes e parceiros da AWS podem usar essa abordagem de solução avançada para adicionar segurança e observabilidade aprimoradas às funções do Lambda sem exigir alterações no código.

Para obter mais recursos de aprendizado Serverless, visite Serverless Land.

 

Este artigo foi traduzido do Blog da AWS em Inglês.

 


Sobre o autor

Anton Aleksandrov é arquiteto principal de soluções Serverless

 

 

 

 

Shridhar Pandey é gerente sênior de produtos do AWS Lambda

 

 

 

 

Tradutor

Daniel Abib é Enterprise Solution Architect na AWS, com mais de 25 anos trabalhando com gerenciamento de projetos, arquiteturas de soluções escaláveis, desenvolvimento de sistemas e CI/CD, microsserviços, arquitetura Serverless & Containers e segurança. Ele trabalha apoiando clientes corporativos, ajudando-os em sua jornada para a nuvem.

https://www.linkedin.com/in/danielabib/