Tienda Wifi

Tienda Wifi
CiudadWireless es la tienda Wifi recomendada por elhacker.NET

Entradas Mensuales

Síguenos en:

Canal Oficial Telegram de elhacker.NET Grupo Facebook elhacker.NET Twitter elhacker.NET Canal Youtube elhacker.NET Comunidad Steam: Grupo elhacker.NET Mastodon

Entradas populares

PostHeaderIcon Mitigar ataques DDoS en un servidor web usando Fail2ban


Fail2Ban es un marco de software de prevención de intrusiones gratuito y de código abierto que se puede utilizar para proteger su servidor de ataques de fuerza bruta. Fail2Ban funciona mediante la supervisión continua de los archivos de registro (SSH, Apache, Auth) y prohíbe las direcciones IP que tienen los signos maliciosos tales como la acumulación de muchos fallos de contraseña.




¿Qué es Fail2ban?

Es un script programado en Python que "observa" los logs de Apache en busca de patrones sospechosos y es capaz de tomar medidas para bloquear a los atacantes ya sea con iptables o lanzando un comando de nuestra elección. Se distribuye bajo licencia GNU.


Instalar y configurar Fail2ban en Debian

apt-get install fail2ban

El directorio de configuración de Fail2ban se encuentra en: /etc/fail2ban/ en donde existen dos directorios mas: action.d y filter.d.

  • action.d: Encontraremos las acciones que Fail2ban realizará cuando alguno de nuestros filtros encuentre alguna IP haciendo maldades. Estas acciones pasan por filtrado con iptables, envio de e-mails de aviso o hasta realizar una llamada utilizando Asterisk.
  • filter.d: Tenemos todos los filtros que utilizaremos para identificar a nuestros atacantes.

Configuración para evitar DoS (Denial of Service)

Primer paso

Por defecto, todos los archivos de configuración de Fail2Ban se encuentran dentro del directorio /etc/fail2ban/.Puede listarlos todos con el siguiente comando:

ls -l /etc/fail2ban


De los archivos listados arriba, jail.conf es el archivo de configuración principal que contiene un conjunto de filtros predefinidos. Te recomendamos que cree un archivo separado /etc/fail2ban/jail.local. 

Editamos el archivo /etc/fail2ban/jail.conf y agregamos las siguientes líneas al final:

 ##Stop DOS attack from remote host. 
[http-get-dos]
 enabled = true
 port = http,https
 filter = http-get-dos
 logpath = /var/log/apache*/access.log
 maxretry = 400
 findtime = 400
 bantime = 200
 ignoreip = 192.168.43.193
 action = iptables[name=HTTP, port=http, protocol=tcp]

O bien: 


[http-get-dos] 
enabled = true
port = http,https
filter = http-get-dos
logpath = /var/log/apache2/ARCHIVO_ACCESS_LOG_DE_TU_SERVIDOR
maxretry = 300
findtime = 300
bantime = 300
action = iptables[name=HTTP, port=http, protocol=tcp]


Recomiendo utilizar:

backend = pyinotify

  • maxretry: Especifica cuantos intentos vamos a dejar antes de banear la ip.
  • findtime: Es el período de tiempo en segundos que estamos contando los "reintentos" (300 segundos = 5 minutos).
  • bantime: Es el tiempo que debemos esperar para liberar las peticiones, osea el tiempo que la IP estará baneada, en este caso se trata de 5 minutos.
  • ignoreip : Esta opción nos permite poner en la lista blanca las direcciones IP que no pueden ser bloqueadas por Fail2ban.
  • logpath : Esta opción especifica la ubicación del archivo de registro de servicios.

Segundo paso

Ahora creamos el archivo de filtrado en /etc/fail2ban/filters.d/http-get-dos.conf y dentro de el colocamos el siguiente contenido: 


# Fail2Ban configuration file 
 [Definition]
 
 # Option: failregex 
 # Note: This regex will match any GET entry in your logs, so basically all valid and not valid entries are a match. 
 # You should set up in the jail.conf file, the maxretry and findtime carefully in order to avoid false positives. 
 failregex = ^<HOST> -.*"(GET|POST).* 
 # Option: ignoreregex 
 ignoreregex =

El parámetro failregex es una expresión regular que coincidirá con cualquier entrada GET en sus registros, por lo que, básicamente, todas las entradas válidas y no válidas son una coincidencia. Se debe configurar en el archivo jail.conf, el maxretry y findtime cuidadosamente a fin de evitar falsos positivos.

Tercer paso

Reiniciamos Fail2ban

/etc/init.d/fail2ban restart

o bien:

systemctl restart fail2ban 

 Hasta ahora con esta configuración ya tenemos un servidor bastante seguro ante ataques ocasionales de denegación de servicio, pero es probable que necesite ajustes mas estrictos en maxretry y findtime para controlar los ataques de denegación de servicio distribuido (DDoS).


Comprobar estado;

fail2ban-client status

Resultado:


Status
|- Number of jail:    7
`- Jail list:    apache, apache-badbots, apache-noscript, apache-overflows, http-get-dos, ssh, sshd 

Verifiquemos el funcionamiento

Una manera sencilla de comprobar el funcionamiento de nuestra configuración anterior es utilizando ab (Apache Benchmark - parte del paquete apache2-utils) , así:


ab -n 500 -c 10 http://tu-sitio-web-punto-com:80/

 Si lo vamos a comprobar de manera local, debemos debemos comentar el parámetro ignoreip en el archivo de configuración /etc/fail2ban/jail.conf y luego reiniciamos Fail2ban, y hacemos la prueba así:

ab -n 500 -c 10 http://127.0.0.1:80/

 Esto enviara 500 page-loads en 10 conexiones simultaneas al servior web. Y por las reglas de maxretry y findtime que colocamos, las peticiones GET entrantes desde nuestra IP serán baneadas, y luego de que se cumpla el bantime podremos acceder nuevamente al sitio web.

Echamos un vistazo al log en /var/log/fail2ban.log y deberíamos ver algo como esto:

2014-02-22 05:37:21,943 fail2ban.actions: WARNING [http-get-dos] Ban YOUR_IP_ADDRESS2014-02-22 05:42:22,341 fail2ban.actions: WARNING [http-get-dos] Unban YOUR_IP_ADDRESS

Comando:

tail -f /var/log/fail2ban.log

Esto nos puede ayudar a controlar las peticiones en exceso que realizan scripts mal intencionados para realizar fuerza bruta en formularios de acceso, entre otros, con está técnica y los valores bien afinados deberíamos lograr evitar las peticiones inadecuadas a nuestro servidor. 

fail2ban-client status http-get-dos

 Resultado:

Status for the jail: http-get-dos

|- Filter

|  |- Currently failed:    2

|  |- Total failed:    650

|  `- File list:    /var/log/apache2/access.log

`- Actions

   |- Currently banned:    1

   |- Total banned:    1

   `- Banned IP list:    192.168.43.4


Fail2ban +  Listas de CloudFlare

Podemos utilizar las Listas de Cloudflare (Lists) para banear automáticamente en el WAF de CloudFlare.

En Fail2ban debemos añadir en [http-get-dos]
 
action =  cloudflare-list[]
La acción sería:

curl --request POST 'https://api.cloudflare.com/client/v4/accounts/XXX/items' \
--header "X-Auth-Email: webmaster@elhacker.net" \
--header "X-Auth-Key: XXX" \
--header 'Content-Type: application/json' \
--data-raw '[ { "comment": "<name>","ip": "<ip>" } ]'
Todo completo:
 
Editar fichero
 
/etc/fail2ban/action.d/cloudflare-list.conf

#
# Author: el-brujo
#
# IMPORTANT
#
# Please set jail.local's permission to 640 because it contains your CF API key.
#
# This action depends on curl (and optionally jq).
#
# To get your CloudFlare API Key: https://www.cloudflare.com/a/account/my-account
#
# CloudFlare API error codes: https://www.cloudflare.com/docs/host-api.html#s4.2

[Definition]

# Option:  actionstart
# Notes.:  command executed on demand at the first ban (or at the start of Fail2Ban if actionstart_on_demand is set to false).
# Values:  CMD
#
actionstart =

# Option:  actionstop
# Notes.:  command executed at the stop of jail (or at the end of Fail2Ban)
# Values:  CMD
#
actionstop =

# Option:  actioncheck
# Notes.:  command executed once before each actionban command
# Values:  CMD
#
actioncheck =

actionban = curl --request POST 'https://api.cloudflare.com/client/v4/accounts/XXX/items' \
  --header "X-Auth-Email: webmaster@elhacker.net" \
  --header "X-Auth-Key: XXX" \
  --header 'Content-Type: application/json' \
  --data-raw '[ { "comment": "<name>","ip": "<ip>" } ]'


#_cf_api_url = https://api.cloudflare.com/client/v4/user/firewall/access_rules/rules
_cf_api_url = https://api.cloudflare.com/client/v4/accounts/XXXXX/rules/lists/XXXX/items
_cf_api_prms = -H 'X-Auth-Email: <cfuser>' -H 'X-Auth-Key: <cftoken>' -H 'Content-Type: application/json'


[Init]

# If you like to use this action with mailing whois lines, you could use the composite action
# action_cf_mwl predefined in jail.conf, just define in your jail:
#
# action = %(action_cf_mwl)s
# # Your CF account e-mail
# cfemail  =
# # Your CF API Key
# cfapikey =

# account_id = XXXX
# list_id = XXX

cftoken = XXXXX

cfuser = webmaster@elhacker.net



#[Init?family=inet6]
#cftarget = ip6



 
En CloudFlare
 
Primero creamos una lista con nombre Fail2ban

  • Manage Account
  • Configurations
  • List

Después añadimos una regla en el firewall de Cloudflare (WAF)
 
Escogemos
 
  • IP Source Address --> is in list --> fail2ban

o editamos la expresión:
(ip.src in $Fail2ban)

 


3 comentarios :

Chiwy dijo...

¿También se puede hacer con Nginx?

el-brujo dijo...

Si, Fail2Ban también funciona con nginx, pero hay que mirar formato del log para la expresión regular

Anónimo dijo...
Este comentario ha sido eliminado por un administrador del blog.

Publicar un comentario

Los comentarios pueden ser revisados en cualquier momento por los moderadores.

Serán publicados aquellos que cumplan las siguientes condiciones:
- Comentario acorde al contenido del post.
- Prohibido mensajes de tipo SPAM.
- Evite incluir links innecesarios en su comentario.
- Contenidos ofensivos, amenazas e insultos no serán permitidos.

Debe saber que los comentarios de los lectores no reflejan necesariamente la opinión del STAFF.