Posterior a investigar en varios repositorios y sitios de internet al concluir dimos con la respuesta que te compartiremos más adelante.
Solución:
Hay diferentes soluciones. El mejor es usar la autenticación RSA que usa público/privado keys para autenticar a los usuarios.
Consulte este gran manual para diferentes enfoques (autenticación RSA incluida): http://www.la-samhna.de/library/brutessh.html
Estoy usando la tercera solución en mi servidor porque no quiero que sea complicado para mis usuarios no técnicos: usando iptables
para limitar la cantidad de conexiones por minuto que hace que los ataques de fuerza bruta sean ineficientes e ineficaces.
Aquí está la solución que estoy usando:
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -m recent --update --seconds 60 --hitcount 4 --rttl --name SSH -j LOG --log-prefix "SSH_brute_force "
iptables -A INPUT -p tcp --dport 22 -m recent --update --seconds 60 --hitcount 4 --rttl --name SSH -j DROP
Como se menciona aquí: esto permitirá tres conexiones del puerto 22 desde cualquier dirección IP dada dentro de un período de 60 segundos, y requerirá 60 segundos sin intentos de conexión posteriores antes de que se reanude permitiendo conexiones nuevamente. La opción –rttl también tiene en cuenta el TTL del datagrama al hacer coincidir los paquetes, para tratar de mitigar las direcciones de origen falsificadas.
Como se indica en la guía mencionada, es mejor usar una lista blanca para separar a los usuarios confiables de estas reglas:
iptables -N SSH_WHITELIST
luego agregue hosts confiables:
iptables -A SSH_WHITELIST -s $TRUSTED_HOST -m recent --remove --name SSH -j ACCEPT
y después de eso hacer las reglas:
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j SSH_WHITELIST
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 --rttl --name SSH -j ULOG --ulog-prefix SSH_brute_force
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 --rttl --name SSH -j DROP
Recibo ataques ssh de fuerza bruta en mis servidores con una tasa de 1 a 2 por día. He instalado denyhosts (paquete de ubuntu: denyhosts). Es una herramienta muy simple pero efectiva para ese propósito: esencialmente escanea periódicamente sus registros para detectar ataques de fuerza bruta y coloca las IP desde donde se originan estos ataques en su archivo /etc/hosts.deny. No volverás a saber de ellos y tu carga debería reducirse considerablemente. Es muy configurable a través de su archivo de configuración /etc/denyhosts.conf para modificar problemas como cuántos intentos incorrectos constituyen un ataque, etc.
Debido a su funcionamiento transparente, puede ver fácilmente lo que está sucediendo (notificación por correo electrónico: “¡Ajá, otro ataque cobarde frustrado!”) y deshacer errores debido a que sus usuarios escriben mal sus contraseñas repetidamente.
Por supuesto, todo lo dicho anteriormente sobre cambiar a otros métodos de autenticación se mantiene, pero a veces sus requisitos no concuerdan con los de sus usuarios.
Además, la limitación de la tasa de nuevas conexiones en iptables podría ser una mejor opción que negar el acceso a través de hosts.deny. Entonces, eche un vistazo a fail2ban también. Pero si sabe que la fuerza bruta de ssh es su principal preocupación (consulte manualmente /var/log/auth.log para determinarlo), use esta herramienta muy fácil y de bajo impacto.
- Cambie el puerto sshd a algo no estándar
- Utilizar
knockd
para implementar un golpe de puerto sistema - Usar iptables’
recent
yhashlimit
coincidencias para limitar los intentos SSH consecutivos - No uses contraseñas, pero usa SSH keys en lugar de