Pregunta Cientos de inicios de sesión ssh fallidos


Cada noche recibo cientos, a veces miles, de inicios de sesión ssh fallidos en mi servidor RedHat 4. Por razones de firewall desde sitios remotos, necesito ejecutarme en el puerto estándar. ¿Hay algo que debería hacer para bloquear esto? Me doy cuenta de que muchos vienen de la misma dirección IP. ¿No debería ser detener eso después de un tiempo?


76
2018-06-02 16:18


origen




Respuestas:


Puede usar iptables para limitar las nuevas conexiones entrantes al puerto SSH. Tendría que ver toda la configuración de su iptables para darle una solución llave en mano, pero básicamente está hablando de agregar reglas como:

iptables -A INPUT -p tcp --dport 22 -m recent --update --seconds 60 --hitcount 5 --name SSH --rsource -j DROP 
iptables -A INPUT -p tcp --dport 22 -m recent --set --name SSH --rsource -j ACCEPT 

Estas reglas asumen que está aceptando conexiones ESTABLECIDAS anteriormente en la tabla (de modo que solo las nuevas conexiones llegarán a estas reglas). Las nuevas conexiones SSH golpearán estas reglas y se marcarán. En 60 segundos, 5 intentos desde una sola dirección IP darán como resultado que se caigan nuevas conexiones entrantes de esa IP.

Esto ha funcionado bien para mí.

Edición: prefiero este método a "fail2ban" porque no hay software adicional para instalar, y sucede totalmente en modo kernel. No maneja los archivos de registro de análisis como "fail2ban", pero si su problema es solo con SSH, no usaría algo en modo de usuario que requiera la instalación de software y sea más complejo.


63
2018-06-02 16:25



Me gusta esta solución y planeo ponerla en su lugar esta noche, una vez que apague el fuego de hoy. - MattMcKnight
Disminuye los ataques y lo recomiendo, pero debido a que existen redes de bots de exploración distribuidas, no es una panacea. Seguirá habiendo inicios de sesión inválidos de botnets que ejecutan exploraciones distribuidas en su contra. Realmente no hay mucho que puedas hacer al respecto, a excepción de algún tipo de esquema de "detonación de puertos" para activar remotamente el puerto SSH cuando quieras entrar. - Evan Anderson
+1 por la sugerencia de @ evan "port knocking". Alguna información: linux.die.net/man/1/knockd . Pero no lo haga a la manera de la página de manual (es decir, agregando / eliminando reglas de iptables), sino que use -m condition iptables coincide en su lugar. - pepoluan
¿No necesita --dport 22 en estas reglas para que se apliquen solo para el tráfico ssh? - clime
@clime - Sí. Es difícil de creer que esto ha estado aquí hace 2 años y medio y nadie se dio cuenta! Buena atrapada. - Evan Anderson


fail2ban puede ayudar con esto bloqueando direcciones IP con demasiados intentos fallidos de inicio de sesión.


38
2018-06-02 16:20



No me gustan las herramientas / scripts que leen los registros y emito comandos en nombre del usuario sysadmin - asdmin
@asdmin, sí, especialmente cuando tener un buen historial ... - maxschlepzig


Recomendaría usar un puerto no estándar para SSH si puede (es decir, el puerto 10222) pero como mencionó que no puede hacer eso, recomendaría usar algo como DenyHosts.

http://denyhosts.sourceforge.net/

Gran paquete, fácil de instalar y configurar.


25
2018-06-02 17:16



No sé por qué la gente promueve esto; SSH está en un puerto estándar 22. Esto significa que cuando está en una red extranjera, no confía en que tengan un puerto no estándar abierto a través del firewall de salida. La solución real a este problema se documenta más arriba, ya sea restringiendo el número de conexiones repetidas a través de su firewall de entrada o desactivando los inicios de sesión de contraseña. - Andrew Taylor
OpenSSH 6.7 gotas soporte tcpwrappers, que es lo que utiliza denyhosts. - Zoredache


Si bien puede ser bueno poder ssh en su sistema desde ubicaciones arbitrarias en Internet, existen sistemas automatizados de ataque por contraseña que se bloquearán en un puerto ssh abierto y aplicarán varios ataques de cuenta y diccionario de Joe contra su sistema. Esto se puede agregar a su resumen de registro nocturno y es un desperdicio de ancho de banda.

Si tiene un servidor web en el mismo sistema, puede usar las envolturas php y tcp para restringir el tráfico entrante ssh a los sistemas conocidos, además de proporcionarle una clave de acceso para que pueda acceder desde sistemas arbitrarios en Internet.

Así es como lo haces:

