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
linux:ssh [2008/11/07 20:43] 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 =====
  
-[[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.+Navegando por internet, he visto varias medidas: la mayor parte  
 +se basan en analizar el log del sistema para identificar los  
 +ataques y posteriormente bloquear las ip's.  
 + 
 +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 a variar forzosamente al cabo de un tiempo. 2) algunas soluciones ni  
 +siquiera bloquean la ip, simplemente registran la ip atacante, y dejan  
 +al administrador la tarea de bloquearlas.  
 + 
 +Otras soluciones más peregrinas son cambiar la dirección del puerto 
 +ssh o ponerlo por horas; no me parecen ni medio elegantes((cada uno  
 +tiene sus opiniones sobre cómo administrar su sistema, y lo siento  
 +mucho pero esto no me parece una solución)).  
 + 
 +Sin embargo en  
 +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:  
 + 
 +  * Instala dos reglas en el firewall del sistema 
 +  * Esas reglas registran los intentos de conexión de fallidos: a partir de tres intentos fallidos hará un DROP de la conexión, impidiendo 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:  
 + 
 +  * 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 
 + 
 +==== Las reglas de nuestro amigo Kevin ====
  
 <code> <code>
-                echo -n " [Security enhaced on]" + 
-                iptables -INPUT -p tcp --dport 22 -i eth+ \ +sudo iptables -INPUT -i eth0 -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH 
-                        -m state --state NEW -m recent --set +sudo iptables -INPUT -i eth0 -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 8 --rttl --name SSH -j DROP 
-                iptables -INPUT -p tcp --dport 22 -i eth+ \ +
-                        -m state --state NEW -m recent --update +
-                        --seconds $MAX_ATTEMPTS_TIMEOUT --hitcount $MAX_ATTEMPTS -j DROP+
 </code> </code>
 +
 +==== Instalando las reglas en SuSE ====
 +
 +No pierdas el tiempo modificando scripts peregrinos por ahí, SuSE tiene un mecanismo para instalar reglas personalizadas en el firewall. 
 +
 +En /etc/sysconfig/SuSEfirewall2 hay una entrada de configuración muy interesante: 
 +
 +<code>
 +## Type:  string
 +#
 +# 25.)
 +# Do you want to load customary rules from a file?
 +#
 +# This is really an expert option. NO 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>
 +
 +Que nos permite especificar un fichero de reglas de firewall personalizadas. Descomentamos la variable y lo dejamos así: 
 +
 +<code>
 +FW_CUSTOMRULES="/etc/sysconfig/scripts/SuSEfirewall2-custom"
 +</code>
 +
 +==== El fichero de reglas personalizadas ==== 
 +
 +A continuación editaremos el fichero de reglas personalizadas:
 +
 +<code>
 +sudo vi /etc/sysconfig/scripts/SuSEfirewall2-custom
 +</code>
 +
 +Y en la función fw_custom_after_antispoofing insertaremos las reglas: 
 +
 +<code bash>
 +
 +fw_custom_after_antispoofing()
 +{
 +
 +    #
 +    #
 +    # Custom rules to stop script kiddies accesing ssh port
 +    #
 +    #
 +
 +    echo -n "Aplying custom rules..."
 +
 +    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 ====  
 + 
 + 
 +<code> 
 +/etc/rc.d/SuSEfirewall2_setup restart 
 +</code> 
 + 
 +==== Instalación remota ====  
 + 
 +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.  
 + 
 + 
 +<code> 
 +#  field          allowed values 
 +#  -----          -------------- 
 +#  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) 
 + 
 +# a las 23:00 borramos el fichero 
 +0 23 * * *     root      /bin/rm /tmp/pruebas 
 + 
 +# a las 23:10 restauramos el firewall 
 +10 23 * * *    root      /etc/rc.d/SuSEfirewall2_setup restart 
 + 
 +</code> 
 + 
 + 
 + 
 + 
 + 
  
  
linux/ssh.1226087023.txt.gz · Last modified: 2022/12/02 22:02 (external edit)