User Tools

Site Tools


linux:ssh

This is an old revision of the document!


SSH

Limitar intentos de conexion SSH

En qué consiste

El presente artículo trata de cómo limitar los intentos de conexión al puerto 22 (ssh).

Si tienes un ordenador en internet con el puerto ssh (22) abierto, rápidamente descubrirás que éste es sistemáticamente atacado por script kiddies que intentan, mediante el envío sistemático de usuarios y contraseñas, entrar en el sistema.

Por ejemplo, aquí puedes ver una transcripción de esos ataques:

Apr 10 03:02:58 hostname sshd[8479]: Invalid user cadwyn from xxx.yyy.zzz.ttt
Apr 10 03:03:01 hostname sshd[8481]: Invalid user cady from xxx.yyy.zzz.ttt
Apr 10 03:03:05 hostname sshd[8484]: Invalid user cael from xxx.yyy.zzz.ttt
Apr 10 03:03:09 hostname sshd[8486]: Invalid user caelan from xxx.yyy.zzz.ttt
Apr 10 03:03:13 hostname sshd[8488]: Invalid user cadwr from xxx.yyy.zzz.ttt
Apr 10 03:03:17 hostname sshd[8491]: Invalid user cadwy from xxx.yyy.zzz.ttt
Apr 10 03:03:21 hostname sshd[8493]: Invalid user cadwyn from xxx.yyy.zzz.ttt
[....]

Evitar esto es muy sencillo instalando un par de reglas de firewall. El problema es hacerlo en SuSE de una forma que queda perfectamente integrada en el sistema.

Para llevar a cabo este objetivo, hemos pensado en lo siguiente:

Modificaremos el script de arranque del firewall, para incluir las reglas de filtrado oportunas. Básicamente consisten en contar los intentos fallidos de acceso en un tiempo inferior a X segundos. Si los intentos fallidos superan N, entonces se rechaza todo intento posterior de conexión mediante un “drop” que consiste sencillamente en no contestar a las peticiones desde esa IP.

N y X serán configurables, y se registrarán en el fichero de configuración de ssh /etc/sysconfig/ssh

De esta forma, la ejecución podrá activarse o desactivarse por el usuario a voluntad, e incluso configurar los tiempos máximos o los intentos máximos.

Instalando la contramedida

Dado que el entorno de SuSE es tan particular, hemos optado por integrarlo de forma que parezca que ha estado ahí toda la vida.

Vamos a implementar un cambio en el script de arranque de ssh, /etc/rc.d/sshd, que limite los intentos de conexión a un máximo de tres.

Para ello editaremos el fichero de arranque del demonio ssh (es un buen momento para hacer una copia de seguridad). Donde antes ponía:

  start)
      [.....]
			echo -n "Starting SSH daemon"
			startproc -f -p $SSHD_PIDFILE /usr/sbin/sshd $SSHD_OPTS -o "PidFile=$SSHD_PIDFILE"
      # Remember status and be verbose
      rc_status -v

ahora pondremos lo siguiente:

  start)
      [.....]
			echo -n "Starting SSH daemon"
      startproc -f -p $SSHD_PIDFILE /usr/sbin/sshd $SSHD_OPTS -o "PidFile=$SSHD_PIDFILE"
      # limit the failed connection attempts to port 22
      # to prevent systematic password guessing attacks
      if [ "$SECURITY_ENHACED" = "yes" ]
      then
              echo -n " [Security enhaced on]"
              iptables -I INPUT -p tcp --dport 22 -i eth+ \
                      -m state --state NEW -m recent --set
              iptables -I INPUT -p tcp --dport 22 -i eth+ \
                      -m state --state NEW -m recent --update \
                      --seconds $MAX_ATTEMPTS_TIMEOUT --hitcount $MAX_ATTEMPTS -j DROP
      fi
      # Remember status and be verbose
      rc_status -v

Es decir, hemos instalado un código que mediante una llamada al comando iptables -el comando básico para hacer un filtrado de paquetes en Linux-, limitaremos los intentos de conexión al puerto 22 a MAX_ATTEMPTS. Una vez alcanzado ese valor, será preciso esperar MAX_ATTEMPTS_TIMEOUT para poder volver a conectarse.

Bien, lo que nos queda es que cuando echemos abajo el servicio, estas reglas se desactiven tambiÚn. Para ello instalaremos los comandos de borrado de reglas en la opción stop) del script. Es decir, donde dice:

  stop)
      echo -n "Shutting down SSH daemon"
      ## Stop daemon with killproc(8) and if this fails
      ## set echo the echo return value.
      killproc -p $SSHD_PIDFILE -TERM /usr/sbin/sshd
      # Remember status and be verbose
      rc_status -v

Pondremos lo siguiente:

  stop)
      echo -n "Shutting down SSH daemon"
      ## Stop daemon with killproc(8) and if this fails
      ## set echo the echo return value.
      killproc -p $SSHD_PIDFILE -TERM /usr/sbin/sshd
      # delete the rules previously created
      if [ "$SECURITY_ENHACED" = "yes" ]
      then
              echo "[Security enhaced off]"
              iptables -D INPUT -p tcp --dport 22 -i eth+ \
                      -m state --state NEW -m recent --set
              iptables -D INPUT -p tcp --dport 22 -i eth+ \
                      -m state --state NEW -m recent --update \
                      --seconds $MAX_ATTEMPTS_TIMEOUT --hitcount $MAX_ATTEMPTS -j DROP
      fi
      # Remember status and be verbose
      rc_status -v

Y ya está: cada vez que el servicio sshd se pare, tambiÚn las reglas de filtrado serán desactivadas. De esta forma, sucesivas paradas/arranques no llenarán las reglas de filtrado del kernel, y lo mantendrá todo “limpio”.

Ahora sólo nos queda instalar las variables de configuración. En el fichero /etc/sysconfig/ssh, instalaremos las correspondientes variables:

## Path: Network/Remote access/SSH ## Description: SSH server settings ## Type: string ## Default: “” ## ServiceRestart: sshd # # Options for sshd # SSHD_OPTS=“” #

# do you want to limit the number of failed # connections to the ssh port? set this # option to “yes” # SECURITY_ENHACED=“yes” # # this option will set the maximum number of # failed connection attempts will be allowed # before closing the connection # MAX_ATTEMPTS=4 # # this option will set the time the connection # will be dropped for annoying ip # MAX_ATTEMPTS_TIMEOUT=60

linux/ssh.1225622017.txt.gz · Last modified: 2022/12/02 22:02 (external edit)