Skip to content

Hardening Container Images

Introdução

A construção de imagens de containers de forma segura é essencial para garantir a integridade, confidencialidade e disponibilidade dos aplicativos que executam em forma de containers. Com a crescente adoção de containers para desenvolvimento e distribuição de software, a segurança se torna uma preocupação primordial. Imagens de containers mal configuradas ou vulneráveis podem ser exploradas por atacantes, resultando em comprometimento de dados, interrupção de serviços e outras ameaças à segurança. Portanto, é muito importante seguir práticas recomendadas de hardening para minimizar a superfície de ataque, proteger dados sensíveis e garantir que os containers operem de maneira segura e eficiente.

Nessa seção veremos alguns pontos a tomar cuidado ao criar os containeres de nossas aplicações.

Cenário Vulnerável

Olhe o arquivo Dockerfile abaixo e pense o que pode estar de errado com ele:

FROM node AS runtime
WORKDIR /app
COPY . .
RUN npm install
RUN npm run build
EXPOSE 4321
CMD npm run start

Aqui temos 2 pontos de falha, ao qual iremos aprender a melhorar nesse guia:

  • Utilização do usuário root para execução do container
  • Ausência da definição de uma versão base específica

Adicionalmente, é indicado que uma vez construído o container seja executado um scan de vulnerabilidades com objetivo de buscar por vulnerabilidades críticas.

Riscos

Executar o container com usuário root

Ao executar nosso container como root permitimos que, caso um agente de ameaça consiga explorar alguma vulnerabilidade em nossa aplicação, ele possua muitos privilégios em nosso container. O usuário root também tem permissões a arquivos que podem conter dados sensíveis e dessa forma ao explorar um vulnerabilidade um agente de ameaça pode ter acesso a essas informações.

Executar o container com imagens não oficiais e com a versão latest

Ao executar nosso container com imagens não oficias corremos riscos de rodar container contendo vulnerabilidades e/ou backdoors. Da mesma forma, executar nosso container sempre com a versão latest pode gerar alguns reflexos inesperados, que podem causar imcompatibilidade e afetar a disponbilidade do nosso software.

Como mitigar

A segir você verá uma lista de requisitos de segurança para que você possa mitigar os riscos citados acima.

CNHD001 - Defina um usuário para a execução

Defina um usuário para a execução do seu programa.

FROM alpine:3.12
RUN groupadd -r myuser && useradd -r -g myuser myuser
<HERE DO WHAT YOU HAVE TO DO AS A ROOT USER LIKE INSTALLING PACKAGES ETC.>
USER myuser

Você também pode optar por executar o container no modo rootless.

CNHD002 - Escolha uma imagem oficial e use com a tag específica

Normalmente acabamos utilizando myimage:latest, porém podemos ter algumas surpresas desagradáveis caso alguma destas imagens seja atualizada, podendo quebrar nosso código.

Então utilize apenas imagens oficiais com a tag bem definida:

FROM alpine
FROM alpine:3.12

CNHD003 - Execute um scan de vulnerabilidades

Sempre que for realizar o build de sua imagem, execute um scan para verificar se não existem vulnerabilidades preocupantes nele (foco principal nas HIGH e CRITICAL).

Uma das opções é utilizar o Trivy.

Referências