Skip to main content

5 práticas recomendadas para a segurança de contêineres

Escrito por

19 de julho de 2022

0 minutos de leitura

A segurança de contêineres é fundamental porque a imagem do contêiner inclui todos os componentes que, em algum momento, executarão sua aplicação. Se houver vulnerabilidades ocultas na imagem, o risco e o possível impacto de problemas de segurança em produção aumentam. Por isso, também é essencial monitorar seu ambiente de produção. Mesmo que você crie imagens sem vulnerabilidades ou privilégios elevados, ainda é necessário ficar de olho na atividade durante a execução.

Em linhas gerais, há cinco etapas fundamentais para criar uma imagem de contêiner segura:

  1. Proteja seu código e suas dependências

  2. Comece com uma imagem-base mínima de uma fonte confiável

  3. Gerencie todas as camadas entre sua imagem-base e seu código

  4. Use o gerenciamento de acesso

  5. Proteja a infraestrutura de contêineres

1. Proteja seu código e suas dependências

A conteinerização é uma forma de entregar aplicações nativas da nuvem com mais rapidez, e esse provavelmente é um dos motivos pelos quais você está criando contêineres. Os contêineres ampliaram o significado de código de aplicação, mas o código continua sendo a parte mais diretamente controlada pelos desenvolvedores. As dependências de código aberto podem facilmente superar em muito a quantidade de código proprietário. Por isso, é importante implementar a análise integrada com ferramentas de análise de composição de software (SCA) e teste estático de segurança de aplicações (SAST) para automatizar a análise do código e das dependências. Também é possível analisar contêineres para detectar problemas diretamente em commits e repositórios do Git, o que provavelmente se encaixa melhor no processo de desenvolvimento.

2. Comece com uma imagem-base mínima de uma fonte confiável

Além de facilitar a portabilidade e acelerar os downloads, reduzir o tamanho também diminui a quantidade de componentes que podem conter vulnerabilidades. O ideal é que cada imagem de contêiner tenha seu código e o mínimo de pacotes adicionais necessários para executar uma aplicação. Na prática, porém, você terá muitas aplicações e precisará encontrar um equilíbrio para facilitar o gerenciamento das imagens de contêiner.

Há muitos fornecedores confiáveis que hospedam imagens-base de contêineres. O Docker Hub é, de longe, o mais popular, com mais de 3,8 milhões de imagens disponíveis, mais de 7 milhões de repositórios e cerca de 11 bilhões de downloads por mês. Algumas são Docker Official Images, publicadas pela Docker como um conjunto selecionado de repositórios de código aberto e soluções “plug-and-play”. A Docker também oferece imagens de alta qualidade mantidas diretamente por Verified Publishers. As diretrizes da Docker para esses Verified Publishers são um ótimo ponto de partida para definir suas próprias boas práticas para imagens de contêiner.

É fácil acessar o Docker Hub e encontrar imagens públicas adequadas ao seu caso de uso, mas é importante verificar a procedência delas: confira se fazem parte do programa Docker Official Images ou se você consegue verificar a origem e o conteúdo com algo como o Notary, que verifica assinaturas digitais e oferece um certo nível de garantia de qualidade.

3. Gerencie todas as camadas entre a imagem-base e seu código

As imagens-base exigem atenção especial: ao criar sua própria imagem sobre uma imagem-base, você herda tudo o que ela contém. Mesmo que comece com uma imagem enxuta, provavelmente precisará adicionar ferramentas e bibliotecas, além do seu código e das instalações necessárias para tudo funcionar. É preciso monitorar todos esses componentes em busca de vulnerabilidades.

A boa notícia é que você pode controlar diretamente essas camadas intermediárias. Mas é importante priorizar onde concentrar sua atenção durante o desenvolvimento, os testes e a implantação em produção. Talvez você precise de ferramentas diferentes em cada etapa, mas, à medida que as imagens se aproximam da produção, remova tudo o que não for absolutamente necessário.

Começar com uma imagem-base mínima e adicionar apenas as ferramentas necessárias facilita removê-las depois: basta excluí-las do Dockerfile e recriar a imagem, ou usar builds em vários estágios para reunir todas essas etapas em um único processo automatizado. Você também pode encontrar vulnerabilidades em ferramentas e pacotes de suporte instalados nas camadas intermediárias, mas que podem ser ignorados com segurança se as imagens de produção não incluírem esses extras. Confira nossa publicação no blog com outras boas práticas para builds em vários estágios.

4. Use o gerenciamento de acesso

No contexto dos contêineres, acesso é a capacidade de um usuário executar uma operação específica em um determinado recurso de contêiner. As atividades típicas se enquadram nas operações gerais de criar, ler, atualizar ou excluir (CRUD). Os detalhes do gerenciamento de acesso dependem da plataforma de contêineres. No Kubernetes, por exemplo, os usuários ficam fora do cluster, o que significa que os administradores precisam gerenciar identidades fora dele usando certificados TLS, OAuth2 ou outros métodos de autenticação.

O acesso a segredos e à rede deve seguir o princípio do menor privilégio. O acesso de administrador deve se limitar à criação da infraestrutura. Para evitar que um contêiner tenha acesso completo a todos os seus recursos, atribua funções e responsabilidades específicas aos contêineres e use ferramentas para facilitar, aplicar e monitorar essas funções.

5. Proteja a infraestrutura de contêineres

Além de proteger a imagem do contêiner ou o contêiner em execução, também é necessário gerenciar a infraestrutura necessária para executar contêineres. Isso começa em um registro de contêineres, como o Docker Hub, e vai até a orquestração em produção com Kubernetes.

Como os registros de contêineres promovem a colaboração ao oferecer um local seguro para armazenar e compartilhar contêineres, eles podem introduzir vulnerabilidades, malware e segredos expostos. Em geral, eles incluem recursos de segurança integrados, e você deve sempre usar um protocolo de segurança, como TLS, ao se conectar a um registro. Da mesma forma, o Kubernetes inclui ferramentas para criar e aplicar controles de segurança no cluster e na rede. Confira nosso artigo sobre segurança de registros de contêineres para saber mais.

Os contêineres devem sempre ser executados em um sistema ou serviço de nuvem seguro. No caso de um serviço, use controles de acesso baseados em função (RBAC) para acessar o registro.

Mais um ponto: os invasores estão concentrando sua atenção em etapas cada vez mais iniciais do pipeline de CI/CD, então não deixe de proteger as primeiras fases do desenvolvimento. Ao criar aplicações e contêineres, é importante analisar o código antes de usá-lo em uma aplicação e antes da implantação. Além disso, é fundamental seguir o princípio do menor privilégio (POLP) e automatizar as verificações de segurança e os controles no pipeline de desenvolvimento.