Docker para desenvolvedores Node.js: 5 dicas para não comprometer sua segurança
25 de janeiro de 2021
0 minutos de leituraO Docker já ultrapassou a marca de 50 bilhões de downloads de imagens de contêiner. Com milhões de aplicações disponíveis no Docker Hub, as aplicações baseadas em contêineres são populares e facilitam o consumo e a publicação de aplicações.
Dito isso, criar suas próprias aplicações web com Docker e Node.js de forma ingênua pode trazer muitos riscos de segurança. Então, como tornar a segurança parte essencial do uso do Docker por desenvolvedores Node.js?
Antes de entrar nos detalhes do Docker com Node.js e da criação de imagens Docker, vamos conferir algumas perguntas frequentes sobre o tema.
Como colocar aplicações Node.js em contêineres Docker?
Executar sua aplicação Node.js em um contêiner Docker pode ser tão simples quanto copiar o diretório do projeto e instalar todos os pacotes npm necessários. Mas há muitas questões de segurança e de produção que você pode deixar passar. Este guia reúne dicas para ambientes de produção sobre como colocar aplicações web Node.js em contêineres com Docker. Ele aborda desde a escolha da imagem base Docker adequada e o uso de compilações em várias etapas até o gerenciamento seguro de segredos e a ativação correta das configurações do framework relacionadas à produção.
Este artigo apresenta informações para você entender melhor o impacto da escolha da imagem base Docker certa para sua aplicação web Node.js e ajudar a encontrar a imagem Docker mais segura disponível para ela.
Como o Docker ajuda quem desenvolve com Node.js?
Ao empacotar sua aplicação Node.js em um contêiner, você reúne a aplicação completa, incluindo o ambiente de execução, as configurações, as dependências no nível do sistema operacional e tudo o que é necessário para que ela funcione em diferentes plataformas e arquiteturas de CPU. Esses pacotes são distribuídos como artefatos prontos para implantação, chamados imagens de contêiner. As imagens Docker são pacotes de software que permitem reproduzir compilações com facilidade e dão a quem desenvolve com Node.js uma maneira de executar o mesmo projeto ou produto em todos os ambientes.
Por fim, os contêineres Docker permitem que desenvolvedores experimentem novas versões de plataformas ou outras mudanças com mais facilidade, sem precisar de permissões especiais nem configurar um ambiente dedicado para executar um projeto.
1. Escolha a imagem base Docker certa para sua aplicação Node.js
Ao criar uma imagem Docker para um projeto Node.js, montamos a imagem da aplicação com base em outra imagem Docker, obtida no Docker Hub. Essa é a imagem base: o alicerce da nova imagem Docker que você vai criar para sua aplicação Node.js.
A escolha da imagem base é fundamental, pois afeta significativamente desde a velocidade de compilação da imagem Docker até a segurança e o desempenho da sua aplicação web. É possível que você esteja escolhendo uma imagem completa de sistema operacional baseada em Debian ou Ubuntu, porque ela permite aproveitar todas as ferramentas e bibliotecas disponíveis nela.
No entanto, isso tem um custo. Se uma imagem base tiver uma vulnerabilidade de segurança, ela também estará na imagem que você criar. Por que começar em desvantagem, escolhendo uma imagem base grande que já contém muitas vulnerabilidades?
Ao analisar as imagens base, vemos que muitas vulnerabilidades de segurança estão na camada do sistema operacional (SO) usada por elas. A pesquisa da Snyk de 2019, Shift Docker security left, mostrou que as vulnerabilidades introduzidas pela camada do SO podem variar bastante conforme a distribuição escolhida.

