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 runtimeWORKDIR /appCOPY . .RUN npm installRUN npm run buildEXPOSE 4321CMD npm run startAqui 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.12RUN groupadd -r myuser && useradd -r -g myuser myuser<HERE DO WHAT YOU HAVE TO DO AS A ROOT USER LIKE INSTALLING PACKAGES ETC.>USER myuserVocê 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 alpineFROM alpine:3.12CNHD003 - 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.