Introdução
Section titled “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
Section titled “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
Section titled “Riscos”Executar o container com usuário root
Section titled “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
Section titled “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
Section titled “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.