Protegiendo mi tostadora de ataques SSH.

Como ya viene siendo tradición, todos los años nos reunimos unos cuantos amigos para jugar al Minecraft en el mismo servidor. Hemos probado muchos, pero al final siempre llegamos a la conclusión de que uno nuestro es lo mas seguro y tranquilo. Así que me cae el muerto a mi, y ahí lo tengo, mi ordenador de 1º de carrera, mi tostadora (la cual se ha ganado ese apodo despues de un calentón que derritió el cable del monitor).

Montar un servidor casero es algo fácil, siempre que aprendas unos conceptos básicos. Instalas Debian (o el sabor que prefieras) en la máquina, instalas los servicios que quieras, lo configuras y abres los puertos de router. El problema es que uno de mis amigos publicó la IP de mi línea en Twitter, y entonces empezaron los ataques.

Algo que aprendí en el momento justo, es a mirar el fichero /var/log/auth.log, el cual registra todos los intentos de autenticación a mi máquina. Cuando lo abrí, esperaba ver mis intentos, las veces que me había equivocado de contraseña y el intento de algún amigo. Pero mi sorpresa fue enorme cuando me encontre líneas y líneas de esto.

Sep 28 00:36:06 tostadora sshd[30866]: Invalid user snoopy from 190.190.103.23
Sep 28 00:36:06 tostadora sshd[30866]: pam_unix(sshd:auth): check pass; user unknown
Sep 28 00:36:06 tostadora sshd[30866]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=190.190.103.23
Sep 28 00:36:06 tostadora sshd[30866]: pam_winbind(sshd:auth): getting password (0x00000388)
Sep 28 00:36:06 tostadora sshd[30866]: pam_winbind(sshd:auth): pam_get_item returned a password
Sep 28 00:36:08 tostadora sshd[30866]: Failed password for invalid user snoopy from 190.190.103.23 port 57355 ssh2
Sep 28 00:36:11 tostadora sshd[30869]: reverse mapping checking getaddrinfo for 23-103-190-190.cab.prima.net.ar [190.190.103.23] failed - POSSIBLE BREAK-IN ATTEMPT!

Esto que aparece aquí se repetía miles y miles de veces, cambiando el nombre de usuario snoopy por cualquier otro. Si analizamos que es lo que pone aquí, vemos que están probando nombres de usuario y contraseñas. A un ritmo de 20/30 por minuto. Aquí entiendo la importancia de tener una contraseña generada aleatoriamente, o que al menos, no aparezca en ningún diccionario.

Tras investigar, descubro que Linux tiene un firewall interno que me puede venir muy bien para este tipo de casos. Se llama IPTables. Lo único que tengo que hacer es decirle a IPTables que bloquee cualquier intento de conexión de una IP que haya tenido más de 4 intentos fallidos de conectarse por SSH en 1 minuto, de la siguiente manera:


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 4 --rttl --name SSH -j DROP

Si vuelvo a mirar el auth.log me encuentro con que el ataque sigue, pero tiene que cambiar de ip cada 4 intentos, en vez de los miles de intentos a lo largo del día, solo me encuentro 10 o 12, liberando muchísima carga y haciendo que su fuerza bruta pueda tardar milenios en encontrar algo.

Como últimos consejos de seguridad, si cambias el puerto SSH a otro que no sea el 22, le costará más trabajo al atacante. Y ya si cambias (como hago yo) la contraseña cada 2/3 meses, todo el trabajo de acierto/error que han estado probando será en vano.