Segurança e Boas Práticas na Criação e Geração de Imagens Docker: Do Dockerfile ao Deploy com Hadolint, SonarQube e Trivy
A conteinerização revolucionou a forma como desenvolvemos e implantamos aplicações, oferecendo consistência e escalabilidade.
No entanto, com essa evolução, a segurança se torna uma preocupação crucial. Neste post, vamos explorar as melhores práticas para criar
imagens Docker seguras, desde a elaboração do Dockerfile utilizando boas práticas e ferramentas como Hadolint e SonarQube, até a
implementação de uma pipeline de deploy com Trivy.
No entanto, com essa evolução, a segurança se torna uma preocupação crucial. Neste post, vamos explorar as melhores práticas para criar
imagens Docker seguras, desde a elaboração do Dockerfile utilizando boas práticas e ferramentas como Hadolint e SonarQube, até a
implementação de uma pipeline de deploy com Trivy.
Por Que a Segurança em Imagens Docker é Essencial?
Imagens Docker comprometidas podem expor aplicações a vulnerabilidades, afetando a integridade dos sistemas e a confidencialidade dos dados.
Implementar medidas de segurança desde a concepção do Dockerfile até o deploy é fundamental para mitigar riscos.
Implementar medidas de segurança desde a concepção do Dockerfile até o deploy é fundamental para mitigar riscos.
Boas Práticas na Criação do Dockerfile
1. Utilize Imagens Base Oficiais e Atualizadas
Opte por imagens oficiais do Docker Hub ou registries confiáveis. Imagens oficiais são mantidas pela comunidade ou por fornecedores, garantindo
atualizações regulares e patches de segurança.
atualizações regulares e patches de segurança.
FROM node:22-alpine
2. Evite a Tag latest
Especifique versões específicas para garantir consistência e evitar surpresas com atualizações inesperadas.
3. Execute como Usuário Não-Root
Evite executar processos como root dentro do container. Crie um usuário com privilégios limitados utilizando a instrução **USER** no Dockerfile.
Isso minimiza os riscos em caso de comprometimento do container, limitando o impacto potencial.
Isso minimiza os riscos em caso de comprometimento do container, limitando o impacto potencial.
RUN addgroup -g 1001 -S nginxgroup && \
adduser -S -D -H -u 1001 -G nginxgroup nginxuser
4. Utilize Multistage Builds
Reduza o tamanho da imagem final e isole dependências de build. Com multistage builds, você pode separar as etapas de compilação e execução,
resultando em imagens menores e mais seguras.
resultando em imagens menores e mais seguras.
# Etapa de build
FROM node:22-alpine AS builder
# Definir diretório de trabalho
WORKDIR /app
# Copiar arquivos de dependências para aproveitar o cache do Docker
COPY frontend/package*.json ./
# Instalar dependências de produção e limpar o cache do npm
RUN npm ci –only=production && npm cache clean –force
# Copiar o código fonte
COPY frontend ./
# Construir a aplicação
RUN npm run build
# Etapa final
FROM nginx:1.27.2-alpine3.20
# Remover configuração padrão do Nginx
RUN rm /etc/nginx/conf.d/default.conf
# Copiar configuração customizada do Nginx
COPY frontend/nginx.conf /etc/nginx/conf.d
# Copiar arquivos construídos da etapa de build
COPY –from=builder /app/build /usr/share/nginx/html
# Criar usuário e grupo não-root
RUN addgroup -g 1001 -S nginxgroup && \
adduser -S -D -H -u 1001 -G nginxgroup nginxuser
# Alterar permissões das pastas necessárias
RUN chown -R nginxuser:nginxgroup /usr/share/nginx /var/cache/nginx /var/run
# Mudar para o usuário não-root
USER nginxuser
# Expor a porta 8080 (ajustar nginx.conf para ouvir nesta porta)
EXPOSE 8080
# Healthcheck para verificar se o Nginx está rodando
HEALTHCHECK CMD curl –fail http://localhost:8080/ || exit 1
# Comando de inicialização
CMD [“nginx”, “-g”, “daemon off;”]
5. Mantenha Segredos Fora do Dockerfile
Nunca inclua informações sensíveis no Dockerfile. Utilize variáveis de ambiente ou serviços de gerenciamento de segredos, como o
Docker Secrets ou ferramentas externas como o HashiCorp Vault.
Docker Secrets ou ferramentas externas como o HashiCorp Vault.
6. Minimize o Número de Camadas
Agrupe comandos **RUN** quando possível para reduzir o número de camadas e o tamanho da imagem.
7. Limpe Cache e Pacotes Desnecessários
Remova caches de instalação e arquivos temporários após instalar pacotes para reduzir o tamanho da imagem e eliminar possíveis vulnerabilidades.
Hadolint: Análise Estática do Dockerfile
Escrever e construir imagens Docker eficientes e seguras pode ser desafiador. É aqui que entra o Hadolint, um linter que analisa Dockerfiles
em busca de más práticas, erros de sintaxe e vulnerabilidades potenciais, ajudando a desenvolver seguindo as melhores práticas e evitando erros comuns.
em busca de más práticas, erros de sintaxe e vulnerabilidades potenciais, ajudando a desenvolver seguindo as melhores práticas e evitando erros comuns.
O que é o Hadolint?
Hadolint é uma ferramenta de código aberto escrita em Haskell que realiza análise estática em Dockerfiles. Ele verifica o código em busca
de problemas de estilo, erros comuns, más práticas e potenciais vulnerabilidades de segurança, fornecendo feedback imediato e otimizando o tempo ao validar sua imagem.
de problemas de estilo, erros comuns, más práticas e potenciais vulnerabilidades de segurança, fornecendo feedback imediato e otimizando o tempo ao validar sua imagem.
Onde Utilizar o Hadolint?
- Ambientes de Desenvolvimento: Integrado ao editor de código ou IDE, oferece feedback em tempo real durante a codificação.
- Pipelines de CI/CD: Implementado como uma etapa de validação antes de builds ou deploys.
- Revisões de Código: Auxilia em code reviews para garantir conformidade com as melhores práticas.
- Projetos de Código Aberto: Garante qualidade e segurança em contribuições da comunidade.
Como Funciona o Hadolint?
O Hadolint analisa o Dockerfile linha por linha, aplicando um conjunto de regras predefinidas que são customizáveis. As regras podem ser personalizadas
ou desabilitadas conforme a necessidade. A ferramenta também suporta diferentes formatos de saída, como JSON, texto simples e integração com linters de editores
como o Visual Studio Code.
ou desabilitadas conforme a necessidade. A ferramenta também suporta diferentes formatos de saída, como JSON, texto simples e integração com linters de editores
como o Visual Studio Code.
Instalação
A instalação do Hadolint é simples e pode ser feita de várias maneiras:
- Binário Precompilado: Disponível para download na página oficial do GitHub.
- Gerenciadores de Pacotes: Pode ser instalado via apt, dnf ou brew no macOS.
- Docker: Executável como um container Docker, eliminando a necessidade de instalação local.
Uso Básico
Para usar o Hadolint, basta executar no seu terminal:
$ hadolint Dockerfile
Isso executará a análise e retornará quaisquer avisos ou erros encontrados.
Pontos Positivos do Hadolint
- Personalização: Permite habilitar ou desabilitar regras conforme a necessidade do projeto.
- Integração: Compatível com diversos editores, IDEs e sistemas de CI/CD.
- Comunidade Ativa: Atualizações frequentes e suporte da comunidade.
- Leveza: Rápido e consome poucos recursos, adequado para uso em pipelines automatizados.
- Feedback Imediato: Ajuda a identificar e corrigir problemas rapidamente.
Pontos Negativos do Hadolint
- Falsos Positivos/Negativos: Pode não capturar todos os problemas ou sinalizar questões irrelevantes.
- Curva de Aprendizado: Novos usuários podem levar algum tempo para entender e configurar adequadamente as regras.
- Limitações na Análise Dinâmica: Não substitui testes de runtime ou análises de segurança dinâmicas.
- Dependência de Atualizações: Requer atualizações frequentes para manter-se alinhado com as últimas práticas e comandos do Docker.
SonarQube: Análise de Qualidade de Código
O SonarQube é uma ferramenta open-source escrita em Java, utilizada para analisar e classificar a qualidade do código-fonte de uma aplicação. Embora não seja específica para Docker, garantir a qualidade e segurança do código que compõe sua aplicação é essencial
para a segurança geral do ambiente Docker.
para a segurança geral do ambiente Docker.
Como Funciona?
O SonarQube analisa o código em busca de bugs, vulnerabilidades e code smells, além de medir a cobertura de testes. Ele pode ser integrado
em pipelines de CI/CD, realizando análises automáticas a cada commit ou Pull Request (PR)
em pipelines de CI/CD, realizando análises automáticas a cada commit ou Pull Request (PR)
Uma prática comum é configurar o SonarQube para analisar o código quando um PR é criado. Se o código não atender aos padrões de qualidade
estabelecidos, o PR é reprovado, e o desenvolvedor recebe feedback sobre os pontos a serem corrigidos. Isso otimiza o tempo de desenvolvimento
e aumenta a segurança da aplicação.
estabelecidos, o PR é reprovado, e o desenvolvedor recebe feedback sobre os pontos a serem corrigidos. Isso otimiza o tempo de desenvolvimento
e aumenta a segurança da aplicação.
Um exemplo pratico do SonarQube:
Após a instalação do SonarQube em seu projeto via npm, criaremos no diretório raiz do seu projeto, um arquivo **sonar-project.properties**
com o seguinte conteúdo:
com o seguinte conteúdo:
sonar.projectKey=nome-do-projeto
sonar.projectName=Nome do Projeto
sonar.projectVersion=1.0
sonar.sources=.
sonar.host.url=http://localhost:9000
sonar.login=seu-token-ou-usuário
- sonar.projectKey: Identificador único do seu projeto no SonarQube.
- sonar.sources: Diretório onde o código fonte está localizado. O ponto (.) indica o diretório atual.
- sonar.login: Você pode gerar um token de autenticação no SonarQube em Meu Perfil > Tokens de Segurança.
Executar o Scanner
Vá até o diretório do seu projeto e execute o SonarQube em seu terminal:
$ sonar-scanner
Após a conclusão da análise, acesso o dashboard do SonarQube em **http://localhost:9000**. Navegue até o seu projeto para ver os resultados
da análise, incluindo bugs, vulnerabilidades, code smells e cobertura de testes.
da análise, incluindo bugs, vulnerabilidades, code smells e cobertura de testes.
Após utilizar o SonarQube em seu fluxo de desenvolvimento você terá uma melhora significativa na qualidade e segurança do código.
Benefícios
- Detecção de Vulnerabilidades: Identifica problemas de segurança no código-fonte.
- Melhoria Contínua: Fornece feedback para aprimorar a qualidade do código ao longo do tempo.
- Customização: Permite configurar regras de qualidade de acordo com as necessidades do projeto.
- Integração com CI/CD: Compatível com ferramentas como GitHub Actions, GitLab CI/CD, Jenkins e outras.
Trivy: Escaneamento de Vulnerabilidades em Imagens
Chegamos à última parte, onde vamos falar sobre o Trivy, uma ferramenta de código aberto que oferece uma solução abrangente para a detecção
de vulnerabilidades e configurações incorretas, desde contêineres até código-fonte e infraestrutura como código.
de vulnerabilidades e configurações incorretas, desde contêineres até código-fonte e infraestrutura como código.
O que é o Trivy?
Trivy é uma ferramenta de escaneamento de segurança desenvolvida pela Aqua Security. Suportando uma variedade de formatos e podendo ser
facilmente integrada em pipelines de CI/CD, ela nos ajuda a detectar:
facilmente integrada em pipelines de CI/CD, ela nos ajuda a detectar:
- Vulnerabilidades em pacotes do sistema operacional (como Alpine, RHEL, CentOS, etc.).
- Vulnerabilidades em dependências de aplicações (como RubyGems, NPM, Pip, etc.).
- Configurações incorretas em arquivos de infraestrutura como código (IaC), como Terraform, Kubernetes YAML, Dockerfiles, entre outros.
Como Funciona o Trivy?
O Trivy funciona escaneando os artefatos especificados e comparando-os com uma base de dados de vulnerabilidades conhecidas. Ele suporta
múltiplos tipos de escaneamento, incluindo:
múltiplos tipos de escaneamento, incluindo:
- Imagens de Contêiner
- Código-Fonte
- Repositórios Remotos
- Clusters Kubernetes
Como Utilizar o Trivy?
Escaneamento de Imagens de Contêiner
Para escanear uma imagem de contêiner, execute no terminal:
$ trivy image nome-da-imagem
O Trivy irá escanear a imagem especificada em busca de vulnerabilidades nos pacotes do sistema operacional e nas dependências da aplicação.
Escaneamento de Kubernetes
Para buscar vulnerabilidades em seu cluster Kubernetes:
$ trivy kube cluster
Este comando analisará os recursos do cluster e relatará quaisquer vulnerabilidades ou configurações incorretas.
Integração em Pipelines CI/CD
O Trivy pode ser facilmente integrado em pipelines de CI/CD, permitindo que vulnerabilidades sejam detectadas cedo no ciclo de desenvolvimento.
Isso ajuda a evitar que código vulnerável seja implantado em produção.
Isso ajuda a evitar que código vulnerável seja implantado em produção.
Um exemplo de como pode ser implementado em sua pipeline:
stages:
– scan
security_scan:
stage: scan
image: docker:stable
services:
– docker:stable-dind
before_script:
– apk add –no-cache curl
– echo $DOCKER_PASSWORD | docker login -u $DOCKER_USERNAME –password-stdin
script:
– curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh -s — -b /usr/local/bin v0.19.2
– trivy –no-progress –format json -o scanning-report.json $IMAGE_NAME:$IMAGE_TAG
– if grep -q ‘Critical’ scanning-report.json; then exit 1; fi
artifacts:
paths:
– scanning-report.json
Após a conclusão da pipeline será gerado um arquivo JSON (se você estiver utilizando por exemplo GitLab CI/CD) dentro de **BUILD** > **Artifacts**,
onde vai estar o resultado do Trivy, passando assim o relatório por exemplo da imagem.
onde vai estar o resultado do Trivy, passando assim o relatório por exemplo da imagem.
Pontos Positivos do Trivy
- Abrangência: Suporta múltiplos tipos de escaneamento.
- Facilidade de Uso: Simples de instalar e executar.
- Integração: Fácil integração com pipelines de CI/CD.
- Atualizações Frequentes: Mantém a base de dados de vulnerabilidades atualizada.
Pontos Negativos do Trivy
- Tempo de Escaneamento: Pode ser demorado em imagens grandes.
- Falsos Positivos: Como outras ferramentas, pode reportar vulnerabilidades irrelevantes.
- Dependência de Internet: Necessita acesso à internet para atualizar a base de dados.
Conclusão
Ao incorporar estas ferramentas e boas práticas em seu fluxo de desenvolvimento, você cria um ambiente seguro, escalável e alinhado com
as recomendações da comunidade. A segurança deve ser uma prioridade em todas as etapas do desenvolvimento e implantação de aplicações Docker.
Ao adotar boas práticas na criação do Dockerfile e utilizar ferramentas como Hadolint, SonarQube e Trivy, você fortalece a segurança e a qualidade
das suas aplicações, mitigando riscos e garantindo a confiabilidade do seu ambiente.
as recomendações da comunidade. A segurança deve ser uma prioridade em todas as etapas do desenvolvimento e implantação de aplicações Docker.
Ao adotar boas práticas na criação do Dockerfile e utilizar ferramentas como Hadolint, SonarQube e Trivy, você fortalece a segurança e a qualidade
das suas aplicações, mitigando riscos e garantindo a confiabilidade do seu ambiente.
About author
Você pode gostar também
Descubra as vantagens do Linux e como migrar facilmente para ele
O Linux é um sistema operacional que tem ganhado popularidade entre usuários comuns, principalmente por ser gratuito e de código aberto. Mas o que exatamente o Linux pode oferecer para
Seja o melhor aluno e garanta sua contratação na 4Linux
A 4Linux escolherá 20 pessoas para realizarem gratuitamente seus cursos Devops e garante contratar o melhor aluno, venha para o caça talentos Devops. Quem pode participar? Poderá participar todas as
Terraform e Gitlab-CI: Como gerenciar sua infraestrutura em nuvem
Introdução O Terraform é uma ótima ferramenta para fazer o gerenciamento de sua infraestrutura em nuvem, normalmente iniciamos projetos de terraform rodando os principais comandos de construção e deleção de





