ClamAV: detectar malware na VPS Linux

    Linux tem boa reputação de segurança, mas VPS comprometidas por malware são mais comuns do que se pensa — especialmente quando hospedam uploads de usuários, correm scripts de terceiros ou têm serviços desatualizados. ClamAV é o antivírus open-source padrão para Linux, com banco de dados de assinaturas atualizado diariamente.

    Instalar e configurar o ClamAV

    Instalação e configuração inicial no Ubuntu:

    bash
    # Instalar ClamAV e daemon:
    sudo apt install -y clamav clamav-daemon
    
    # Parar o daemon para atualizar as definições:
    sudo systemctl stop clamav-freshclam
    
    # Atualizar banco de dados de vírus:
    sudo freshclam
    
    # Verificar versão e data das definições:
    clamscan --version
    
    # Iniciar o daemon:
    sudo systemctl enable clamav-daemon clamav-freshclam
    sudo systemctl start clamav-daemon clamav-freshclam
    
    # Verificar status:
    sudo systemctl status clamav-daemon
    sudo systemctl status clamav-freshclam
    
    # Configurar atualização automática das definições (já vem configurado):
    cat /etc/clamav/freshclam.conf | grep -E "^Checks|^UpdateLogFile"
    # Checks 24 — atualiza 24 vezes por dia

    Executar scans manuais e automáticos

    Escanear diretórios e configurar scans periódicos:

    bash
    # Scan completo do sistema (pode demorar):
    sudo clamscan -r / --exclude-dir="^/proc" --exclude-dir="^/sys" \
      --exclude-dir="^/dev" -l /var/log/clamav/scan_$(date +%Y%m%d).log
    
    # Scan de diretório específico (uploads de usuários):
    sudo clamscan -r /var/www/uploads --log=/var/log/clamav/uploads.log
    
    # Scan rápido (somente arquivos modificados recentemente):
    sudo clamscan -r /home /var/www /tmp /var/tmp \
      --log=/var/log/clamav/quick_scan.log
    
    # Ver apenas arquivos infectados:
    sudo clamscan -r /var/www/uploads --infected --no-summary
    
    # Mover arquivos infectados para quarentena:
    sudo clamscan -r /var/www/uploads \
      --move=/var/quarantine \
      --log=/var/log/clamav/quarantine.log
    
    # Configurar scan automático via cron:
    # /etc/cron.d/clamav-scan:
    echo "0 2 * * * root clamscan -r /var/www /home /tmp \
      --infected --no-summary \
      --log=/var/log/clamav/daily_$(date +\%Y\%m\%d).log" \
      | sudo tee /etc/cron.d/clamav-scan

    Scan em tempo real de uploads com clamd

    Integrar ClamAV com aplicação Node.js para verificar uploads:

    typescript
    # Usando clamscan diretamente na aplicação (mais simples):
    # npm install clamscan
    
    import NodeClam from 'clamscan'
    
    const clamScan = await new NodeClam().init({
      clamdscan: {
        socket: '/var/run/clamav/clamd.ctl',  // usar socket Unix para performance
        active: true,
      },
    })
    
    async function verificarArquivo(caminho: string): Promise<boolean> {
      const { isInfected, viruses } = await clamScan.isInfected(caminho)
      if (isInfected) {
        console.error('Arquivo infectado detectado:', caminho, viruses)
        // Mover para quarentena ou deletar
        return false
      }
      return true
    }
    
    // No handler de upload (Multer + Express):
    app.post('/upload', upload.single('arquivo'), async (req, res) => {
      const caminhoArquivo = req.file!.path
      const seguro = await verificarArquivo(caminhoArquivo)
      if (!seguro) {
        fs.unlinkSync(caminhoArquivo)  // deletar arquivo infectado
        return res.status(400).json({ error: 'Arquivo bloqueado por segurança' })
      }
      // Processar upload...
    })

    Alertas quando malware é detectado

    Notificar via Telegram quando um arquivo infectado é encontrado:

    bash
    #!/bin/bash
    # /opt/scripts/clamav-scan-alert.sh
    
    LOG_DIR="/var/log/clamav"
    QUARANTINE_DIR="/var/quarantine"
    DATE=$(date +%Y%m%d_%H%M)
    LOG_FILE="$LOG_DIR/scan_$DATE.log"
    TELEGRAM_TOKEN="SEU_TOKEN"
    TELEGRAM_CHAT_ID="SEU_CHAT_ID"
    
    mkdir -p "$QUARANTINE_DIR"
    
    # Executar scan:
    clamscan -r /var/www /home /tmp /var/tmp \
      --infected --no-summary \
      --move="$QUARANTINE_DIR" \
      --log="$LOG_FILE"
    
    # Verificar se encontrou algo infectado:
    INFECTED=$(grep "FOUND" "$LOG_FILE" | wc -l)
    
    if [ "$INFECTED" -gt 0 ]; then
        DETALHES=$(grep "FOUND" "$LOG_FILE" | head -10)
        curl -s -X POST \
          "https://api.telegram.org/bot$TELEGRAM_TOKEN/sendMessage" \
          -d "chat_id=$TELEGRAM_CHAT_ID" \
          -d "text=🚨 ClamAV detectou $INFECTED arquivo(s) infectado(s) na VPS!%0A%0A$DETALHES"
    fi
    
    # Limpar logs antigos (> 30 dias):
    find "$LOG_DIR" -name "scan_*.log" -mtime +30 -delete

    Exclusões e otimização de performance

    Excluir diretórios desnecessários e otimizar o scan:

    bash
    # /etc/clamav/clamd.conf — ajustes de performance:
    # (reiniciar clamav-daemon após alterações)
    
    # Excluir diretórios que não precisam ser escaneados:
    ExcludePath ^/proc
    ExcludePath ^/sys
    ExcludePath ^/dev
    ExcludePath ^/run
    ExcludePath ^/var/lib/docker
    ExcludePath ^/var/lib/lxc
    
    # Limite de memória (padrão é muito alto):
    MaxScanSize 100M        # tamanho máximo de arquivo para escanear
    MaxFileSize 25M         # pular arquivos maiores que 25MB
    MaxRecursion 10         # profundidade de recursão em arquivos compactados
    MaxFiles 10000          # máximo de arquivos num arquivo compactado
    
    # Número de threads:
    MaxThreads 2            # não usar todos os CPUs (manter servidor responsivo)
    
    # Para scan mais rápido — usar clamdtop para monitorar:
    clamdtop

    $ runstack deploy --plan starter

    Não quer configurar manualmente?

    Não quer configurar manualmente? Implante o VPS em menos de 3 minutos com a Runstack. Infraestrutura da OPEN DATACENTER, com servidores no Brasil.

    Perguntas frequentes