Integrando o ClamAV com o Samba e o Postfix e o Squid!

Eis que resolvi, finalmente, trabalhar a idéia de instalar um Anti-Vírus no Linux… algo que eu sempre relutei: tanto pela queda de performance que um Anti-Vírus propicia quanto pela falta de necessidade de se utilizar um Anti-Vírus quando você obtem os seus arquivos somente de fontes extremamente confiáveis (e sabe contudo, analizar o conteúdo dos arquivos e cuidar da manutenção do seu sistema caso algo fora do normal venha a ocorrer). Porém.. como costumo criar backups dos meus clientes em um compartilhamento especial do samba, dedicado a escanear os arquivos com Anti-Vírus, o ClamAV se demonstrou como uma opção adicional ao Avast! e ao AVG.. contando também com a possibilidade de integrá-lo ao Samba, ao Postfix e ao Squid!!

Com a minha primeira visita no site do ClamAV, efetuei o download do pacote.. e compilando, pude perceber que ele reclamou de um bug em minha biblioteca bzip2 1.0.4.. e.. para meu conforto a instalação da nova biblioteca bzip2 não atualiza os links simbólicos do sistema automaticamente.. nada grave, mas é preciso atenção 😉

Depois do ClamAV instalado e configurado, pode-se colocar um daemon no background (o clamd, para agilizar os scans e que é utilizado pelo plugin do Squid) e ou os softwares podem utilizar a biblioteca LibClamAV para efetuarem as verificações de vírus (como por exemplo, o nosso módulo de integração ao samba).

Um passo importante é cuidar da atualização do ClamAV. Para isto dispomos do FreshClam, que pode tanto ser executado manualmente quanto em um daemon que roda em background… e a minha idéia, foi incrementar a atualização com um script que avisa por email o resultado detalhado de todas as atualizações! 💡

Simples de se implementar, bastam algumas configurações junto ao seguinte script (que pode ser executado a cada hora ou diariamente em seu sistema):

#!/bin/bash
logdir="/usr/var/logs/"
rm ${logdir}freshclam.log.* 2>/dev/null
touch ${logdir}freshclam.log.tmp
chown clamav:clamav ${logdir}freshclam.log.tmp
`which freshclam` > ${logdir}freshclam.log.tmp
if [ -e ${logdir}freshclam.log.ok ]
then
  grep -v Downloading ${logdir}freshclam.log.ok | \
          mail -s "[ClamAV] Definições atualizadas" root
  rm ${logdir}freshclam.log.ok
fi
if [ -e ${logdir}freshclam.log.error ]
then
  grep -v Downloading ${logdir}freshclam.log.error | \
          mail -s "[ClamAV] Falha na atualização das definições" root
  rm ${logdir}freshclam.log.error
fi

E também configurar no freshclam.conf as seguintes linhas:
(Atenção para manter o mesmo diretório $logdir nos dois arquivos)

OnUpdateExecute mv /usr/var/logs/freshclam.log.tmp /usr/var/logs/freshclam.log.ok
OnErrorExecute mv /usr/var/logs/freshclam.log.tmp /usr/var/logs/freshclam.log.error
OnOutdatedExecute mv /usr/var/logs/freshclam.log.tmp /usr/var/logs/freshclam.log.error

Com o script de atualização pronto, o funcionamento do ClamAV já está perfeito!

Podemos agora integrá-lo ao Samba!

A ferramenta mais conhecida, complicada e desatualizada para atingir essa tarefa é o samba-vscan. Após muita dificuldade, diversos erros e quando finalmente compilou veio a travar o samba em 60% das tentativas de acesso ao compartilhamento… sendo que precisei buscar por outra opção… e encontrei o scanned-only!

O scanned-only pode ser encontrado em http://olivier.sessink.nl/scannedonly/ e precisa do código fonte da sua versão do samba para compilar corretamente. Possui um princípio muito interessante: escaneia os arquivos uma única vez contra vírus (durante a gravação ou quando modificados) e os marca como “limpos” (ou remove se infectados). Oferecendo um ganho interessante na performance, evitando scans repetitivos principalmente quando o mesmo arquivo é acessado diversas vezes.. =D Ele utiliza a LibClamAV para efetuar o escaneamento dos arquivos, dentro do seu próprio daemon, dispensando assim a execução do daemon principal do ClamAV. Também existe uma versão do daemon do scanned-only feito em Python e que utiliza o daemon do ClamAV… porém não funcionou comigo.

O daemon do scanned-only deve ser executado sempre, adicionado na inicialização, e pode ser invocado com os parâmetros:

/usr/bin/scannedonlyd_clamav \
   -m 1440 \
   -d /var/clamav/quarantine \
   -s /var/state/clamav/scannedonly \
   -e "\.([[:upper:]mj][[:upper:]p][[:upper:]e]?[[:upper:]g3]|
                       [[:upper:]w][[:upper:]am][[:upper:]av]|
                       [[:upper:]m][[:upper:]4o][[:upper:]av]|
                         [[:upper:]a][[:upper:]v][[:upper:]i]|
                         [[:upper:]a][[:upper:]a][[:upper:]c]|
                         [[:upper:]f][[:upper:]l][[:upper:]v]|
                         [[:upper:]p][[:upper:]n][[:upper:]g]|
                         [[:upper:]b][[:upper:]m][[:upper:]p]|
                         [[:upper:]g][[:upper:]i][[:upper:]f]|
                         [[:upper:]c][[:upper:]d][[:upper:]r]|
                         [[:upper:]d][[:upper:]w][[:upper:]g])$"

-m tempo em minutos quando as estatísticas aparecem no log do sistema;

-d define o diretório de quarentena de vírus;

-s indica o arquivo de soquete que o daemon irá utilizar para receber as solicitações do módulo do samba;

