#!/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_$$.*