User Tools

Site Tools


linux:ssh

Differences

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

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
Last revisionBoth sides next revision
linux:ssh [2008/11/02 23:32] rlunarolinux:ssh [2008/12/02 23:19] rlunaro
Line 3: Line 3:
 ===== Limitar intentos de conexion SSH ===== ===== Limitar intentos de conexion SSH =====
  
-[[http://kevin.vanzonneveld.net/techblog/article/block_brute_force_attacks_with_iptables/]] +==== Introducción ====
- +
-==== En qué consiste ====+
  
 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 28: 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. 
 + 
 +==== Reiniciar el firewall ==== 
  
-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: 
  
 <code> <code>
-    stop) +/etc/rc.d/SuSEfirewall2_setup restart 
-        echo -n "Shutting down SSH daemon" +</code>
-        ## Stop daemon with killproc(8) and if this fails +
-        ## set echo the echo return value.+
  
-        killproc -p $SSHD_PIDFILE -TERM /usr/sbin/sshd+==== Instalación remota ==== 
  
-        # Remember status and be verbose +El riesgo de hacer una instalación en remoto de estas cosas es que podemos  
-        rc_status -v +colgar el acceso ssh y quedarnos sin acceso a la máquina. A fin de contener  
-</code>+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: 
  
 <code> <code>
-    stop) +#  field          allowed values 
-        echo -n "Shutting down SSH daemon" +#  -----          -------------
-        ## Stop daemon with killproc(8and if this fails + minute         0-59 
-        ## set echo the echo return value.+ 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+
  
- 
-        # Remember status and be verbose 
-        rc_status -v 
 </code> </code>
  
  
-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: 
  
-<code> 
-## 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 +
-</code>+
  
  
linux/ssh.txt · Last modified: 2022/12/02 22:02 by 127.0.0.1