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.
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]