você está aqui: Home  → Arquivo de Mensagens

Monitorando logs do vsftpd via email

Colaboração: Migue Di Ciurcio Filho

Data de Publicação: 29 de Junho de 2006

O vsftpd é um excelente daemon para servir FTP. É estável feito uma rocha, seguro e leve. Uma das coisas que gosto nele também é sua extrema simplicidade, ele realmente não tem muitos recursos como quotas por usuário e limitações de banda, porém isso nunca me fez falta.

Problema

Quando um usuário coloca algum arquivo no FTP, ele tem que comunicar aos interessados de que o arquivo já está disponível, então a outra pessoa abre seu cliente FTP e baixa o arquivo. Que tal pularmos uma das etapas e tornar o processo mais ágil? Queremos que assim que termine o download ou upload de um arquivo em nosso FTP as partes interessadas sejam notificadas automaticamente, assim ninguém precisa perder tempo mandando e-mail, deixamos que o servidor faça isso. Não conheço nenhum daemon FTP que tenha esse recurso, dizer ao chefe que não é possível não é uma opção.

Solução

Nada melhor do que usarmos o log gerado para dispararmos os avisos. Temos que analisar cada novo evento gravado no log e enviar ou não os avisos via e-mail.

Implementação

Para implementarmos essa solução, vamos precisar fazer ajustes no vsftpd e vamos precisar do syslog-ng. O syslog-ng é parte fundamental dessa solução, pois com ele podemos definir diversas rotas e para nosso log, podendo enviá-lo para um filtro que iremos desenvolver.

Temos que configurar os seguintes parametros no arquivo de configuração do vsftpd, localizado em /etc/vsftpd.conf.

  syslog_enable=YES
  xferlog_enable=YES
  xferlog_std_format=NO

Basicamente configuramos o vsftpd para enviar o log para o syslog de nosso sistema. Para mais detalhes, man vsftpd.conf. Agora que o vsftpd irá enviar o log para o syslog, temos que configurar o syslog-ng para organizar o log enviado. Devemos definir um filtro e os destinos, tudo isso em /etc/syslog-ng/syslog-ng.conf.

  filter f_vsftpd { program(vsftpd); };
  destination d_vsftpd { file("/var/log/vsftpd.log"
              template("$MSGONLY\n") template-escape(no)); };
  destination d_vsftpd_email { program("/root/scripts/vsftpd_monitor.sh"
              template("$MSGONLY\n") template-escape(no)); };

Aqui nós definimos um filtro que irá separar todas as mensagens que vierem do daemon de novo vsftpd, depois criamos um destino em arquivo em /var/log/vsftpd.log e outro destino mandando o log para a stdin do shell script vsftpd_monitor.sh, para saber mais detalhes veja man syslog-ng.conf.

Ainda no arquivo de configuração do syslog-ng, precisamos definir o log.

  log {
  source(s_all);
  filter(f_vsftpd);
  destination(d_vsftpd);
  destination(d_vsftpd_email);
  flags(final);
  };

A partir de agora todo o log gerado pelo vsftpd será enviado para um arquivo de log padrão, em /var/log/vsftpd.log e também para um shell script que receberá na entrada padrão cada linha de log.

Vejamos abaixo, exemplos de log gerado pelo vsftpd.

  Mon Apr 24 09:07:08 2006 [pid 16482] [vwcaminhoes] 
      OK DOWNLOAD: Client "200.184.93.85",
      "/261_A3GM_60.pdf", 1732158 bytes, 111.44Kbyte/sec
  Wed Apr 26 09:16:53 2006 [pid 20716]
      CONNECT: Client "200.184.93.85"
  Wed Apr 26 09:16:53 2006 [pid 20715] [vw]
      OK LOGIN: Client "200.184.93.85"
  Wed Apr 26 09:17:00 2006 [pid 20732] [vw] 
      OK MKDIR: Client "200.184.93.85", "/GOLF CANADA"
  Wed Apr 26 15:45:24 2006 [pid 24386] [vwcaminhoes]
      OK UPLOAD: Client "192.168.0.63",
      "/Manuais_Espanhol/17210_OD_ESP.pdf", 9474814 bytes, 7976
  .98Kbyte/sec
  Thu Apr 27 16:55:55 2006 [pid 12923] [metrics]
      OK DELETE: Client "192.168.0.42", "/bkp_metrics_sexta.part019.rar"
  Fri Apr 28 11:02:27 2006 [pid 476] [vwcaminhoes] 
      OK RMDIR: Client "192.168.0.63", "/PDFs_Robson"

Devemos então fazer um shell script que analise esse log e mande e-mails conforme o evento em cada log. A idéia inicial do nosso shell script foi baseada no http://xconsulting.dnsalias.com/software/vsftpd-report.htm

Começamos fazendo um laço que lê a entrada padrão eternamente e procura na linha padrões para determinar a que se refere o evento.

  #!/bin/sh
  while read TEXTO; do
  ACAO=""
  if [ $(echo $TEXTO | grep -c 'OK UPLOAD:') == "1" ]; then
  ACAO="UPLOAD"
  fi
  
  if [ $(echo $TEXTO | grep -c 'OK DOWNLOAD:') == "1" ]; then
  ACAO="DOWNLOAD"
  fi
  done

Salve o script no mesmo local apontado no syslog-ng e com mesmo nome, dê permissão de executação nele, isso já é suficiente para que possamos reiniciar o syslog-ng e o vsftpd.

Nosso script ainda não está fazendo nada, vamos agora usar a variável $ACAO para controlar o envio ou não de e-mail.

  #!/bin/sh
  
  while read TEXTO; do
  ACAO=0
  if [ $(echo $TEXTO | grep -c 'OK UPLOAD:') == "1" ]; then
  ACAO=1
  fi
  
  if [ $(echo $TEXTO | grep -c 'OK DOWNLOAD:') == "1" ]; then
  ACAO=1
  fi
  
  if [ $ACAO -eq 1 ]; then
  echo $TEXTO | mail -s "Evento servidor FTP" user@dominio.com.br
  fi
  done

Pronto, agora toda vez que alguém fizer upload ou download no FTP, os destinatários ficarão sabendo. Esse pequeno shell script pode servir como esqueleto para muitas outras ações. Baseado nessa idéia, podemos ter um vsftpd_monitor.sh muito mais elaborado, que envia um e-mail formatado e com mais informações. [https://opensvn.csie.org/traccgi/unixstuff/browser/trunk/scripts/vsftpd_monitor.sh]


Edital de contratação para administrador de redes

Colaboração: Rogério Acquadro

A (PC)² publicou o seu edital para contratação de um administrador de redes, período integral, a ser alocado em um de seus clientes. Maiores informações podem ser encontradas no texto do edital, publicado no site (http://pc2consultoria.com/modules.php?name=News&file=article&sid=144).

Currículos devem ser enviados via e-mail (<curriculum (a) pc2consultoria com>), e os arquivos devem estar em formato TXT, PDF ou ODT.



 

 

Veja a relação completa dos artigos de Migue Di Ciurcio Filho

Opinião dos Leitores

Seja o primeiro a comentar este artigo
*Nome:
Email:
Me notifique sobre novos comentários nessa página
Oculte meu email
*Texto:
 
  Para publicar seu comentário, digite o código contido na imagem acima
 


Powered by Scriptsmill Comments Script