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

Não quer configurar manualmente?

Implante o VPS em menos de 5 minutos com a Runstack. Infraestrutura da OPEN Datacenter, com servidores em São Paulo.

Perguntas frequentes

Depende do uso. Risco alto: VPS que processa uploads de usuários (PDFs, imagens, documentos), executa scripts de fontes externas, ou serve como relay de email. Risco menor: VPS apenas com sua própria aplicação sem uploads. Malware em Linux é real, mineradores de criptomoeda, backdoors e rootkits existem e são distribuídos via vulnerabilidades em serviços desatualizados.

Não, o banco do ClamAV inclui malware multiplataforma, scripts maliciosos (PHP, Python, shell), backdoors Linux, rootkits conhecidos, mineradores de cripto e phishing. Para VPS Linux: a detecção mais relevante é de shells PHP maliciosos, scripts de mineração e backdoors em Node.js/Python, não vírus Windows.

clamscan: binário que carrega o banco de dados a cada execução, lento para scans frequentes. clamd: daemon que mantém o banco em memória, muito mais rápido para scans frequentes (como verificação de uploads). Para cron diário: clamscan. Para verificação de cada arquivo upado: clamd via socket UNIX.

clamd usa ~500 MB a 1 GB de RAM para manter o banco de definições em memória. Para VPS com pouca RAM (1-2 GB): considere não rodar clamd como daemon e usar clamdscan apenas para scans periódicos (clamscan consome RAM durante o scan e libera depois). Ajuste MaxScanSize e ExcludePath para reduzir o escopo.

freshclam é o daemon de atualização, roda em background e atualiza as definições. Por padrão no Ubuntu: atualiza 24 vezes por dia. Verificar: sudo freshclam --verbose. Se freshclam falhar: sudo systemctl restart clamav-freshclam. As definições em /var/lib/clamav/ têm data de criação, se com mais de 1 dia: freshclam não está rodando.