Evitar ataques DoS a apache con mod_evasive

El ataque DoS (Denegación de Servicio / Denial of Service) o DDoS (Distributed Denial of Service, denegación de servicio distribuida), es un ataque a un sistema de servidores o red que causa que un servicio o recurso sea inaccesible a usuarios legítimos. El flujo masivo de peticiones (a través del protocolo TCP/IP) al servidor y los ataques de fuerza bruta provocan el colapso de la red, o la saturación del servidor en cuestión.

En esta entrada vamos a tratar de paliar los ataques DoS centrados en el servicio Apache, que consiste básicamente en lanzar peticiones al servidor web de forma masiva hasta colapsar el mismo. Gracias al módulo de apache mod_evasive conseguiremos redirigir el tráfico de esta peticiones ilegítimas hacia un error 403 (prohibido).

La última versión estable de mod_evasive puede descargarse en este enlace.
Compilación:

cd /root/descargas
wget http://www.zdziarski.com/projects/mod_evasive/mod_evasive_1.10.1.tar.gz
tar -zxf mod_evasive_1.10.1.tar.gz
cd mod_evasive

Si usamos apache1, deberemos compilar su módulo correspondiente (adecuad la siguiente línea a vuestra ruta de apache):

/usr/local/apache/bin/apxs -cia mod_evasive.c

Si usamos apache2, deberemos compilar su módulo correspondiente:

/usr/local/apache/bin/apxs -cia mod_evasive20.c

Veremos que tras la compilación, automáticamente ya carga el módulo en nuestro httpd.conf:

LoadModule evasive_module libexec/mod_evasive.so

Configuración:

El fichero de configuración (muestro los valores por defecto) lo cargaremos en un fichero aparte y lo llamaremos desde el httpd.conf (podéis cargar las opciones directamente en el httpd.conf, yo lo pongo separado para una mejor estructuración) :

Include «/usr/local/apache/conf/mod_evasive.conf»

Y el fichero que incluye las configuraciones del módulo:

DOSHashTableSize 3097
DOSPageCount 2
DOSSiteCount 50
DOSPageInterval 1
DOSSiteInterval 1
DOSBlockingPeriod 10
DOSEmailNotify correo@dominio.com
DosWhitelist 98.54.48.14 # Ip ficticia

Vamos a explicar un poco lo que es cada opción:

Podemos ver lo que es cada cosa en:

DOSHashTableSize

Cuanto más grande sea el tamaño de la tabla de Hash, más memoria requerirá, pero el rastreo de Ips será más rápido. Es útil aumentar su tamaño si nuestro servidor recibe una gran cantidad de peticiones, pero así mismo la memoria del servidor deberá ser también mayor.

DOSPageCount

Número de peticiones a una misma página para que una IP sea añadida a la lista de bloqueo, dentro del intervalo de bloqueo en segundos especificado en el parámetro DOSPageInterval

DOSSiteCount

Igual que ‘DOSPageCount’, pero corresponde al número de peticiones al sitio en general, usa el intervalo de segundos especificado en ‘DOSSiteInterval’.

DOSPageInterval
Intervalo en segundos para el parámetro umbral de DOSPageCount.

DOSSiteInterval
Intervalo en segundos para el parámetro umbral DOSSiteCount.

DOSBlockingPeriod
Periodo de bloqueo para una IP si se supera alguno de los umbrales anteriores.El usuario recibirá un error403 (Forbidden) cuando sea bloqueado, si el atacante lo sigue intentando, este contador se reseteará automáticamente, haciendo que siga más tiempo bloqueada la IP.

DOSEmailNotify
Dirección de correo electrónico que recibirá información sobre los ataques.

DosWhitelist
Podemos especificar una IP o rango que será excluido del rastreo por mod_evasive.

Si alguna de estas opciones no os han quedado claras, indicadmelo y trataré de explicarlo de otra forma. Es fácil comprenderlo en inglés, pero su traducción se hace complicada.

Finalmente reiniciamos apache y ejecutamos el script en perl de testeo (test.pl) que viene incluido en el .tar.gz . Si todo ha ido bien, veremos que al cabo de unas cuantas peticiones, bloqueará el acceso al servicio web:

HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden

HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden

Con esto ya tendríamos un protector de ataques DDoS a apache funcionando. No obstante, os puede ser de utilidad el siguiente comando, que nos indicará el nº de peticiones al puerto 80 por cada IP en el momento que lo ejecutemos:

netstat -plan|grep :80 | awk {‘print $5’}|cut -d: -f 1|sort|uniq -c|sort -n

