7 de Septiembre, 2005

Relación spam y correo legítimo

Hace un tiempo eché un vistazo a un día en el correo de blackshell, y pude comprobar que más o menos se detectaba un 35% de spam respecto al total de correo del servidor.

Hoy me he preguntado otra vez cómo estaría la cosa, comentando un poco con Jaime y Felipe la jugada. Le he dedicado un rato al tema, principalmente peleándome con gnuplot, para automatizar el análisis de los datos.

Este es el resultado:

Spam stats
Estadísticas (siempre) del día de ayer.

El script que he usado para crear el gráfico puede ser algo específico de mi sistema, pero igual a alguien le resulta interesante.

#!/bin/sh

# se crean temporales en el directorio de trabajo
# y luego se borran, pero ojo con el usuario que lo hace
cd /root/tmp

# configuracion
HOST="blackshell.usebox.net"
OUTPUT="/var/www/htdocs/images/spamstats.png"

# usamos C para que de la fecha correcta
LANG=C
# procesamos las entradas de ayer
# el date de GNU soporta 'date -d yesterday +"%h %e"'
# pero esta versión es portable ;)
DATE=$(date -r $(($(date +%s) - 86400)) +"%h %e")

# preparamos el log de ayer
grep "$DATE" < /var/log/maillog > mailog.yesterday
# si rotamos logs por tamaño... (OJO si hay mucho trafico)
zcat /var/log/maillog.*.gz | grep "$DATE" >> mailog.yesterday

# separamos spam y ham (ojo que no esté el modo 'verbose' de bogom)
awk '/X-Bogosity:\ Yes/ { print $3 }' mailog.yesterday > spam.log
awk '/X-Bogosity:\ No/ { print $3 }' mailog.yesterday > ham.log

# totales
TOT_SPAM=$(wc -l < spam.log | sed 's/ //g')
TOT_HAM=$(wc -l < ham.log | sed 's/ //g')

# preparamos los datos para gnuplot
cat spam.log | cut -f1 -d: | sort | uniq -c > spam.data
cat ham.log |  cut -f1 -d: | sort | uniq -c > ham.data

# conf de gnuplot
cat > graf.plot << PLOT
set data style linespoints
set format x "%H"
set timefmt "%H"
set xdata time
set pointsize 0.4
set xlabel "$DATE"
set ylabel "Mail count"
set title "Bogofilter stats for $HOST"
set terminal png small xffffff
set size 500/640.0, 300/480.0
set output "$OUTPUT"
plot "spam.data" using 2:1 title "SPAM ($TOT_SPAM)" 1, \
        "ham.data" using 2:1 title "HAM ($TOT_HAM)" 2
PLOT

# si hay datos, genera un gráfico nuevo
if [ $TOT_SPAM -ne 0 -a $TOT_HAM -ne 0 ]; then
        gnuplot graf.plot > /dev/null
fi

# borra temporales
rm -f graf.plot spam.data ham.data spam.log ham.log mailog.yesterday

# EOF

Seguro que podemos encontrar paquetes que nos darán estadísticas más detalladas (como AWStats), pero para mi es suficiente ;).

Jugando con cron actualizaré la gráfica todos los días, para echar un vistazo de vez en cuando. De entrada se puede ver como ya recibo más spam que correo legítimo (del 35% que comprobé en Febrero), y eso que hay varios usuarios en el servidor suscritos a listas de correo :'(.

Anotación por Juan J. Martínez, clasificada en: scripting, spam.

Los comentarios están cerrados: los comentarios se cierran automáticamente una vez pasados 30 días. Si quieres comentar algo acerca de la anotación, puedes hacerlo por e-mail.

Algunas anotaciones relacionadas: