User Tools

Site Tools


linux:ssh

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
linux:ssh [2008/11/02 11:33] – creado rlunarolinux:ssh [2022/12/02 22:02] (current) – external edit 127.0.0.1
Line 3: Line 3:
 ===== Limitar intentos de conexion SSH ===== ===== Limitar intentos de conexion SSH =====
  
-==== En qué consiste ====+==== Introducción ====
  
 El presente artículo trata de cómo limitar los intentos de conexión El presente artículo trata de cómo limitar los intentos de conexión
Line 26: Line 26:
 </code> </code>
  
 +==== La contramedida más adecuada ====
  
-Evitar esto es muy sencillo instalando un par de reglas de firewall. El +Navegando por internet, he visto varias medidas: la mayor parte  
-problema es hacerlo en SuSE de una forma que queda perfectamente integrada +se basan en analizar el log del sistema para identificar los  
-en el sistema.+ataques y posteriormente bloquear las ip's
  
-Para llevar a cabo este objetivohemos pensado en lo siguiente:+La medida me parece totalmente desacertada por varios motivos:  
 +1) muchos de esos ataques provienen de adsl's, por lo que la ip atacante  
 +va variar forzosamente al cabo de un tiempo. 2) algunas soluciones ni  
 +siquiera bloquean la ipsimplemente registran la ip atacante, y dejan  
 +al administrador la tarea de bloquearlas. 
  
