Segurança e Boas Práticas na Criação e Geração de Imagens Docker: Do Dockerfile ao Deploy com Hadolint, SonarQube e Trivy

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.

 

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.

 

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.
     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.
     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.
        # 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.

 

 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.

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.

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.

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.

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)
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.

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:
        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.

 

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.

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:

 

  • 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:
  • 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.

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.

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.

 

Anterior Opinião: Em Defesa de IAs Generativas Open Source – Questão de Soberania Digital para o Brasil
Próxima Como Instalar o DeepSeek Localmente: Guia Passo a Passo

About author

Você pode gostar também

Infraestrutura TI

Vagrant: o que é, onde vive e o que come? Aqui no blog da 4Linux!

A tecnologia nunca foi algo provisório ou estacionário, a todo momento vemos mudanças e essas são sempre acompanhadas de desafios. Estar antenado com atualizações e lançamentos é uma tarefa árdua,

Containers

Descubra como o Helm facilita a instalação de aplicações no Kubernetes

O que é? O Helm é um gerenciador de pacotes para o Kubernetes que permite que os desenvolvedores e operadores configurem e implantem mais facilmente aplicativos nos clusters do Kubernetes.

Desenvolvimento

Guia passo a passo para construir uma API RESTful com Laravel

Nessa série de artigos veja como construir uma API RESTful para consulta de usuários em uma base de dados com ajuda do frawework Laravel. Mostrei como montar toda estrutura necessária,