Denegar todas las conexiones ssh en /etc/hosts.deny:

# /etc/hosts.deny fragment
sshd:  all

Permitir sistemas conocidos por IP en /etc/hosts.allow, además de agregar un archivo para acceso temporal:

# /etc/hosts.allow fragment
sshd:  10.0.10.2     # some system
sshd:  172.99.99.99  # some other system
sshd:  /etc/hosts.allow.temporary-sshd-access

Cree un archivo php en su servidor web y asígnele un nombre no obvio como my-sshd-access.php:

<?php
function get_ip()
{
    return getenv("REMOTE_ADDR"); 
}

?>

<?php
$out='/etc/hosts.allow.temporary-sshd-access';
$log='/var/log/sshd-access-addition-log';

print "Was:";
readfile($out);
print "<br>";
$ip=get_ip();
$fp=fopen($out,"w");
fputs($fp,$ip);
fclose($fp);

$lfp=fopen($log,"a");
fputs($lfp,$ip);
fputs($lfp,"n");
fclose($lfp);

print "Wrote: ";
readfile($out);
?>

Perdona el código de php: lo limpié de otra parte, por lo que probablemente podría ser limpiado un montón. Todo lo que hace es agregar la dirección IP del sistema que accede al archivo /etc/hosts.allow.temporary-sshd-access, que es leído por sshd (debido a su inclusión por /etc/hosts.allow) en el momento de la conexión .

Ahora, cuando se encuentra en un sistema arbitrario en la web y desea conectarse a este sistema, primero use un navegador web y presione este archivo (o use wget o equivalente):

$ wget http://your.system.name/my-sshd-access.php

Ahora debería poder ssh en su sistema. Si este es un lugar en el que es probable que se esté enviando con frecuencia, sería trivial leer el contenido del archivo /etc/hosts.allow.temporary-sshd-access y agregar permanentemente la dirección IP a / etc / hosts. permitir.


15
2018-06-02 17:07



Para hacer esto más seguro, ejecute esta página en https. - Robert Munteanu
Si cambia la secuencia de comandos para que no muestre el contenido del archivo de "dirección IP temporal permitida", no habrá nada que un sniffer pueda rastrear. Luego puedes ejecutarlo en http en lugar de https. - Barry Brown
La "dirección IP temporal permitida" es siempre la del solicitante (es decir, la suya). No creo que importe de una manera u otra. Https significa que la URL solicitada está encriptada, lo que significa que no es trivial descifrarla. - David Mackintosh
Esto no funcionará si está en una red que proporciona conexiones HTTP, pero su ruta directa a Internet es a través de una salida diferente. - Andrew Taylor
OpenSSH 6.7 gotas soporte tcpwrappers, que es lo que se usa en tu respuesta. - Zoredache


Es posible que desee mirar denyhosts también.

FYI: OpenSSH 6.7 gotas soporte tcpwrappers, lo que significa que denyhosts probablemente no sea la solución para nuevas instalaciones.


9
2018-06-02 16:23





Hazte un favor y deshabilita el inicio de sesión de contraseña. Utilice exclusivamente claves de autenticación (google ssh-keygen, por ejemplo, ejemplo: http://www.puddingonline.com/~dave/publications/SSH-with-Keys-HOWTO/document/html/SSH-with-Keys-HOWTO-4.html ) Su servidor será más seguro, se conectará a él de manera más cómoda (ver ssh-agent, ssh-add, keychain) y ya no será víctima de los ataques de fuerza bruta ssh.


8
2017-08-17 22:08





Otra solución es simplemente mover ssh a otro puerto. Estos gusanos son bastante estúpidos.


2
2018-06-02 16:28



El cartel original decía que necesitaba correr en el puerto estándar. - kbyrd
Lo siento, debo leer las preguntas con más cuidado :) - disserman
Tengo que estar de acuerdo ... Tengo mi SSH funcionando en puertos "alternativos" y hace una MUCHA de diferencia en los registros. Los gusanos son tan inteligentes como un ladrillo, por lo que funciona bien contra scripts de automatización tontos; No tan bien contra los atacantes humanos. Aún así, los registros tienen el sonido bendecido de silencio en ellos... - Avery Payne


Otra opción podría ser requerir que todas las conexiones ssh sean verificadas por un certificado y eliminar las contraseñas por completo.

Solía ​​usar Denyhosts, pero descubrí que solo me estaba conectando regularmente de forma remota desde un puñado de lugares, así que bloqueé todas las conexiones del puerto 22, excepto desde cualquier otro lugar, y utilizo el puerto para poder conectarme desde cualquier lugar con mi computadora portátil si tengo que .


2
2018-06-03 00:51