Proteja o desenvolvimento de aplicações Kubernetes com Snyk e Tilt
11 de janeiro de 2021
0 minutos de leituraDesenvolver aplicações Kubernetes pode ser difícil. Muitas vezes, lidamos com arquiteturas de microsserviços cheias de componentes interdependentes, além de desenvolver a configuração do cluster para conectar tudo. Com isso, os fluxos de trabalho para iterar e testar rapidamente podem ficar complexos e difíceis de gerenciar pelas equipes de engenharia.
É aí que ferramentas como o Tilt entram em cena.
O que é o Tilt?
O Tilt é uma ferramenta incrível para quem desenvolve aplicações Kubernetes. Ele oferece um fluxo de trabalho de implantação local altamente configurável, que é atualizado em tempo real enquanto você trabalha. Em vez de gerenciar um conjunto centralizado de ambientes compartilhados por todos os desenvolvedores, o Tilt dá a cada pessoa seu próprio ambiente local, com implantações ultrarrápidas e a possibilidade de personalizar o fluxo de trabalho.
O Tilt é configurado com um Tiltfile baseado em Starlark e oferece interfaces gráfica e de linha de comando personalizáveis, além de uma API completa. Isso dá muita flexibilidade para definir seus fluxos de trabalho e as informações que você quer ver durante o desenvolvimento da aplicação. O Tilt também oferece suporte a extensões personalizadas, ampliando ainda mais as opções para configurar e executar seu ambiente de desenvolvimento.
Meu colega Shai Mendel contribuiu com uma extensão para o Tilt que permite executar o Snyk no seu Tiltfile. Recentemente, atualizei essa extensão e explorei as várias formas de integrar o Snyk aos fluxos de trabalho do Tilt. Vamos ver como funciona.
Primeiros passos
Para começar, vamos implantar um cluster Kubernetes localmente, junto com um registro. O Tilt oferece uma ferramenta que facilita muito esse processo. O Ctlptl oferece várias maneiras de executar o Kubernetes localmente, incluindo miniKube, Kind e Docker Desktop. Vou usar o Kind, que você precisa instalar primeiro.
Este comando implantará um cluster Kubernetes usando o Kind e também um registro no Docker local, além de configurar tudo o que o Kubernetes precisa para usá-lo. Quando o comando terminar, veremos no Docker que os dois foram implantados:
Em seguida, vou clonar uma aplicação de exemplo para testar. Estou usando o exemplo de Node.js oferecido pelo Tilt. Essa aplicação vem com vários Tiltfiles de exemplo que mostram as práticas recomendadas para usar o Tilt, além de uma publicação no blog que explica cada um deles.
Para este artigo, vamos usar o exemplo de Dockerfile otimizado. Veja o Tiltfile fornecido:
Analisando o que esse Tiltfile faz, ele usa a função docker_build para criar a imagem example-node-js-image a partir do Dockerfile desta pasta. Também cria um recurso k8s_yaml usando o arquivo kubernetes.yaml e associa a ele um k8s_resource, com encaminhamento de porta para a porta 8000. Há também um local_resource definido, que grava a hora atual em um arquivo e cria uma dependência com o k8s_resource. Isso garante que ele seja executado antes da atualização do recurso e permite medir o tempo de implantação. Saiba mais sobre todas as funções compatíveis com a API do Tilt na documentação.
Também temos um Dockerfile, que instala as dependências necessárias para a aplicação usando o yarn:
Nossa aplicação é bem simples: um aplicativo Node.js que exibe uma página da web na porta 8000:
Agora que o cluster está implantado, podemos iniciar o Tilt. Na pasta que contém nosso Tiltfile, basta executar:
Com o Tilt em execução no terminal, pressione a barra de espaço para abrir a interface do Tilt no navegador.

O Tilt executará o Tiltfile e iniciará todos os recursos definidos. No nosso caso, isso significa criar a imagem, implantá-la no Kubernetes e configurar o encaminhamento de porta para acessar a aplicação.
Com o kubectl, podemos confirmar que o pod que executa a aplicação está em execução:
Agora, se acessarmos http://localhost:8000, veremos a própria aplicação:

Com o Tilt em execução, qualquer alteração nos diretórios e arquivos monitorados fará com que o Tiltfile seja executado novamente. A aplicação será criada e reimplantada automaticamente.
Agora, vamos ver como integrar o Snyk a esse fluxo de trabalho. Se ainda não tiver feito isso, instale a Snyk CLI e crie uma conta gratuita no Snyk.
Primeiro, precisamos carregar a extensão do Snyk no Tiltfile:
Ao fazer isso, você verá que o Tilt executa o Tiltfile novamente de forma automática. Na pasta da aplicação, aparecerá o diretório tilt_modules, que contém a extensão do Snyk. As extensões são, na verdade, Tiltfiles que são carregados no Tiltfile principal.
Com a extensão do Snyk carregada, podemos usá-la para adicionar o Snyk ao nosso fluxo de trabalho do Tilt. A extensão é compatível com os três modos disponíveis na Snyk CLI: podemos analisar contêineres, dependências de pacotes e arquivos de infraestrutura como código — neste caso, YAML do Kubernetes. Ela também foi projetada para ser o mais flexível possível, permitindo criar diferentes fluxos de trabalho no Tilt.
Vamos começar analisando nosso YAML do Kubernetes. No Tiltfile, chamamos a extensão do Snyk e a configuramos para analisar o arquivo kubernetes.yaml:
A extensão aceita vários argumentos. Consulte a documentação completa no README. Aqui, definimos kubernetes.yaml como alvo, especificamos uma análise de IaC, damos um nome ao recurso, definimos o modo como info e configuramos o acionamento manual. O sinalizador de modo pode ser info ou gate. No modo info, o processo sempre retorna código zero, mesmo que encontre vulnerabilidades, ou seja, não será considerado uma falha na interface do Tilt. Se definirmos o acionamento como auto, a análise será executada sempre que o Tilt detectar alterações em kubernetes.yaml. No modo manual, precisamos acioná-la pela interface do Tilt.
Depois de salvar o Tiltfile, veremos na interface do Tilt um novo link na barra lateral, chamado snyk-iac-manual.

Esse item tem um botão de atualização, indicando que podemos executá-lo manualmente. Vamos fazer isso.

Ao executar a análise, vemos a Snyk CLI ser chamada para analisar kubernetes.yaml e os resultados aparecem na interface. Embora tenhamos identificado vários possíveis problemas de segurança nesse arquivo, o teste ainda aparece como concluído com sucesso, pois definimos o modo informativo. Vamos ver o que acontece se definirmos o modo como gate. No Tiltfile, altere a configuração desta verificação:
Assim que o Tiltfile é executado novamente, vemos na interface que o botão de atualização da verificação manual está destacado. Isso indica que ela está fora de sincronia com as outras etapas e precisa ser atualizada.

Agora, vamos executar novamente a configuração atualizada:

Como agora definimos o recurso como gate, o Tilt o identifica como uma falha de compilação.
Agora, vamos ver as opções para integrar a análise de contêineres ao fluxo de trabalho do Tilt. É importante saber que o Tilt usa tags imutáveis. Assim, cada compilação recebe uma tag exclusiva, que também é passada ao Kubernetes. Isso acelera o processo de implantação. Saiba mais sobre os detalhes aqui.
Por padrão, ao usar a função docker_build, você verá várias dessas tags imutáveis ao consultar as imagens no Docker:
Isso também cria um desafio para a análise: atualmente, não há um recurso integrado que permita acessar essas tags em outros pontos do Tiltfile. Para analisar a imagem com o Snyk, precisamos saber qual é a tag.
No entanto, há algumas opções para contornar isso. O Tilt oferece uma função para definir suas próprias etapas de compilação, e podemos usá-la para desenvolver nosso fluxo de trabalho.
Primeiro, vamos configurar uma etapa de análise manual. Para isso, vamos tornar a tag da imagem mutável, fixando seu valor para que todas as compilações usem a mesma tag. Antes da implantação, o Tilt atribuirá à compilação uma nova tag imutável.
No Tiltfile, vamos remover a função docker_build e substituí-la por custom_build:
Aqui, vamos chamar o Docker, como faria a função docker_build, mas adicionando a variável de ambiente especial $EXPECTED_REF. Também especificamos tag=’dev’,, que o Tilt usará para definir essa variável. Depois de salvar o Tiltfile, veremos que o Tilt criou uma imagem com uma tag mutável e, em seguida, atribuiu uma nova tag:
Aqui, definimos como alvo a tag conhecida, especificamos o modo de contêiner, demos um nome à análise e escolhemos o modo informativo. Como o Dockerfile está no nosso diretório, também podemos incluí-lo no argumento extra_opts para receber sugestões de imagens-base.

Agora, temos na barra lateral a análise manual de contêineres, que podemos executar.

Pronto: acionamos a análise de contêineres manualmente. Mas e se quisermos executá-la automaticamente a cada compilação no Tilt? Esse cenário é um pouco mais desafiador, pois o Tilt ainda não oferece suporte muito avançado a dependências anteriores ou posteriores à compilação. Poderíamos chamar o Snyk diretamente dentro da função custom_build, mas o objetivo da extensão é oferecer uma forma flexível para que cada pessoa integre as análises do Snyk aos seus fluxos de trabalho.
Primeiro, vamos modificar nossa função custom_build. Vamos remover o argumento tag=’dev’, para que $EXPECTED_REF receba a tag imutável gerada automaticamente pelo Tilt. A cada compilação, vamos gravar essa tag em um arquivo no sistema de arquivos. Usamos printf para evitar que sejam adicionadas quebras de linha ao final da tag no arquivo.
Também vamos adicionar uma função para obter a tag do arquivo. A função read_file retorna um blob, então precisamos convertê-lo em uma string e remover as quebras de linha:
Em seguida, vamos chamar a extensão do Snyk, definir como alvo a saída da função get_tag, configurar o acionamento como auto e criar uma dependência do arquivo no sistema de arquivos. Assim, sempre que ele for alterado, a extensão será executada.
Depois de salvar o Tiltfile novamente, veremos que, sempre que a compilação for executada, também vamos acionar automaticamente
a análise do Snyk.

Por fim, vamos analisar as dependências do código-fonte da aplicação. Como se trata de uma aplicação Node.js que usa o yarn como gerenciador de pacotes, temos na pasta um arquivo yarn.lock que mostra as versões dos módulos utilizados.
Podemos analisá-lo automaticamente com o Snyk para verificar se há vulnerabilidades:

Neste caso, a aplicação é bem simples e nenhuma das dependências tem vulnerabilidades. Tudo certo!
O Tilt é realmente uma ferramenta fantástica, que pode acelerar muito o desenvolvimento local de aplicações Kubernetes baseadas em microsserviços. Além disso, oferece inúmeras opções de configuração para que você crie o fluxo de trabalho ideal para suas necessidades.
Neste artigo, vimos várias maneiras de integrar as análises do Snyk aos fluxos de trabalho do Tilt usando a extensão do Snyk para Tilt, ajudando a manter seguras suas aplicações nativas da nuvem e suas configurações. Crie uma conta gratuita no Snyk e experimente.
Comece a participar de desafios de Capture the Flag
Aprenda a resolver desafios de Capture the Flag assistindo sob demanda ao nosso workshop virtual introdutório.


