Skip to main content

Como aumentar a observabilidade, o monitoramento e a segurança em Serverless

Escrito por

15 de julho de 2019

0 minutos de leitura

As funções costumam ter vida curta, são implantadas em grande quantidade e, à medida que você escala, são invocadas cada vez mais. Por isso, é fácil perder o controle do fluxo de eventos ou identificar a causa raiz de um erro específico.

Além disso, à medida que a adoção de Serverless cresce em uma organização, fica mais complicado monitorar fluxos inseguros e tentativas maliciosas de invasores que tentam forçar uma função a seguir um caminho de código inseguro.

Para implantar funções e manter a segurança ao mesmo tempo, recomendamos que você:

Compartilhei mais informações sobre segurança Serverless em uma publicação anterior: 10 práticas recomendadas de segurança Serverless, que vale a pena salvar para ler depois. Mas, por enquanto, vamos às práticas de monitoramento e registro em logs que você pode aplicar aos seus projetos Serverless na nuvem.

Aumente a visibilidade dos ambientes aos quais as funções pertencem

As funções são praticamente gratuitas, pois geram custos apenas quando são invocadas. Por isso, implantamos muitas delas. Com o tempo, porém, cada função se torna um risco de segurança que pode permitir acesso à nossa rede e aos nossos dados. Além disso, as bibliotecas usadas em cada função podem ficar desatualizadas e vulneráveis. Depois de implantada, uma função também é difícil de remover, pois pode não estar claro quem é responsável por ela nem qual equipe é responsável pela organização, ou essas informações podem nem sequer ter sido definidas.

Para não perder o controle das funções, de suas finalidades e dos ambientes correspondentes, defina:

  • regras rigorosas para as funções que você implanta, facilitando a identificação daquelas que são de produção e de longo prazo, experimentais, administrativas etc.

  • diretrizes claras para determinar quando uma função deve ser removida

Recentemente, a AWS introduziu a possibilidade de adicionar tags às funções Lambda, facilitando o rastreamento e o agrupamento delas. Com o Serverless framework, podemos adicionar tags às funções nos arquivos YAML, de forma global (para todas as funções no arquivo serverless.yml) ou individual:


1 service:
2  name: hello-world
3
4 provider:
5  name: aws
6  runtime: nodejs8.10
7  stage: ${opt:stage, 'dev'}
8  region: ${opt:region, 'us-east-1'}
9  profile: production
10  tags:
11    foo: bar
12    baz: qux
13  functions:
14    helloWorld:
15      handler: helloworld.get
16      name: helloworld
17      description: My function
18      tags:
19        foo: bar

O código acima mostra dois tipos de tags disponíveis para funções Lambda na AWS:

  • A linha 10 mostra tags globais na implantação serverless.yml, associadas a todas as funções

  • A linha 18 mostra uma tag foo associada somente à função helloWorld

Monitore as funções em busca de vulnerabilidades de segurança

Há muitas maneiras de implantar funções, e o número delas pode facilmente sair do controle. Com o tempo, o código e as dependências dessas funções podem ficar desatualizados e vulneráveis, à medida que os esforços de manutenção diminuem e o foco se volta para outros projetos.

Use uma solução integrada ao seu provedor de função como serviço (FaaS) para monitorar as funções implantadas e mantê-las sob controle. Assim, você pode corrigir vulnerabilidades de segurança conhecidas ao longo do ciclo de vida de desenvolvimento de software, tanto nas funções quanto no uso que elas fazem de dependências de código aberto.

Na imagem a seguir, vemos o projeto do GitHub lirantal/bazz-serverless depois de uma análise. O projeto contém várias vulnerabilidades de gravidade alta, média e baixa. Esse é o código-fonte do meu projeto Serverless, que implanta várias funções. Abaixo do repositório do projeto no GitHub, podemos ver as seis funções AWS Lambda que implantei. São as funções reais, conforme implantadas e executadas pela AWS.

A Snyk analisou cada uma dessas funções em busca de vulnerabilidades de segurança conhecidas. Como todas usam a mesma árvore de dependências, podemos ver que foram implantadas com bibliotecas vulneráveis.

Curiosamente, há quatro vulnerabilidades de baixa gravidade no repositório do projeto, mas elas não aparecem nas funções individuais. Isso acontece porque a versão implantada é diferente da versão armazenada no repositório Git. Mais especificamente, a função implantada está desatualizada e não inclui uma biblioteca que adicionei ao código-fonte.

Se eu não tivesse acompanhado a segurança do meu projeto, poderia ter implantado ainda mais bibliotecas vulneráveis em produção, aumentando a superfície de ataque do aplicativo que estou desenvolvendo.

Interface do Snyk mostrando a seleção de um repositório do GitHub para um projeto serverless, ao lado de uma lista de funções do AWS Lambda e das respectivas contagens de vulnerabilidades.

Monitore o acesso a recursos

Imagine uma situação em que um invasor consegue explorar uma vulnerabilidade em uma função Node.js que bloqueia o loop de eventos, fazendo com que ela passe muito tempo em uma computação intensiva de CPU. Isso pode ser difícil de detectar devido à natureza do modelo de função como serviço, no qual as funções são iniciadas conforme a necessidade para atender a novas solicitações. Embora isso pareça um ótimo recurso — e provavelmente seja em certos aspectos —, a contrapartida é um aumento repentino na fatura da nuvem, devido à cobrança por uso das funções.

Crie uma estratégia de monitoramento: implemente políticas, alertas e mecanismos de aplicação para identificar e bloquear invocações de funções não previstas. Considere monitorar os seguintes recursos:

  • CPU

  • Memória

  • Consumo e operações de entrada e saída

  • Acesso a arquivos, como leitura e gravação

  • Tempo de execução da função

  • Fluxos de invocação das funções e anomalias em relação às fontes de invocação esperadas

  • Execuções de processos filhos

Os provedores de nuvem geralmente oferecem monitoramento integrado de recursos de aplicativos e funções para fornecer essas informações. A Microsoft oferece o Azure Monitoring, enquanto a Amazon oferece o AWS X-Ray. Usando este último como exemplo, a documentação oficial da AWS mostra o console do AWS X-Ray, que apresenta informações sobre o fluxo de dados entre funções e outros recursos da nuvem, além de métricas como o tempo de execução.

Diagrama do fluxo de uma aplicação sem servidor, conectando clientes, funções do AWS Lambda, SNS, Elastic Beanstalk e tabelas do DynamoDB, com métricas de latência.

Depois de implementar o monitoramento, aplique limites relacionados às funções para evitar ainda mais o esgotamento de recursos financeiros.

Funções de registro em log

Os logs são agrupados de forma lógica por conjuntos de funções, fornecendo informações valiosas. Mas, se não forem tratados corretamente, também podem criar outros problemas de segurança.

Para aproveitar ao máximo os logs:

  • Prefira logs detalhados de eventos, contexto e informações sobre falhas

  • Aproveite os recursos de logging da nuvem

  • Implemente um sistema centralizado de gerenciamento de logs para facilitar a depuração e a localização de eventos pela equipe

  • Associe limites e alertas aos logs e a eventos específicos para que, além de servirem como trilha de auditoria, eles também alertem quando os problemas exigirem atenção imediata

Com isso em mente, tome cuidado para não registrar informações confidenciais, como credenciais, nem dados excessivos, como variáveis de ambiente. Além disso, garanta a conformidade com a LGPD e não registre informações de identificação pessoal.

Resumo

Leia uma lista mais completa de 10 práticas recomendadas de segurança Serverless para conhecer outras questões de segurança ao criar e implantar funções Serverless.