Dicas e boas práticas de segurança em Containers!

Filipe Alves
Linux & World Open-Source
4 min readMay 29, 2020

Blindando seus containers contra invasores.

Segurança no mundo de aplicações em contêineres

Com o surgimento de aplicações em contêineres, muitos começaram a aderir essa nova modalidade de entregar aplicações, que trazem diversos benefícios, mas nem todos se atentam as boas praticas de segurança que é preciso para ter um ambiente seguro.

Geralmente em ambiente produtivo esses containers rodam em cima de um orquestrador de contêineres como Kubernetes, OpenShift ou Docker Swarm. É preciso cuidar da segurança desde o contêiner, orquestrador e ate o sistema operacional.

Contêiner

Maquina Virtual vs Contêiner

Como já sabemos, um contêiner nada mais é que um mecanismo de empacotamento lógico em que os aplicativos podem ser abstraídos pelo ambiente em que são efetivamente executados(um ambiente isolado). Os principais Container Runtimes que existe hoje como Docker e Podman, rodam sobre o LXC (Linux Containers) que é um método de isolamento/virtualização de contêineres no nível do S.O, usando um único kernel.

Esse isolamento se faz por três ferramentas principais:

  • chroot: faz o isolamento do sistema de arquivos, limitando o contêiner a um diretório.
  • cgroups: faz o gerenciamento dos recursos como CPU e Memória.
  • namespaces: faz isolamento dos processos do contêiner, limitando-o a enxergar somente seus processos.

Abaixo veremos algumas preocupações que devemos ter e possíveis soluções relacionadas a segurança quando usamos contêineres.

Boas praticas Contêiner

  • Sempre utilizar imagens oficiais, ou de repositórios confiáveis para não ser vítima de imagens envenenadas (Poisoned images).
Ex: Imagem Debian Oficial.
  • Nunca utilize um contêiner com usuário root, quando não definimos um usuário, por padrão o contêiner roda como root. Caso um invasor consiga acesso ao contêiner e estiver como root, poderá ter o controle total daquele contêiner (Container breakouts).
Using a non-root user.
  • Utilize sistema de arquivo Read-Only (Somente Leitura), Contêineres foram feitos na sua maioria, para serem Stateless e suas imagens serem imutáveis. Logo não permita um contêiner a escrever algo em disco, se for necessário, utilize um Volume separado para isso. Isso evitará que o contêiner seja modificado caso seja invadido.
Read-Only File System.
  • Não use variáveis de ambiente para armazenar senhas/tokens, muito menos incorpore esses segredos nas aplicações. Utilize Secretes Manager (Docker, Kubernetes) que funciona como um cofre, onde colocamos coisas sensíveis lá, e só quem tem a chave do cofre consegue utilizar.
  • Faça Scan nas Imagens de containers periodicamente, para saber se elas possuem alguma vulnerabilidade (CVE’s), em ferramentas como Synk, AWS ECR ou Clair-scanner.
Example vulnerabilities of Image (Clair scanner).
  • Faça EXPOSE apenas de portas (privada) padrões da aplicação:
# NUNCA faça mapeamento público e privado
EXPOSE 80:8080

# Apenas privado
EXPOSE 80

Boas Práticas Orquestrador

  • Instalar seu orquestrador (Kubernetes, Openshift ou Swarm) em partição separada da raiz(/), juntamente do diretório de armazenamento das imagens de contêiner.
  • Rodar o orquestrador com usuário próprio (não utilizar root).
  • Imponha controle de acesso nos nós do cluster usando ferramentas como SELinux, AppArmor.
  • Sempre manter o S.O, orquestrador e imagens de contêiner atualizados.

Kubernetes/Openshift

  • Como os contêineres compartilham recursos do kernel, se um contêiner monopolizar os recursos, outros ficarão sem. Sempre limite os recursos de um contêiner, para no caso de um ataque ou até mesmo um bug, não levar a um DoS (Denial of Service/Ataque de negação de serviço).
Resources Limits.
  • Ao contrário de uma VM, ao usar containers, o kernel é compartilhado entre os containers. Defina securityContext dos Pods, para restringir execuções/elevação de privilégios indesejadas de vulnerabilidade que exploram o kernel (Kernel Exploits).
SecurityContext.
  • Utilize Pod Security Policy, ele define as condições com as quais um pod deve ser executado.
Pod Security Policy.

E por fim, para uma melhor performance, crie o minimo de camadas possíveis, e faça o uso do multi-stage build sempre que possível.

Vou ficando por aqui, ate a próxima galera!

Fontes:

--

--