Aliás, essa preocupação vale para todas as imagens base que você considerar usar. Por exemplo, veja as principais imagens Docker e suas compilações mais recentes no relatório State of Open Source Security de 2020: ele mostra que, por padrão, as imagens base Docker contêm vulnerabilidades de segurança.
2. Analise sua imagem Docker Node.js durante o desenvolvimento
Criar uma imagem Docker com base em outras imagens e recompilá-las pode introduzir novas vulnerabilidades. Mas há uma maneira de acompanhar esse risco.
Trate a criação de imagens Docker como qualquer outra atividade de desenvolvimento. Assim como você testa o código que escreve, também deve testar as imagens Docker que cria.
Esses testes incluem verificações estáticas de arquivos, também conhecidas como linters, para garantir que você evite falhas de segurança e outros padrões inadequados no Dockerfile. Reunimos algumas dessas práticas em nossas melhores práticas de segurança para imagens Docker. Se você desenvolve aplicações Node.js, confira este guia passo a passo com as 10 melhores práticas para colocar aplicações web Node.js em contêineres com Docker.
Conectar seus repositórios Git à Snyk também é uma ótima opção. A Snyk oferece integrações nativas com GitHub, GitLab, Bitbucket e Azure Repos. Com a integração ao Git, podemos analisar suas solicitações de pull e adicionar comentários com informações de segurança caso encontremos vulnerabilidades. Assim, você pode configurar bloqueios e impedir a mesclagem de uma solicitação de pull que introduza novas vulnerabilidades.
Se você precisa de mais flexibilidade para a integração contínua (CI) ou de uma experiência de desenvolvimento mais integrada, conheça a Snyk CLI.
A CLI permite testar facilmente a imagem do seu contêiner Docker. Digamos que você esteja criando uma imagem Docker localmente e a tenha marcado como nodejs:notification-v99.9 — veja como testá-la:
Instale a Snyk CLI:
$ npm install -g snykEm seguida, deixe que a Snyk CLI obtenha automaticamente um token de API para você com:
$ snyk authAnalise a imagem base local:
$ snyk container test nodejs:notification-v99.9
Os resultados do teste são exibidos na tela, junto com informações sobre a CVE e o caminho que introduz a vulnerabilidade, para você saber qual dependência do SO é responsável por ela.
Veja abaixo um exemplo do resultado do teste da imagem base Docker node:15:
Criamos uma folha de consulta rápida da Snyk CLI que mostra algumas das possibilidades da ferramenta. Você também encontra na documentação mais informações sobre como começar a usar a Snyk Container CLI.
3. Corrija as vulnerabilidades do ambiente de execução Node.js nas imagens Docker
Um detalhe muitas vezes ignorado ao gerenciar os riscos de imagens de contêiner Docker é o próprio ambiente de execução da aplicação. Seja ao usar Docker para Java ou executar aplicações web Node.js com Docker, o ambiente de execução Node.js pode ter vulnerabilidades.
Acompanhe as atualizações de segurança do Node.js e siga a política de segurança do Node.js. Em vez de monitorá-las manualmente, aproveite a Snyk para também encontrar vulnerabilidades de segurança no Node.js.
Para contextualizar as vulnerabilidades de segurança nas diferentes tags de imagens base Node.js, analisei algumas delas com a Snyk CLI e organizei os resultados no gráfico de escala logarítmica a seguir:

Você pode ver que:
A tag padrão da imagem base
node, também identificada comonode:latest, reúne mais de 500 vulnerabilidades de segurança e ainda introduz 2 vulnerabilidades no próprio ambiente de execução Node.js. Isso deve preocupar você se estiver executando o Node.js 15 em produção sem ter aplicado correções.A tag
node:alpineda imagem base talvez não inclua dependências vulneráveis do SO — por isso não há uma barra azul —, mas ainda usa uma versão vulnerável do ambiente de execução Node.js mais recente (versão 15).Se você estiver usando uma versão do Node.js sem suporte — por exemplo, o Node.js 10 —, ela estará vulnerável e não receberá atualizações de segurança.
Se você escolhesse o Node.js versão 15, a versão mais recente disponível no momento em que este artigo foi escrito, estaria se expondo não só a 561 vulnerabilidades de segurança no contêiner, mas também a duas vulnerabilidades no próprio ambiente de execução Node.js.
Você pode ver os resultados do teste de análise Docker neste URL público de teste de imagens. Fique à vontade para testar outras tags de imagens base Node.js que você usa com este serviço público e gratuito de análise Docker.

Se você já tem uma conta de usuário Docker, pode usá-la para conectar-se à Snyk e importar rapidamente seus repositórios do Docker Hub.
4. Monitore as imagens Docker implantadas para suas aplicações Node.js
Depois de criar as imagens Docker, provavelmente você as enviará para um registro Docker que mantém o controle delas, para que possam ser implantadas e executadas como aplicações em contêineres.
Por que devemos monitorar as imagens base Docker?
Se você está seguindo todas as orientações de segurança que abordamos até aqui, analisando e corrigindo as imagens base, ótimo. Mas lembre-se: novas vulnerabilidades de segurança são descobertas o tempo todo. Se sua imagem tem 78 vulnerabilidades hoje, isso não significa que amanhã de manhã ainda terá 78: novas CVEs podem ser divulgadas e afetar os contêineres em execução na produção. Por isso, é fundamental monitorar seu registro de imagens de contêiner usadas para implantar contêineres: assim, você fica sabendo rapidamente dos problemas de segurança e pode corrigi-los.
Você pode integrar vários registros de imagens Docker diretamente pelo app da Snyk. Por exemplo, importe imagens do Docker Hub, ACR, ECR, GCR ou Artifactory. A Snyk fará análises regulares e enviará alertas pelo Slack ou por e-mail sobre os problemas de segurança encontrados:

5. Siga as orientações de segurança e as recomendações de produção para ter uma imagem Docker Node.js segura e otimizada
Parabéns por acompanhar até aqui todas as orientações de segurança!
Para concluir, se você quer acompanhar as melhores práticas de segurança para criar imagens Docker otimizadas para Node.js e Java, confira estes recursos:
10 melhores práticas de segurança para Docker — práticas detalhadas que você deve seguir ao criar imagens base Docker e também ao baixá-las. O material também apresenta o Docker Content Trust.
Você desenvolve com Java? Este recurso será útil: Docker para desenvolvedores Java: 5 dicas para não comprometer sua segurança
10 melhores práticas para colocar aplicações web Node.js em contêineres com Docker — Se você desenvolve com Node.js, vai gostar deste passo a passo sobre como criar imagens base Docker seguras e de alto desempenho para suas aplicações.
Comece a testar e corrigir suas imagens de contêiner com a Snyk.
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.
