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/07 20:49] rlunarolinux:ssh [2008/12/02 23:19] rlunaro
Line 5: Line 5:
 ==== Introducción ==== ==== Introducción ====
  
-[[http://kevin.vanzonneveld.net/techblog/article/block_brute_force_attacks_with_iptables/]]+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:
  
 <code> <code>
 +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
 +[....]
 +</code>
 +
 +==== La contramedida más adecuada ====
 +
 +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>
 +
 +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> </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() fw_custom_after_antispoofing()
Line 22: Line 113:
     echo -n "Aplying custom rules..."     echo -n "Aplying custom rules..."
  
-    iptables -I INPUT -i lo  -p tcp --dport 22 \+    iptables -I INPUT -i eth+  -p tcp --dport 22 \
              -m state --state NEW -m recent --set --name SSH              -m state --state NEW -m recent --set --name SSH
  
Line 28: Line 119:
     # After 3 unsucessful retries, drop the     # After 3 unsucessful retries, drop the
     # connection for 60 seconds     # connection for 60 seconds
-    iptables -I INPUT -i lo -p tcp --dport 22 \+    iptables -I INPUT -i eth+ -p tcp --dport 22 \
              -m state --state NEW -m recent --update \              -m state --state NEW -m recent --update \
              --seconds 60 --hitcount 3 --rttl --name SSH -j DROP              --seconds 60 --hitcount 3 --rttl --name SSH -j DROP
Line 35: Line 126:
     echo "done"     echo "done"
  
 +</code>
  
-==== En qué consiste ==== 
  
-El presente artículo trata de cómo limitar los intentos de conexión +Es decir, hemos instalado un código que mediante una llamada al comando 
-al puerto 22 (ssh).+iptables -el comando básico para hacer un filtrado de paquetes en Linux-, 
 +limitaremos los intentos de conexión al puerto 22 a lo que diga el  
 +parámetro --hitcount. Una vez alcanzado ese valor, será preciso  
 +esperar lo que diga --seconds para poder volver a conectarse.
  
-Si tienes un ordenador en internet con el puerto ssh (22) abierto, +==== Reiniciar el firewall ==== 
-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: 
  
 <code> <code>
-Apr 10 03:02:58 hostname sshd[8479]: Invalid user cadwyn from xxx.yyy.zzz.ttt +/etc/rc.d/SuSEfirewall2_setup restart
-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 +
-[....]+
 </code> </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. 
  
-Evitar esto es muy sencillo instalando un par de reglas de firewall. 
  
 <code> <code>
-                echo -n " [Security enhaced on]" +#  field          allowed values 
-                iptables -I INPUT -p tcp --dport 22 -i eth+ \ +#  -----          -------------- 
-                        -m state --state NEW -m recent --set +#  minute         0-59 
-                iptables -I INPUT -p tcp --dport 22 -i eth+ \ +#  hour           0-23 
-                        -m state --state NEW -m recent --update \ +#  day of month   1-31 
-                        --seconds $MAX_ATTEMPTS_TIMEOUT --hitcount $MAX_ATTEMPTS -j DROP+#  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> </code>
  
-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.+
  
  
linux/ssh.txt · Last modified: 2022/12/02 22:02 by 127.0.0.1