SSH. Un poco de seguridad parte 4. (Bajando capas OSI para ahorrar ciclos de procesador)

Hola a todos,

No voy a daros una charla sobre protocolos de red, mi objetivo es daros unos pequeños apuntes de como securizar ssh, pero en este caso me intentaré centrar en optimizar algunas cosillas para ahorrar algunos preciosos ciclos de procesador evitando que este se colapse. ¿Cómo? pues ahora lo veremos.

Comentaré que si no recuerdo mal el ssh es un protocolo que trabaja en capa 7 (aplicación), para evitar que el tráfico NO necesario llegue a esta capa utilizaremos un FIREWALL en nuestro caso IPTABLES, que en estado puro funciona a nivel de capa 3 y 4 (red y transporte), evitando entonces con nuestras configuraciones que el tráfico no deseado llegue hasta la capa 7 ahorrando ciclos de procesador y dando un poco de vidilla al servidor.

Voy a trabajar desde la consola, y sin fichero de configuración, más que nada porque cada uno trabaja y se lo monta según sus necesidades, y como lo que nos interesa es ver QUE HACEMOS luego el COMO dependerá de cada escenario, necesidades y preferencias de cada uno de nosotros, además empezaré desde un sistema limpio, así que hay vamos.

En todos los ejemplos utilizaré por defecto politicas DROP para INPUT, OUTPUT Y FORWARD.


#iptables -P INPUT DROP
#iptables -P OUTPUT DROP
#iptables -P FORWARD DROP

En el primer ejemplo vamos primero a pensar que a nuestro servidor ssh solo queremos que se pueda acceder desde una ip que podría ser el equipo del administrador, supondremos que nuestro amigo BOFH tiene la ip 192.168.88.34 y que la ip de nuestro FW es la 192.168.88.35.

En este caso nuestro objetivo será habilitar el acceso a una ip en concreto, como tenemos las politicas en DROP tendremos que habilitar la entrada y salida al puerto 60222 (recordad que nuestro ssh no está escuchando en el 22 sino en el 60222 ver articulos anteriores.


#iptables -A INPUT -i eth0 -s 192.168.88.34 -p tcp --dport 60222 -j ACCEPT
#iptables -A OUTPUT -o eth0 -d 192.168.88.34 -j ACCEPT

Veamos en resultado de un iptables -nL

iptables1

Podemos observar que solo se acepta el protocolo tcp puerto 6022 desde el SOURCE (origen 192.168.88.34) y también se permite TODO el trafico hacia el destino 192.168.88.34, también podríamos haber acotado el protocolo, o haber utilizado el parámetro established pero de momento a mi para las pruebas ya me va bien.

Bien con esto en principio bastaría para bloquear casi todos los tipos de ataque, pero es muy probable que necesitemos acceder a nuestro servidor desde cualquier ubicación, incluida desde internet, tenemos un problema.

Bueno os doy algunas soluciones, podéis crear reglas para permitir rangos de ips, o establecer una vpn para tener un ip válida con la que acceder y/o filtrar vuestro servidor. Si aún así no es viable y tenemos a nuestro servidor dando servicios a internet, nos puede interesar mitigar posibles ataques automatizados típicos, que crearían multiples conexiones para intentar acceder a nuestro ssh. Para ello podemos utilizar las siguientes reglas.


#iptables -I INPUT -p tcp --syn --dport 60222 -i eth0 -m recent --set
#iptables -I INPUT -p tcp --syn --dport 60222 -i eth0 -m recent --update --seconds 300 --hitcount 2 -j DROP

Y al hacer el iptables -nL

iptables2

Con estas líneas le estamos diciendo a iptables que controle quien intenta establer conexión -p tcp --syn y accede más de 2 veces (–hitcount) en 5 minutos, le haga un drop. Evidentemente los parámetros se deben ajustar al nivel de paranóia de cada BOFH.

Hace tiempo vi un script en bash utilizando a nuestro amigo netcat que para probar esto me va a venir muy bien sin tener que utilizar complejas herramientas:

lo he llamado ataca.sh:

script

NOTA: MI AMIGO FRANGOR me ha echado una bronca somera por este script y me ha obligado a cambiarlo o me pegaba….. como no me quiero pelear con el os pongo sus “modificaciones justificadas”, por mi parte he mejora tambien una opcion del netcat ya que sino tarda mucho. VAMOS que se ha optimizado el script. Gracias frangor

ataca.sh


#!/usr/bin/env bash

for i in {1..5} ; do
echo “exit” | nc -vv -w 1 192.168.88.35 60222;
done

Sobre las modificaciones comentar que el #!/usr/bin/env bash es para mejorar la portabilidad, y el -w 1 es el timeout para conexiones y lecturas finales de red

Pues nada hay queda dicho.

Al ejecutarlo nos aparecerá lo siguiente:

resultadoscript

Como podéis observar en la imagen anterior, tras ejecutarlo, y aún teniendo permitido el acceso desde mi ip, no me ha dejado conectar, he tenido que esperar 5 minutos para poder volverlo a intentar.

 

acceso

Bueno y hasta aquí por hoy, espero que este tuto haya sido claro, didáctico y de utilidad para alguno de vosotros.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *