De acordo com as Leis 12.965/2014 e 13.709/2018, que regulam o uso da Internet e o tratamento de dados pessoais no Brasil, ao me inscrever na newsletter do portal DICAS-L, autorizo o envio de notificações por e-mail ou outros meios e declaro estar ciente e concordar com seus Termos de Uso e Política de Privacidade.
Colaboração: Fabiano Caixeta Duarte
Data de Publicação: 25 de Outubro de 2005
Há quem goste de um bom conjunto de gráficos estatísticos para acompanhar o trabalho de seus servidores. Vamos aqui mostrar um exemplo de como acompanhar os vírus que estão sendo filtrados por um sistema anti-vírus acoplado a um servidor de e-mails.
O gráfico conterá um resumo mensal categorizado por vírus apontando a quantidade de vírus interceptados por dia.
O ambiente utilizado foi FreeBSD + Sendmail + ClamAV. Entretanto, com algumas poucas modificações, pode-se adequar o script apresentado a outros contextos.
A ferramenta utilizada para realizar a plotagem dos dados em gráficos (arquivos png) foi o GnuPlot.
As informações para composição dos gráficos são colhidas do log do servidor de e-mail.
No caso do sendmail+clamav, o servidor registra no log a ocorrência de um vírus com a seguinte expressão "Infected with <virus_name>".
# grep Infected /var/log/maillog Sep 17 15:20:39 servidor sm-mta[85830]: j8HIKH3Z085830: Milter add: header: X-Virus-Status: Infected with Worm.SomeFool.AD
As informações relevantes para geração dos gráficos são dia e nome do vírus. Ou seja, só nos interessam as colunas 2 e 13.
# grep Infected /var/log/maillog | awk '{print $2" "$13}' 17 Worm.SomeFool.AD
No exemplo mostrado, demonstramos apenas um vírus capturado. Vamos mostrar agora um pequeno conjunto em que podemos observar a existência de mais de uma ocorrência de cada vírus na mesma data. É um conjunto de informações fictícias. Numa situação real a quantidade de vírus encontrados (infelizmente) é bem maior.
# grep Infected /var/log/maillog | awk '{print $1" "$2" "$13}' 17 HTML.Phishing.Bank-1 17 Worm.SomeFool.P 17 Exploit.HTML.IFrame 17 Worm.SomeFool.P 17 HTML.Phishing.Bank-1 17 HTML.Phishing.Bank-1 17 Worm.SomeFool.AD 17 Worm.SomeFool.Gen-2
A estratégia é agrupar as ocorrências de cada vírus, contá-las e armazená-las em um arquivo que será lido pelo gnuplot. Na verdade, geramos um arquivo para cada vírus, possibilitando a plotagem das estatísticas de todos os vírus em um mesmo gráfico.
# grep Infected /var/log/maillog | awk '{print $2" "$13}' | sort | # Ordena as ocorrências uniq -c \ # Conta as ocorrências de cada vírus > $TMP # Armazena o resultado em um arquivo temporário # cat $TMP 1 17 Exploit.HTML.IFrame 3 17 HTML.Phishing.Bank-1 1 17 Worm.SomeFool.AD 1 17 Worm.SomeFool.Gen-2 2 17 Worm.SomeFool.P
Para tornar o processo automático, optamos por armazenar os logs do servidor de e-mail agrupando-os por dia. Isto quer dizer que programamos o sistema para rotacionar os logs uma vez por dia. Assim, podemos filtrar as informações do dia anterior trabalhando sobre o arquivo /var/log/maillog.0.bz2.
O próximo passo é separar as informações em arquivos, cada um com o nome do vírus.
while read count day virus; do echo $count $day >> $PLOTDIR/$virus done < $TMP
Com os arquivos montados, basta agora executar o gnuplot para plotar o gráfico. Não está no escopo desta dica detalhar o funcionamento do gnuplot (pode ser o conteúdo de outra dica).
Segue a íntegra do script. Devemos agendar sua execução diária pelo cron, de forma que os gráficos sejam atualizados diariamente a partir das informações do log do dia anterior.
#!/bin/bash # VirusGraphGen - Gerador de gráficos de Vírus # Desenvolvido por Fabiano Caixeta Duarte # Agosto / 2005 # Capturar a data levando em consideração que a data base é o dia anterior. # Assim, evitamos problemas em fim de mês. LANG=en_US month=`date -v-1d +%b` # Em Linux: substituir "-v-1d" por "1 day ago" LANG=pt_BR.ISO8859-1 MES=`date -v-1d +%B` ANO=`date -v-1d +%Y` # Criação das variáveis globais THIS=`basename $0` WORKDIR=/var/run/${THIS} TMP=$WORKDIR/$$ PLOTFILE=$WORKDIR/virus.plot PLOTDIR=$WORKDIR/$month GRAPHDIR=/var/www/data/images # Garantir a existência dos diretórios de trabalho mkdir -p $WORKDIR mkdir -p $PLOTDIR # Filtrar as linhas de alerta de vírus bzgrep Infected /var/log/maillog.0.bz2 | awk '{print $2" "$13}' | sort | uniq -c > $TMP # Separar os vírus e acrescentar aos arquivos já existentes. # Assim, em cada arquivos teremos um acompanhamento diário dos vírus filtrados while read count day virus; do echo $count $day >> $PLOTDIR/$virus done < $TMP #Construindo a linha de múltipla plotagem. O nome do vírus é usado como legenda. PLOTLINE="plot " for i in `ls $PLOTDIR`; do PLOTLINE="$PLOTLINE '$i' u 2:1 t '$i'," done PLOTLINE=${PLOTLINE%,*} # Retirar vírgula do fim da linha #Construção do arquivo de plotagem a ser usado pelo gnuplot cat << EOF > $PLOTFILE set term png set out "$GRAPHDIR/virus-${month}.png" set title "Virus do mes de $MES/$ANO" set key below set style data lines set xlabel "Dia do mes" set ylabel "Nr de Ocorrencias" set xrange [1:31] writeback set yrange [0:15] set xtics 1 cd '$PLOTDIR' $PLOTLINE EOF # Ufa, enfim o gráfico :) /usr/local/bin/gnuplot $PLOTFILE # Tchau arquivos temporários. Obrigado por sua contribuição :) rm -R $TMP $PLOTFILE
This policy contains information about your privacy. By posting, you are declaring that you understand this policy:
This policy is subject to change at any time and without notice.
These terms and conditions contain rules about posting comments. By submitting a comment, you are declaring that you agree with these rules:
Failure to comply with these rules may result in being banned from submitting further comments.
These terms and conditions are subject to change at any time and without notice.
Comentários