-Modificaremos el script de arranque del firewall, para incluir las  +Otras soluciones más peregrinas son cambiar la dirección del puerto 
-reglas de filtrado oportunas. Básicamente consisten en contar los intentos +ssh o ponerlo por horas; no me parecen ni medio elegantes((cada uno  
-fallidos de acceso en un tiempo inferior a X segundos. Si los intentos  +tiene sus opiniones sobre cómo administrar su sistemay lo siento  
-fallidos superan Nentonces se rechaza todo intento posterior de conexión +mucho pero esto no me parece una solució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 +Sin embargo en  
-configuración de ssh /etc/sysconfig/ssh+En [[http://kevin.vanzonneveld.net/techblog/article/block_brute_force_attacks_with_iptables/|la página Kevin van Zonneveld]] (gracias Kevin), ha dado con una solución perfecta: 
  
-De esta forma, la ejecución podrá activarse o desactivarse por el usuario +  * Instala dos reglas en el firewall del sistema 
-voluntade incluso configurar los tiempos máximos o los intentos máximos.+  * Esas reglas registran los intentos de conexión de fallidos: partir de tres intentos fallidos hará un DROP de la conexiónimpidiendo siquiera intentarlo 
 +  * A los X segundos de inactividad, reinicia el contador y se puede volver a conectar
  
 +Tiene una ventaja que en mi modesta opinión es fundamental: 
  
-==== Instalando la contramedida ====+  * No mantiene ningún registro; lo cual es perfecto porque esas IP's atacantes son muy variables 
 +  * Funciona automáticamente: no es necesaria intervención para que se active 
 +  * Funciona incluso con nosotros: un atacante que se apoderara de nuestra consola, no podría intentar más de N contraseñas. 
  
-Dado que el entorno de SuSE es tan particular, hemos optado por integrarlo +==== Las reglas de nuestro amigo Kevin ====
-de forma que parezca que ha estado ahí toda la vida.+
  
 +<code>
  
 +sudo iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
 +sudo iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 8 --rttl --name SSH -j DROP
  
 +</code>
  
 +==== Instalando las reglas en SuSE ====
  
-Vamos a implementar un cambio en el script de arranque de ssh, +No pierdas el tiempo modificando scripts peregrinos por ahí, SuSE tiene un mecanismo para instalar reglas personalizadas en el firewall
-/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 +En /etc/sysconfig/SuSEfirewall2 hay una entrada de configuración muy interesante
-momento para hacer una copia de seguridad). Donde antes ponía:+
  
-    start+<code> 
-        [.....] +## Type:  string 
- echo -"Starting SSH daemon"+
 +# 25.
 +# Do you want to load customary rules from a file? 
 +
 +# This is really an expert optionNO HELP WILL BE GIVEN FOR THIS! 
 +# READ THE EXAMPLE CUSTOMARY FILE AT /etc/sysconfig/scripts/SuSEfirewall2-custo 
 +
 +#FW_CUSTOMRULES="/etc/sysconfig/scripts/SuSEfirewall2-custom" 
 +FW_CUSTOMRULES="" 
 +</code>
  
- startproc -f -p $SSHD_PIDFILE /usr/sbin/sshd $SSHD_OPTS -o "PidFile=$SSHD_PIDFILE"+Que nos permite especificar un fichero de reglas de firewall personalizadas. Descomentamos la variable y lo dejamos así: 
  
-        # Remember status and be verbose +<code> 
-        rc_status -v+FW_CUSTOMRULES="/etc/sysconfig/scripts/SuSEfirewall2-custom" 
 +</code>
  
 +==== El fichero de reglas personalizadas ==== 
  
 +A continuación editaremos el fichero de reglas personalizadas:
  
-ahora pondremos lo siguiente:+<code> 
 +sudo vi /etc/sysconfig/scripts/SuSEfirewall2-custom 
 +</code>
  
-    start) +Y en la función fw_custom_after_antispoofing insertaremos las reglas: 
-        [.....] +
- echo -n "Starting SSH daemon"+
  
-        startproc -f -p $SSHD_PIDFILE /usr/sbin/sshd $SSHD_OPTS -o "PidFile=$SSHD_PIDFILE"+<code bash>
  
-        # limit the failed connection attempts to port 22 +fw_custom_after_antispoofing() 
-        # 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+
  
 +    #
 +    #
 +    # Custom rules to stop script kiddies accesing ssh port
 +    #
 +    #
  
-        Remember status and be verbose +    echo -n "Aplying custom rules..." 
-        rc_status -v+ 
 +    iptables -I INPUT -i eth+  -p tcp --dport 22 \ 
 +             -m state --state NEW -m recent --set --name SSH 
 + 
 + 
 +    After 3 unsucessful retries, drop the 
 +    # connection for 60 seconds 
 +    iptables -I INPUT -i eth+ -p tcp --dport 22 \ 
 +             -m state --state NEW -m recent --update \ 
 +             --seconds 60 --hitcount 3 --rttl --name SSH -j DROP 
 + 
 + 
 +    echo "done" 
 + 
 +</code>
  
  
 Es decir, hemos instalado un código que mediante una llamada al comando 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-, 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 +limitaremos los intentos de conexión al puerto 22 a lo que diga el  
-vez alcanzado ese valor, será preciso esperar MAX_ATTEMPTS_TIMEOUT para +parámetro --hitcount. Una vez alcanzado ese valor, será preciso  
-poder volver a conectarse.+esperar lo que diga --seconds para poder volver a conectarse.
  
-Bien, lo que nos queda es que cuando echemos abajo el servicio, estas +==== Reiniciar el firewall ==== 
-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+<code> 
 +/etc/rc.d/SuSEfirewall2_setup restart 
 +</code>
  
-        # Remember status and be verbose +==== Instalación remota ==== 
-        rc_status -v+
  
 +El riesgo de hacer una instalación en remoto de estas cosas es que podemos 
 +colgar el acceso ssh y quedarnos sin acceso a la máquina. A fin de contener 
 +los riesgos lo que haremos será poner una entrada de cron que a las doce de la 
 +noche borre el fichero que hemos creado y así nos permita reiniciar la máquina. 
  
-Pondremos lo siguiente: 
  
-    stop) +<code> 
-        echo -n "Shutting down SSH daemon" +#  field          allowed values 
-        ## Stop daemon with killproc(8and if this fails +#  -----          -------------
-        ## set echo the echo return value.+ minute         0-59 
 + hour           0-23 
 +#  day of month   1-31 
 +#  month          1-12 (or names, see below
 + day of week    0-7 (0 or 7 is Sun, or use names)
  
-        killproc -p $SSHD_PIDFILE -TERM /usr/sbin/sshd+# a las 23:00 borramos el fichero 
 +0 23 * * *     root      /bin/rm /tmp/pruebas
  
-        delete the rules previously created +a las 23:10 restauramos el firewall 
-        if [ "$SECURITY_ENHACED" = "yes"+10 23 * * *    root      /etc/rc.d/SuSEfirewall2_setup restart
-        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+
  
 +</code>
  
-        # 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)