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

Banco de Dados

Entenda o risco das injeções de dados e como prevenir em desenvolvimento de software

Neste artigo, vamos entender o motivo pelo qual as injeções de dados (SQL Injections) estão no Top 10 da OWASP e o porquê dessa classe de vulnerabilidades precisar de atenção

Treinamentos

Guia para usar a DeepSeek

Como Usar a DeepSeek: Guia para Usuários e Desenvolvedores A DeepSeek não é apenas um modelo de IA revolucionário, mas também uma ferramenta altamente acessível para usuários comuns e desenvolvedores.

Banco de Dados

Migrando dados do Moodle de PostgreSQL para Elasticsearch: um guia passo a passo

Recebi a missão de gerar relatórios e estatísticas com os dados do Moodle. Porém, o LMS trabalha somente com bancos de dados relacionais como PostgreSQL e MySQL. O ambiente que