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.
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.
É 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:
API 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:
Como 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:
Ganchos (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.
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.
Você pode adicionar essa linha de exportação a um script de wrapper existente ou criar um novo.
Exemplo 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.
Ló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.
Cená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.