-e é uma expressão regular dos arquivos que não serão escaneados (arquivos de vídeo por exemplo, .avi, .mpg, .mpeg, .wmv, de música, .wma, .wav, .mp3, de fotos, .jpg, .jpeg, .bmp). Esses arquivos não serão escaneados nem marcados como “escaneados”, sendo enviada sempre uma solicitação, que será ignorada pelo daemon. (Observação que tudo deverá estar em uma única linha, subdividi em várias para facilitar a leitura)

Para utilizar o scanned-only em determinados compartilhamentos de rede, defina as opções a seguir dentro da seção do compartilhamento desejado em seu arquivo smb.conf. Para habilitar o scanned-only em todos os compartilhamentos, defina as opções na seção [Global]:

  vfs object = scannedonly
    scannedonly: socketname = /var/state/clamav/scannedonly
    scannedonly: show_special_files = False
    scannedonly: hide_nonscanned_files = False
    scannedonly: allow_nonscanned_files = True

socketname nome do soquete do daemon scanonlyd_clamav,

show_special_files Não mostra soquetes de unix, dispositivos e arquivos especiais do linux,

hide_nonscanned_files Mostrar os arquivos que ainda não foram escaneados,

allow_nonscanned_files Liberar o acesso aos arquivos que ainda não foram escaneados.

Vale observar que quando habilitarmos o módulo scanned-only no samba, todos os arquivos que não foram escaneados serão escaneados conforme você for navegando pelos diretórios.. e, irá demorar muito para o compartilhamento ficar 100% pronto… pensando nisto o desenvolvedor nos fornece um utilitário para executarmos o escaneamento prévio e prepararmos os diretórios para então liberarmos o compartilhamento do samba já em modo de produção!

# scannedonly_prescan -s /var/state/clamav/scannedonly /storage/temp -m 200

E com tudo isto já temos após reiniciar o samba, o ClamAV devidamente integrado ao nosso servidor de arquivos em rede!

Outra idéia que eu julguei interessante, é criar um script semanal para re-escanear os arquivos escaneados há mais de 2 semanas e limpar os arquivos em quarentena há mais de 15 dias.

# Atualiza o antivirus antes de escanear os arquivos;
/etc/cron.hourly/freshclam.sh
# Re-escaneia os arquivos escaneados há mais de 2 semanas;
find /storage/temp -name ".scanned*" -mtime +14 -exec rm {} \;
/usr/bin/scannedonly_prescan -s /var/state/clamav/scannedonly /storage/temp >/dev/null
# Limpa os arquivos há mais de 15 dias em quarentena.
find /var/clamav/quarantine -mtime +15 -exec rm {} \;

Por fim, como eu não queria que o módulo de Anti-Vírus criasse os arquivos de texto “VIRUS_found_in_arquivo” toda vez que fosse encontrado um vírus, resolvi editar o código-fonte e comentar no arquivo “scannedonlyd_clamav.c” as linhas (351 e 352):

       create_file(warn, mode, uid,gid);
       create_file(warncache, mode, uid,gid);

Assim o compartilhamento se mantém sempre limpo, organizado e com grande performance 😀

Posteriormente, caso você utilize o Squid, poderá também integrar o ClamAV à sua Proxy, aumentando ainda mais a segurança de quem navega em sua rede!

Um plugin simples e prático de se utilizar é o SquidClamAV, ele escaneia os arquivos que o squid busca na internet e caso um virus seja encontrado pelo daemon do ClamAV ele redireciona para um site definido, que, com o auxílio de um script cgi nos mostra o endereço infectado e o vírus encontrado!

Sua instalação é bem simples e a configuração também, dispensando dicas adicionais 🙂 Sendo relevante lembrar que ele utiliza o soquete do daemon do ClamAV!

Finalizando com chave de ouro, no Postfix podemos contar com dois ótimos filtros de conteúdo: práticos, simples e eficientes! O meu script mail_scan.sh que suporta também o F-Prot e avast! além do ClamAV e temos também o filtro ClamSMTP! Cuja compilação ocorre de maneira rápida e descomplicada.. tal qual como sua configuração 🙂 A velocidade de funcionamento é impressionante! Só é uma pena ele aceitar o email com virus e apenas descartá-lo ao invés de recusar explicitamente para o remetente! 😮

E agora temos um “problema” em mãos… como o scanned-only executa o seu daemon próprio ao invés de utilizar o daemon do ClamAV, ficamos com 2 Anti-Vírus iguais ocupando espaço na memória (clamd + libclamav do scannedonlyd) e competindo por processamento ao invés de se revezarem espertamente na lista de espera. Quem sabe um dia o daemon em python do scanned-only que utiliza o clamd funcione sem apresentar erros, assim como o SquidClamAV e o ClamSMTP e também o meu script mail_scan.sh! 😀

Finalmente, para efetuar os testes se o Anti-Vírus está realmente esperto e funcionando, há o site eicar.com que fornece um arquivo de teste que todos os Anti-Vírus detectam 😀

5 ideias sobre “Integrando o ClamAV com o Samba e o Postfix e o Squid!

  1. Muitíssimo obrigado pelas suas dicas, Eduardo. Já estava à meses procurando uma solução real para os problemas causados pelos arquivos contaminadas e seu tutorial foi salvador!

    Parabéns pela forma objetiva e prática de expor a idéia e, mais uma vez, obrigado por compartilhar com a comunidade suas realizações.

    Grande abraço !

  2. Parabéns pelo post, muito interessante, principalmente eu que sou iniciante no mundo linux, fico orgulhoso em saber que existem pessoas como vc, que se dispõe a passar seus conhecimentos, isso é uma grande dádiva, e de grande valia para nós que buscamos aprender.
    Valeu !!!!

Escreva seu comentário: