Técnicas de CDN para la mitigación de ataques distribuídos

Post on 08-Jul-2015

1.168 views 0 download

description

Este es el material de la presentación que hicimos el 13 de Febrero en Bugcon. Existen en el mercado muchos servicios con distintas técnicas para contener ataques distribuídos (todos ellos muy caros), pero ésta técnica es la única 100% Open Source y es la misma técnica que utilizamos en 1101 para nuestro servicio de protección contra ataques distribuídos. Hemos tenido muy buenos resultados pero los ataques evolucionan contínuamente por lo que tenemos que seguir agregando mejoras de donde esperamos poder presentar los nuevos nuevos avances con nuevos resultados para el Bugcon de 2014.

Transcript of Técnicas de CDN para la mitigación de ataques distribuídos

Derechos reservados © 2012-2013 Sandino Araico Sánchez <sandino@1101.mx>

Se permite ilimitadamente el uso, copia, redistribución con o sin modificaciones siempre y cuando se mantenga el aviso de derecho de autor y se anoten al final de la presentación todas las modificaciones que se llevan a cabo conservando la historia de las modificaciones que hagan las demás personas e indicando la fecha de cada modificación y el nombre de la persona que la llevó a cabo.

2013-02-15Técnicas para contención

de ataques distribuídos

1Friday, February 15, 2013

DDoS =

Distributed

Denial

of

Service

Ataque de negación de servicio distribuído

2Friday, February 15, 2013

Ataque de una botnet

3Friday, February 15, 2013

Ataque de Anonymous

4Friday, February 15, 2013

Ancho de banda de bajada

fuente: ddos.arbornetworks.com

5Friday, February 15, 2013

Ancho de banda de subida

6Friday, February 15, 2013

Uso de memoria

fuente: tumblr.com

7Friday, February 15, 2013

Efecto del ataque

fuente: Netcraft

8Friday, February 15, 2013

Hipótesis

Dilución del ataque en la nube

Uso de caché estático

Uso de límites de conexiones

Uso de límites de peticiones

Bloqueador de direcciones IP

9Friday, February 15, 2013

Uso de la nube

10Friday, February 15, 2013

Caché estático

11Friday, February 15, 2013

Imposición de límites

12Friday, February 15, 2013

Bloqueo de atacantes

13Friday, February 15, 2013

Integración

14Friday, February 15, 2013

Integración

15Friday, February 15, 2013

Integración

16Friday, February 15, 2013

Modelo experimentalXen / KVM, 1 CPU, 1 GiB RAM, 25 GB HD

CentOS 6 64 bits

nginx

nagios

bash

iptables

bind

17Friday, February 15, 2013

Instalador de nodos en “La Nube”

for i in `cat hosts | sed “s/#.*$//” ` ; dossh $i < scripts/install-key./scripts/install-node $i

done

./sync-nginx-all

18Friday, February 15, 2013

Propagador de configuración hacia “La Nube”

#sync-nginx-all RSYNC_PARAMS='-vacH --progress '