Si solo queremos ver las establecidas:

netstat -plan|grep :80 | grep ESTABLISHED | awk {‘print $5’}|cut -d: -f 1|sort|uniq -c|sort -n

Esto es muy útil, pues a partir de dichos comandos, podemos averiguar rápidamente si una o varias IPs están haciendo un exceso de peticiones al servicio apache (fuerza bruta), y directamente filtrar la IP que queramos en nuestro firewall, por ejemplo en APF:

/usr/local/sbin/apf -d

De este modo, junto a la instalación de APF y BFD, nuestro servidor será menos vulnerable a ataques.

Como instalar y configurar BFD (Brute Force Detector)

BFD (Brute Force Detection), es un script en shell que parsea los logs de los diferentes servicios (ssh, ftp, apache, exim…) y chequea en busca de fallos repetitivos de autenticación, exceso de conexiones desde determinadas IPs, etc.

Combinado con APF (click aquí para acceder a una guía de instalación y configuración) forman un sistema de protección realmente bueno para nuestro sistema, ya que BFD le indicará a APF que IPs debe bloquear para que su acceso al servidor sea denegado (lo explicamos ahora):

Instalación de BFD:

La instalación es extremadamente sencilla:

cd /root/descargas
wget http://www.rfxnetworks.com/downloads/bfd-current.tar.gz
tar -xvzf bfd-current.tar.gz
cd bfd-0.7
./install.sh

Una vez hecho esto, nos indicará las rutas a ejecutables y ficheros de configuración:

.: BFD installed
Install path: /usr/local/bfd
Config path: /usr/local/bfd/conf.bfd
Executable path: /usr/local/sbin/bfd

Configuración de BFD:

Editamos el fichero de configuración con nuestro editor favorito:

vi /usr/local/bfd/conf.bfd

Activamos las alertas de ataque (cambiamos de 0 a 1), y configuramos que nos envíe un email por cada una:

ALERT_USR=»1″
EMAIL_USR=»tucuenta@tudominio.com»

Para evitar que el sitema bloquee nuestra IP local, la añadimos al fichero que guarda las IPs a ignorar en el rastreo, añadiremos p.ej. 192.168.1.1 en:

vi /usr/local/bfd/ignore.hosts

Ejecutamos el programa:

/usr/local/sbin/bfd -s

BFD chequeará los logs cada X tiempo, el que le indiquemos en su cron, por defecto cada 10 minutos:

[root@localhost ~]# cat /etc/cron.d/bfd
MAILTO=
SHELL=/bin/sh
#*/5 * * * * root /usr/local/sbin/bfd -q

Una vez comprendido esto, podéis personalizar las reglas que vienen por defecto para cada servicio, se encuentra en la siguiente ubicación:

/usr/local/bfd/rules

Con lo que más podéis jugar es con el valor “TRIG”, que indica el nº de conexiones o intentos permitidos para cada servicio, configuradlo en función de las necesidades de cada servicio:

TRIG=»45″

Con un poco más de paciencia, y estudiando cada regla puede personalizarse completamente, no obstante la seguridad de nuestro servidor, teniendo BFD + APF ha mejorado notablemente.

Fuente: rm-rf.es

Instalar APF (Advanced Policy Firewall) en sistema Unix

En esta entrada vamos a proteger nuestro sistema Unix con APF (Advanced Policy Firewall).

APF es un sistema de Firewall basado en IPtables, con la peculiaridad de que su manejo e instalación es extremadamente sencilla. Próximamente explicaremos también como instalar BFD, un detector de ataques de fuerza bruta, que unido a APF forman un excelente nivel de seguridad en el servidor, pues trabajan de forma conjunta.

Comenzamos con la instalación de APF:

cd /root/descargas (o la carpeta en la que guardes tus sources)
wget http://rfxnetworks.com/downloads/apf-current.tar.gz
tar -zxf apf-current.tar.gz
cd apf-0.*
./install.sh

Una vez instalado nos indicará las distintas rutas de ficheros de configuración y ejecutables:

Installation Details:
Install path: /etc/apf/
Config path: /etc/apf/conf.apf
Executable path: /usr/local/sbin/apf
AntiDos install path: /etc/apf/ad/
AntiDos config path: /etc/apf/ad/conf.antidos
DShield Client Parser: /etc/apf/extras/dshield/

Comenzamos a configurar APF, abirmos el fichero de configuración con nuestro editor favorito, estas son las opciones principales a configurar, recordad leer los comentarios en el fichero de configuración y en los README:

