Blog de programación, errores, soluciones

Ataques por fuerza bruta a servidores(linux).

Si posees un servidor online como puede ser un VPS(virtual private server) o un server dedicado es probable que te preguntes lo siguiente, ¿qué tan probable es que mi server sea atacado por un hacker?

Los Ataques de fuerza bruta a servidores es algo mucho mas comun de lo que usted puede creer por ejemplo a este servidor a este momento de escribir este post ha sido atacado desde 135 ips diferentes desde todo el mundo.

¿Cómo puedo saber si me están atacando?

Bueno por lo general siempre te estan atacando desde todas partes, el echo es que la gran mayoria de atacantes no son personas, son crawlers o robots que intentan ingresar por fuerza bruta, ataques a el smtp y otros.

De esta manera no importa si tu web es grande, pequeña, sin valor por ahora, de gran valor o gratuita su entrada.

La manera en que puedes saber si estas siendo atacado es viendo los logs de tu server, esto lo puedes hacer con un simple comando en consola:

sudo tail -f /var/log/messages

esto nos ira mostrando los ataques que se esten haciendo, ademas en logs tenemos otro tipos de logs ademas de message.

Veamos que me tiraría el comando tail justo ahora:

Mar  4 17:09:30 xserver sshd[5367]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=221.181.185.19  user=root
Mar  4 17:09:32 xserver sshd[5367]: Failed password for root from 221.181.185.19 port 51842 ssh2
Mar  4 17:09:37 xserver sshd[5367]: message repeated 2 times: [ Failed password for root from 221.181.185.19 port 51842 ssh2]
Mar  4 17:09:37 xserver sshd[5367]: Received disconnect from 221.181.185.19 port 51842:11:  [preauth]
Mar  4 17:09:37 xserver sshd[5367]: Disconnected from authenticating user root 221.181.185.19 port 51842 [preauth]
Mar  4 17:09:37 xserver sshd[5367]: PAM 2 more authentication failures; logname= uid=0 euid=0 tty=ssh ruser= rhost=221.181.185.19  user=root
Mar  4 17:09:39 xserver sshd[5369]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=221.181.185.19  user=root
Mar  4 17:09:41 xserver sshd[5369]: Failed password for root from 221.181.185.19 port 16148 ssh2
Mar  4 17:09:45 xserver sshd[5369]: message repeated 2 times: [ Failed password for root from 221.181.185.19 port 16148 ssh2]
Mar  4 17:09:45 xserver sshd[5369]: Received disconnect from 221.181.185.19 port 16148:11:  [preauth]
Mar  4 17:09:45 xserver sshd[5369]: Disconnected from authenticating user root 221.181.185.19 port 16148 [preauth]
Mar  4 17:09:45 xserver sshd[5369]: PAM 2 more authentication failures; logname= uid=0 euid=0 tty=ssh ruser= rhost=221.181.185.19  user=root
Mar  4 17:09:47 xserver sshd[5371]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=221.181.185.19  user=root
Mar  4 17:09:49 xserver sshd[5371]: Failed password for root from 221.181.185.19 port 18175 ssh2
Mar  4 17:09:54 xserver sshd[5371]: message repeated 2 times: [ Failed password for root from 221.181.185.19 port 18175 ssh2]
Mar  4 17:09:54 xserver sshd[5371]: Received disconnect from 221.181.185.19 port 18175:11:  [preauth]
Mar  4 17:09:54 xserver sshd[5371]: Disconnected from authenticating user root 221.181.185.19 port 18175 [preauth]
Mar  4 17:09:54 xserver sshd[5371]: PAM 2 more authentication failures; logname= uid=0 euid=0 tty=ssh ruser= rhost=221.181.185.19  user=root
Mar  4 17:09:56 xserver sshd[5373]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=221.181.185.19  user=root
Mar  4 17:09:59 xserver sshd[5373]: Failed password for root from 221.181.185.19 port 24404 ssh2
Mar  4 17:10:03 xserver sshd[5373]: message repeated 2 times: [ Failed password for root from 221.181.185.19 port 24404 ssh2]
Mar  4 17:10:03 xserver sshd[5373]: Received disconnect from 221.181.185.19 port 24404:11:  [preauth]
Mar  4 17:10:03 xserver sshd[5373]: Disconnected from authenticating user root 221.181.185.19 port 24404 [preauth]
Mar  4 17:10:03 xserver sshd[5373]: PAM 2 more authentication failures; logname= uid=0 euid=0 tty=ssh ruser= rhost=221.181.185.19  user=root
Mar  4 17:10:05 xserver sshd[5375]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=221.181.185.19  user=root
Mar  4 17:10:06 xserver sshd[5375]: Failed password for root from 221.181.185.19 port 27519 ssh2
Mar  4 17:10:11 xserver sshd[5375]: message repeated 2 times: [ Failed password for root from 221.181.185.19 port 27519 ssh2]
Mar  4 17:10:11 xserver sshd[5375]: Received disconnect from 221.181.185.19 port 27519:11:  [preauth]
Mar  4 17:10:11 xserver sshd[5375]: Disconnected from authenticating user root 221.181.185.19 port 27519 [preauth]
Mar  4 17:10:11 xserver sshd[5375]: PAM 2 more authentication failures; logname= uid=0 euid=0 tty=ssh ruser= rhost=221.181.185.19  user=root