for i in `cat ./hosts | sed 's/#.*$//'` ; do! echo "===> rsync to: $i"! rsync $RSYNC_PARAMS ./etc/nginx/*conf root@$i:/etc/nginx/! rsync $RSYNC_PARAMS --delete ./etc/nginx/vhosts/ root@$i:/etc/nginx/vhosts/! ssh root@$i service nginx reloaddone

19Friday, February 15, 2013

Adaptación de una zona para ”La Nube”

;$TTL 86400!; 1 day$TTL 3600! ; 1 hour$ORIGIN enli.org.mx.

;@!! A! 75.126.210.124! ; hosting;www!CNAME! @! ! ;@! ! A! 50.30.46.179 ; raicillawww! ! ! CNAME! a.cdn.1-1-0-1.net.origen!! CNAME! b.w.h.srvr.mx.

20Friday, February 15, 2013

CDN por DNS Round Robin

;$TTL 3600! ; 1 hour$TTL 300!; 5 min$ORIGIN cdn.1-1-0-1.net.; A;a! ! A! 67.202.53.77 ; Nodo A;a! ! A! 23.22.63.20 ; Nodo Ba! ! A! 50.97.145.147 ; Nodo Ha! ! A! 50.97.65.34 ; Nodo I a! ! A! 50.19.77.249 ; Nodo Ja! ! A! 23.22.168.71 ; Nodo K

21Friday, February 15, 2013

Configuración del caché estático

user nginx;worker_processes 1;worker_rlimit_nofile 250000;events { worker_connections 65536;}! proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=STATIC:16m inactive=24h max_size=15g;! proxy_temp_path ! /data/nginx/tmp ;! !! open_file_cache max=10000 inactive=200s; ! open_file_cache_valid 300s; ! open_file_cache_min_uses 5;! open_file_cache_errors on;

22Friday, February 15, 2013

Origen del caché estático

upstream local ! ! { server 127.0.0.1:8080; }

upstream mendozaaaa !{ server 50.22.23.151:80; server 74.86.82.177:80; } #c.w.h

upstream mozillamexico ! { server 50.22.23.151:80; server 74.86.82.177:80; } #c.w.h

upstream enli! ! ! { server 50.22.23.151:80; server 74.86.82.177:80; } #c.w.h

23Friday, February 15, 2013

accounting.log

log_format accounting '$msec $time_local ' '| $remote_addr ' '| $status ' '| $bytes_sent ' '| $request_time ' '| $pipe ' '| $upstream_cache_status ' '| $upstream_status ' '| $upstream_response_time ' '| $host ' '| $uri ' '| $query_string ' ;

24Friday, February 15, 2013

tail -f /var/log/accounting.log

1351169751.490 25/Oct/2012:07:55:51 -0500 | 174.129.84.42 | 301 | 410 | 0.000 | . | - | - | - | mendozaaaa.net | / | - 1351169803.465 25/Oct/2012:07:56:43 -0500 | 123.125.71.31 | 200 | 17787 | 6.436 | . | EXPIRED | 200 | 1.611 | mozilla-mexico.org | / | - 1351169803.990 25/Oct/2012:07:56:43 -0500 | 100.43.83.140 | 302 | 665 | 0.858 | . | MISS | 302 | 0.858 | mozilla-mexico.org | /activity/p/968/ | - 1351169807.008 25/Oct/2012:07:56:47 -0500 | 100.43.83.140 | 200 | 4910 | 0.721 | . | MISS | 200 | 0.721 | mozilla-mexico.org | /members/lu15g3orge/activity/968/ | - 1351169807.667 25/Oct/2012:07:56:47 -0500 | 180.76.5.169 | 302 | 631 | 1.655 | . | MISS | 302 | 1.439 | mozilla-mexico.org | /activity/p/865/ | - 1351169811.958 25/Oct/2012:07:56:51 -0500 | 180.76.5.143 | 200 | 5074 | 4.069 | . | MISS | 200 | 3.635 | mozilla-mexico.org | /members/jusai/activity/865/ | -

25Friday, February 15, 2013

Configuración de un sitio en el caché

server {!listen 80; server_name !enli.org.mx ; access_log /var/log/nginx/accounting.log accounting; include /etc/nginx/common-attack.conf; location / { rewrite ^/(.*)$ http://www.$server_name/$1 permanent; } }

server {listen 80; server_name !www.enli.org.mx ;access_log /var/log/nginx/accounting.log accounting;error_log /var/log/nginx/error.log;include /etc/nginx/common-attack.conf; location / {

! ! include /etc/nginx/proxy-common.conf ;! ! proxy_pass http://enli; break; ! }

26Friday, February 15, 2013

Limitador de conexiones

# HTTP port 80-A INPUT -p tcp -m tcp --dport 80 -m state --state NEW -m recent \

--set --name DEFAULT --rsource -A INPUT -p tcp -m tcp --dport 80 -m state --state NEW -m recent \

--update --seconds 1 --hitcount 20 --name DEFAULT --rsource -j DROP -A INPUT -p tcp -m tcp --dport 80 --tcp-flags FIN,SYN,RST,ACK SYN

-m connlimit --connlimit-above 255 --connlimit-mask 24 -j DROP -A INPUT -p tcp -m tcp --dport 80 -m state --state NEW -j ACCEPT -A INPUT -j REJECT --reject-with icmp-host-prohibited

27Friday, February 15, 2013

Límite de peticiones - proxy-common

! ! proxy_set_header X-Real-IP $remote_addr;! ! proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;! ! proxy_set_header Host $http_host;! ! proxy_redirect off; proxy_cache STATIC; proxy_cache_valid 1d; proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504;! ! proxy_buffering on;! ! proxy_buffer_size 8k;! ! proxy_buffers 8 8k;! ! proxy_busy_buffers_size 16k;

28Friday, February 15, 2013

Límite de peticiones - proxy-micro

! ! proxy_set_header X-Real-IP $remote_addr;! ! proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;! ! proxy_set_header Host $http_host;! ! proxy_redirect off;

proxy_cache STATIC; proxy_cache_valid 15; proxy_cache_valid 200 5; proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504;! ! proxy_buffering on;! ! proxy_buffer_size 8k;! ! proxy_buffers 8 8k;! ! proxy_busy_buffers_size 16k;

29Friday, February 15, 2013

Reglas personalizadas por sitio

! location = /programa.html {! ! include /etc/nginx/proxy-micro.conf ;! ! proxy_pass http://enli; break; ! }

location ~ \.php {! ! include /etc/nginx/proxy-micro.conf ;! ! proxy_pass http://enli; break; ! }! location ~* \.(jpg|jpeg|gif|png|ico|css|js|ico)$ {! ! include /etc/nginx/proxy-common.conf ;! ! proxy_ignore_headers "Expires" "Cache-Control" "Set-Cookie" ;! ! proxy_pass http://enli; break; ! }}

30Friday, February 15, 2013

Bloqueador de patrones conocidos common-attack.conf

#Apache .htaccesslocation ~ /\.ht {! deny all;}## Only allow these request methods #### Do not accept DELETE, SEARCH and other methods ## if ($request_method !~ ^(GET|HEAD|POST)$ ) { return 444; }#Directory trasversal ../../../../../! if ($query_string ~ \.\.\/\.\.\/\.\.\/\.\.\/\.\.\/ ) {! ! return 404;! }location ~ url\(data:image\/png\;base64, {! return 404;}

31Friday, February 15, 2013

Bloqueador de patrones conocidos

# Bloqueo de cadenas muy largaslocation ~ "(.{105})" {! return 414 "Request-URI Too Long";!}if ($query_string ~ "(.{105})" ) {! return 414 "Request-URI Too Long";}# Un abuso conocidolocation = /wp-login.php {! return 464 "Acknowledged Brute Force attack";}

32Friday, February 15, 2013

Bloqueador de patrones conocidos

if ($query_string ~ Anonymous ) {! return 454 "Acknowledged DDoS attack";}#if ($query_string ~ Esperanos ) {#! return 454 "Acknowledged DDoS attack";#}if ($query_string ~ "Nunca%20bajaremos%20los%20brazos!%20Anonymous%20apoyando" ) {! return 454 "Acknowledged DDoS attack";}if ($query_string ~ "Somos%20El%20pueblo" ) {! return 454 "Acknowledged DDoS attack";}

33Friday, February 15, 2013

Blocker cronjob

# ...# Known strings used in brute force attacks 454 464 # Too long strings used in brute force attacks 414 for ERR in '414' '454' '464' ; do! for IP in `tac /var/log/nginx/accounting.log | head -25000 | grep "$LAST_999_SEC" | cut -d '|' -f 2,3 | grep " $ERR " | cut -d '|' -f 1 | sort | uniq -c | sort -nr | grep '[0-9][0-9][0-9] \+[0-9]' | cut -b 8-99` ; do! echo -n "Blocking IP | $IP | 100+ $ERR | " >> $LOG_FILE! $IPTABLES -I INPUT -s $IP -j DROP ; ! date >> $LOG_FILEdone# ...

34Friday, February 15, 2013

Replicación en la nube: Complejidad y costo

Caché estático: Evadible y abusable

Límite de conexiones: Puede afectar la respuesta hacia los visitantes auténticos

Límite de peticiones: El uso de CPU se dispara con ab, siege y fhttp

Bloqueador: Rissgo de falsos positivos

Resultados del uso individual de las técnicas propuestas

35Friday, February 15, 2013

300 peticiones por segundo antes de fallar

Uso de CPU entre 10% y 15% en nodos de caché

Uso de caché entre 6 y 10 GiB

El tamaño de los logs aumenta muy rápido

800 Mbps de bajada antes del null route del centro de datos

Resultados del uso combinado de las técnicas propuestas

36Friday, February 15, 2013

Picos de subida entre 25 y 80 Mbps

El blocker reduce efectivamente el uso de CPU y de ancho de banda de subida

El uso de CPU de los nodos de DNS es menor al 1%

Patrones de ataque no previstos han logrado evadir el caché

Resultados del uso combinado de las técnicas propuestas

37Friday, February 15, 2013

Provisionamiento de nuevos nodos de caché en menos de 15 min.

Efectos secundarios benéficos como uso menor de recursos de la base de datos

Cambio del origen a una red distinta entre 5 y 10 min.

Tolerancia a interrupciones del origen

Resultados del uso combinado de las técnicas propuestas

38Friday, February 15, 2013

Agradecimiento

nahual <nahual@security-dojo.com>

gozner <mago@gozner.com>

puilli <dan@microbit.com>

A las personas que han aportado sus ideas

pajarito <gnu.yair@gmail.com>

A las personas que han participado en el desarrollo

39Friday, February 15, 2013

ConclusionesConforme aumenta la intensidad del ataque distribuído mejora la capacidad de aislarlo y contenerlo

Siempre existen nuevas técnicas para evadir las técnicas de contención de ataques

El software libre y “la nube” han puesto la contención de ataques distribuídos al alcance de la población

40Friday, February 15, 2013

Referencias

http://en.wikipedia.org/wiki/Ddos#Distributed_attack

http://netfilter.org/documentation/HOWTO/packet-filtering-HOWTO.htmlhttp://www.tldp.org/HOWTO/DNS-HOWTO-5.html

http://wiki.nginx.org/HttpCoreModulehttp://wiki.nginx.org/HttpProxyModule

Sandino Araico Sánchez <sandino@1101.mx>@KBrown

#mendozaaaa

41Friday, February 15, 2013