vi /etc/apf/conf.apf

Desactivamos/activamos el cron que desactiva el firewall cada 5 minutos, es útil activarlo mientras estemos de pruebas, pero aseguraos de dejarlo en 0 cuando el server entre en producción:

# Set firewall cronjob (devel mode)
# 1 = enabled / 0 = disabled
DEVEL_MODE=»1″

Interfaces de red que APF va a rastrear su tráfico, ponemos la interfaz que salga a Internet, en este caso es la eth1:

# Untrusted Network interface(s); all traffic on defined interface will be
# subject to all firewall rules. This should be your internet exposed
# interfaces. Only one interface is accepted for each value.
# NOTE: The interfacing structure is being worked towards support of MASQ/NAT
IFACE_IN=»eth1″
IFACE_OUT=»eth1″

Por otro lado, podemos configurar que ciertas interfaces no sean rastreadas por el firewall, pueden ser interfaces de tráfico local:

# Trusted Network interface(s); all traffic on defined interface(s) will by-pass
# ALL firewall rules, format is white space or comma seperated list.
IFACE_TRUSTED=»eth0″

Y para terminar la configuración básica, la parte más importante, la sección de puertos, configurable dependiendo de los puertos abiertos necesarios para cada servidor:

Puertos de entrada TCP permitidos:

# Common ingress (inbound) TCP ports
IG_TCP_CPORTS=»21,25,80,110,443,465″

Puertos de entrada UDP permitidos:

# Common ingress (inbound) UDP ports
IG_UDP_CPORTS=»»

Puertos de entrada ICMP permitidos:

# Common ICMP (inbound) types
# ‘internals/icmp.types’ for type definition; ‘all’ is wildcard for any
IG_ICMP_TYPES=»3,5,11″

Después están las mismas opciones, pero para salida, configurar según los requerimientos de cada uno. Y recordad revisar todas las demás opciones para sacar el mayor partido a este excelente firewall.

Otros dos ficheros importantes a tener en cuenta son :

/etc/apf/deny_host.rules
/etc/apf/allow_host.rules

En estos ficheros podemos incluir ips, rangos y reglas a las que denegar acceso (deny_host.rules) o permitir(allow_host.rules) al servidor. Finalmente arrancamos APF:

/usr/local/sbin/apf -s

Fuente: rm-rf.es

Bloquear el tráfico con IPTABLES desde/hacia una dirección IP

Una entrada rápida, sencilla y útil para usuarios principiantes de Linux, la forma más rápida de bloquear el acceso a una determinada IP o rango a un sistema es mediante IPTABLES, el comando a ejecutar es el siguiente:

Bloquear tráfico de entrada a una IP con IPTABLES:

iptables -I INPUT -s 12.34.56.78 -j DROP

Bloquear tráfico de salida a una IP con IPTABLES:

iptables -I OUTPUT -s 12.34.56.78 -j DROP

Bloquear visitas procedentes de un sitio web (Referrer Block)

Suele pasar a veces que hay links de spammers hacia tu web que no has puesto tu o vienen de sitios webs de sospechosa procedencia y no nos interesan esas visitas. Pueden ser sitios de spam, foros de spammers, sitios porno, o simplemente webs de las que no quieres recibir visitantes.

Para bloquear los visitantes procedentes de estos sitios webs, es necesario agregar unas pocas líneas en tu archivo .Htaccess

# spam_ref variable definida
SetEnvIfNoCase Referer "^ http:// (www.)? Refferer.com Sitio" spam_ref = 1
SetEnvIfNoCase Referer "^ http:// (www.)? Otra-site.com" spam_ref = 1
SetEnvIfNoCase Referer "^ palabra-incluido-en-dirección-url" spam_ref = 1
# bloquear todo el conjunto en spam_ref
<FilesMatch "(.*)">
Orden allow, deny
Dejar de todas las
Deny from env = spam_ref
</ FilesMatch>

«#»Añadido delante de las líneas. Htaccess, cancelar la línea. Digamos que una línea informativa.

SetEnvIfNoCase Referer "^ palabra-incluido-en-dirección-url" spam_ref = 1

Esto bloquea la línea de todos los sitios que contengan la URL, pon tu palabra, por ejemplo:

SetEnvIfNoCase Referer "^ adulto" spam_ref = 1

La línea anterior bloquear todos los sitios que contengan referencia «adulto»En la URL. adult123.com, adult.ro, 210391adult.net.

Esta es otra forma de bloquear SPAM en formularios, foros, comentarios …