Como puede ver aquí tenemos varios ataques, muy rápidos al servir tratando de entrar la mayoria con el nombre de usuario root, ya que es el que viene por defecto en los servidores.

¿Qué medidas puedo adoptar para no ser hackeado?

Si estás usando root como tu usuario te recomiendo cambiarlo.

Segundo te recomiendo utilizar una clave larga por lo menos de 15 caracteres alfanumerico con simbolos de ser posible.

Tercero bloquea las ip que te están atacando, esto lo puedes hacer con:

 iptables -A INPUT -s {ip a ser bloqueada} -j DROP

Hagamos un ejemplo con el código anterior, yo se que me estan atacando desde

221.181.185.19

Veamos de quien se trata en https://www.abuseipdb.com/

Podemos ver en esta imagen que nos estan atacando desde china y que esta ip ya ha sido utilizada en ataques hacia otros servidores y ha sido reportada unas 42,640 veces.

Para bloquearla deberemos correr el siguiente comando:

iptables -A INPUT -s 221.181.185.19 -j DROP

De esta manera este atacante no podrá hacer nada, ya que los paquetes que el envíe serán desechados, sin mandar paquetes a cambio.

podemos ver las ips bloqueadas con el siguiente comando

 iptables -L INPUT -v -n

Genial ¿pero puedo automatizar esto?

La respuesta es si, hay ciertos programas que hacen esto por nosotros fail2ban es una herramienta muy útil para bloquear ips que estén tratando de hackear el server.

la gente de fail2ban lo define de la siguiente manera:

Fail2ban scans log files (e.g. /var/log/apache/error_log) and bans IPs that show the malicious signs — too many password failures, seeking for exploits, etc. Generally Fail2Ban is then used to update firewall rules to reject the IP addresses for a specified amount of time, although any arbitrary other action (e.g. sending an email) could also be configured. Out of the box Fail2Ban comes with filters for various services (apache, courier, ssh, etc).

Fail2ban

para poder utilizar fail2ban necesitaremos python.

Una vez tengamos python podremos instalar fail2ban correndo el siguiente comando en consola:

sudo apt-get install fail2ban

Una vez tengamos instalado fail2ban podemos crear un archivo jail.local (recomendado)

cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

El programa fail2ban lee primero el .config y luego el local el cual sobreescribe lo del .config, este último es bueno tenerlo sin modificaciones de referencia.

En nuestro .local cambié esta línea como se ve a continuación o la saquemos de comentario(acción preferida):

ignoreip = 127.0.0.1/8

Tenga en cuenta que 127.0.0.1 y :: son el localhost estas ips deben ser ignoradas porque sería el host mismo. En ignore puede poner otras ips separadas por espacios esto es bueno si tenemos una ip fija en nuestra casa o la empresa a la que le estemos configurando el programa.

Una vez cambiada guardé los cambios al archivo y corra en consola

service fail2ban restart

Esto hará que corra fail2ban con los cambios efectuados.

Otras opciones las cuales son configurables en fail2ban son: bantime, maxretry, findtime.

Podemos chequear cuantas ips ha bloqueado con:

fail2ban-client status
Somethig wrong? If you found an error or mistake on the content you can contact me on twitter | @luisg2249_luis.
Last 4 post in same category