#!/bin/bash
# Script para filtrar hosts que realizan continuos
# intentos fallidos de conexion SSH
# Autor: Genghis Rios
# Fecha: 17/07/2005
## Adaptacion para Debian/Ubuntu: Gonzalo Alvarez Flores
## Fecha: 22/05/2007
# Numero maximo de logins fallidos
nmax=5
# Email de reporte
email="grios@pucp.edu.pe mcsalced@pucp.edu.pe gonzalo.alvarez@pucp.edu.pe"
# Analizando intentos de conexion ilegales en /var/log/secure
grep "Failed password" /var/log/auth.log > /tmp/tempo_ids_ssh_$$.1
if [ $? -ne 0 ]
then
# Nada por hacer
rm -f /tmp/tempo_ids_ssh_$$.1
exit
fi
# Palabra clave a buscar en el archivo
palabra="invalid user"
# Direcciones IP con logeos invalidos de usuarios inexistentes
cat /tmp/tempo_ids_ssh_$$.1 | grep "${palabra}" | tr -s " " | cut -f 13 -d " " > /tmp/tempo_ids_ssh_$$.2
# Direcciones IP con logeos invalidos de usuarios existentes
cat /tmp/tempo_ids_ssh_$$.1 | grep -v "${palabra}" | tr -s " " | cut -f 11 -d" " >> /tmp/tempo_ids_ssh_$$.2
# Analizando direcciones IP con logeos invalidos
# Primera columna: Numero de intentos
# Segunda columna: Direccion IP
while read x
do
# Direccion IP
host=$(echo $x | awk -F" " '{ print $2}' | cut -f4 -d:)
# Direccion IP formateada para ser usada con el comando grep
hostgrep=$(echo $host | sed "s/\./\\\./g")
# Numero de intentos
ntry=$(echo $x | awk -F" " '{ print $1}')
# Verificando que no haya sido previamente filtrado
/sbin/iptables -nL | grep -w $hostgrep > /dev/null
test=$?
# Filtrar si no ha sido filtrado y si ha superado el limite de intentos
if [ $test -ne 0 -a $ntry -ge $nmax ]
then
# Filtrando IP
/sbin/iptables -A INPUT -s $host -j DROP
# Salvando la regla de filtrado
/sbin/iptables-save > /root/iptables_rules
# Enviando notificacion
1,1 cat << EOFX | mail -s "$(hostname): Ataque SSH desde $host !!!" ${email}
En el servidor $(hostname) se detecto un ataque de
intento de ingreso SSH desde el host ${host}.
El host ${host} ha sido filtrado automaticamente.
Se anexa informacion del ISP asociado para la denuncia:
-------------------------------------------------------
$(/usr/bin/whois ${host})
-------------------------------------------------------
EOFX
fi
done << EOFY
$(cat /tmp/tempo_ids_ssh_$$.2 | sort -rn | uniq -c)
EOFY
# Borrando temporales
rm -f /tmp/tempo_ids_ssh_$$.*