User Tools

Site Tools


linux:ssh

Differences

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


Previous revision
linux:ssh [2022/12/02 22:02] (current) – external edit 127.0.0.1
Line 1: Line 1:
 +====== SSH ======
 +
 +===== Limitar intentos de conexion SSH =====
 +
 +==== Introducción ====
 +
 +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>
 +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>
 +
 +==== 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
 +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.
 +
 +==== 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>
 +
 +
 +
 +
 +
 +
 +