linux:ssh
no way to compare when less than two revisions
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, | ||
+ | |||
+ | Por ejemplo, aquí puedes ver una transcripción de esos ataques: | ||
+ | |||
+ | < | ||
+ | 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 | ||
+ | [....] | ||
+ | </ | ||
+ | |||
+ | ==== 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' | ||
+ | |||
+ | La medida me parece totalmente desacertada por varios motivos: | ||
+ | 1) muchos de esos ataques provienen de adsl' | ||
+ | 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:// | ||
+ | |||
+ | * 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, | ||
+ | |||
+ | 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: | ||
+ | * 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 ==== | ||
+ | |||
+ | < | ||
+ | |||
+ | 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 | ||
+ | |||
+ | </ | ||
+ | |||
+ | ==== 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 / | ||
+ | |||
+ | < | ||
+ | ## 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 / | ||
+ | # | ||
+ | # | ||
+ | FW_CUSTOMRULES="" | ||
+ | </ | ||
+ | |||
+ | Que nos permite especificar un fichero de reglas de firewall personalizadas. Descomentamos la variable y lo dejamos así: | ||
+ | |||
+ | < | ||
+ | FW_CUSTOMRULES="/ | ||
+ | </ | ||
+ | |||
+ | ==== El fichero de reglas personalizadas ==== | ||
+ | |||
+ | A continuación editaremos el fichero de reglas personalizadas: | ||
+ | |||
+ | < | ||
+ | sudo vi / | ||
+ | </ | ||
+ | |||
+ | 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 " | ||
+ | |||
+ | 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 \ | ||
+ | | ||
+ | |||
+ | |||
+ | echo " | ||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | 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 ==== | ||
+ | |||
+ | |||
+ | < | ||
+ | / | ||
+ | </ | ||
+ | |||
+ | ==== 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. | ||
+ | |||
+ | |||
+ | < | ||
+ | # field allowed values | ||
+ | # ----- -------------- | ||
+ | # minute | ||
+ | # 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 * * * | ||
+ | |||
+ | # a las 23:10 restauramos el firewall | ||
+ | 10 23 * * * root / | ||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
linux/ssh.txt · Last modified: 2022/12/02 22:02 by 127.0.0.1