21 de Septiembre, 2005

Direcciones bloqueadas por ssh_blocker

Hace tiempo que vengo usando un script para bloquear ataques al SSH, y la verdad es que ya me había olvidado de él.

Bueno, lo recordé un día este verano cuando me equivoqué al poner el nombre del usuario conectando desde casa de Sonia vía club radio y el script me bloqueó el acceso :D. El caso es que... ¿cómo va la cosa? ¿Han descendido o aumentado los ataques al servicio SSH?

La dirección IP más vieja que tengo en los registros es del 25 de Noviembre del 2004.

# pfctl -t sshscan -T show | wc -l
     232

Buena cifra :). Veamos, ya que mi debilidad son las gráficas de colores ;) y que tengo recientes mis pruebas con gnuplot, cual es la progresión de añadidos a la lista y la cantidad de ataques reinicidentes.

Obtenemos los datos de las IPs listadas, haciendo un pequeño hack para añadir el año (en los logs no está).

awk ' BEGIN { i=2004 } $1 == "Jan" { i=2005 } $0 != NL { print $1 "-" $2 "-" i } ' \
< /var/log/ssh_blocker.log | uniq -c > blocked.data

Ahora añadimos a la gráfica los datos las intentos de conexión rechazados por el bloqueo. Primero obtenemos los datos que he registrado con packet filter, aunque solo hay datos de los últimos 3 meses :(.

# rm log && touch log
# for file in /var/log/pflog.*.gz; do echo $file; zcat $file | \
 tcpdump -n -e -ttt -r - port 22 >> log; done
# tcpdump -n -e -ttt -r /var/log/pflog port 22 >> log

Falta obtener el número único de estaciones que han sido filtradas por día. No me vale de mucho saber que una IP haya realizado 1322 intentos de conexión (increible pero cierto) porque lo que quiero saber es cuántas máquinas de las bloqueadas han vuelto a intentar el ataque después de haber sido añadidas a la lista negra. El script queda algo raro, probablemente porque no se me ha ocurrido una forma mejor de tratar los datos :P.

$ awk ' $0 != NL { split($10, ip, "\."); print ip[1] "." ip[2] "." ip[3] "." \
 ip[4], $1 "-" $2 "-2005" } ' < log | sort \
| uniq | awk ' { print $2 } ' | sort | uniq -c > filtered.data

El fichero para gnuplot sería el siguiente:

set data style impulses
set timefmt "%b-%d-%Y"
set format x "%b"
set xdata time
set xlabel "Time"
set ylabel "IP Address count"
set title "Blocked IPs from SSH attacks"
set terminal png small xffffff
set size 500/640.0, 300/480.0
set output "blocked.png"
set grid xtics ytics
plot "blocked.data" using 2:1 title "Blocked" 1, \
	"filtered.data" using 2:1 title "Filtered" with points 2

Y el resultado este:

Bloqueados y filtrados

En la gráfica se aprecia que, salvo un par de picos, las direcciones se van añadiendo a la lista de forma bastante uniforme, así que en unos 10 meses no han habido demasiados cambios en cuanto a ataques nuevos.

También es revelador que el número de máquinas filtradas, es decir, estaciones que han vuelto a realizar el ataque una vez fueron añadidas, es bastante bajo y muy cerca del valor para las máquinas nuevas. Tampoco tengo demasiados datos para verificar este último punto (Agosto y lo que llevamos de Septiembre principalmente), pero podríamos concluir que las máquinas que realizan un ataque rara vez vuelven: solo un 10.34% (24 ataques filtrados en total por parte de estaciones distintas, de un total de 232 bloqueadas).

Así que bloquear direcciones IP en base a la detección de ataques funciona, pero no hay un gran beneficio a no ser que suframos una cantidad de ataques considerables, y en ese caso la tabla de direcciones a bloquear sería bastante grande para solo filtrar un 10% de ataques reincidentes.

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

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: