2013-02-15                                           Técnicas para contención                                            d...
Distributed                                           Denial                            DDoS =                            ...
Ataque de una botnetFriday, February 15, 2013                          3
Ataque de AnonymousFriday, February 15, 2013                         4
Ancho de banda de bajada                       fuente: ddos.arbornetworks.comFriday, February 15, 2013                    ...
Ancho de banda de subidaFriday, February 15, 2013                        6
Uso de memoria                            fuente: tumblr.comFriday, February 15, 2013                                   7
Efecto del ataque                        fuente: NetcraftFriday, February 15, 2013                                 8
Hipótesis                            Dilución del ataque en la nube                            Uso de caché estático      ...
Uso de la nubeFriday, February 15, 2013                    10
Caché estáticoFriday, February 15, 2013                    11
Imposición de límitesFriday, February 15, 2013                           12
Bloqueo de atacantesFriday, February 15, 2013                          13
IntegraciónFriday, February 15, 2013                 14
IntegraciónFriday, February 15, 2013                 15
IntegraciónFriday, February 15, 2013                 16
Modelo experimental                            Xen / KVM, 1 CPU, 1 GiB RAM, 25 GB HD                            CentOS 6 6...
Instalador de nodos en                                                         “La Nube”                            for i ...
Propagador de                                                     configuración hacia                                      ...
Adaptación de una                                                   zona para ”La Nube”              ;$TTL 86400! 1 day   ...
CDN por DNS Round Robin                            ;$TTL 3600! ; 1 hour                            $TTL 300! 5 min        ...
Configuración del caché estático              user           nginx;              worker_processes 1;              worker_rl...
Origen del caché estático              upstream local ! !   { server 127.0.0.1:8080; }              upstream mendozaaaa ! ...
accounting.log                            log_format accounting                                  $msec $time_local        ...
tail -f /var/log/accounting.log      1351169751.490 25/Oct/2012:07:55:51 -0500 | 174.129.84.42 | 301 | 410 | 0.000 | . | -...
Configuración de un sitio en el caché        server {!          listen 80; server_name ! nli.org.mx ;                      ...
Limitador de conexiones                # HTTP port 80                -A INPUT -p tcp -m tcp --dport 80 -m state --state NE...
Límite de peticiones - proxy-common              !      !      proxy_set_header X-Real-IP $remote_addr;              !    ...
Límite de peticiones - proxy-micro              !      !      proxy_set_header X-Real-IP $remote_addr;              !     ...
Reglas personalizadas por sitio                  !     location = /programa.html {                  !     ! include /etc/n...
Bloqueador de patrones conocidos                  common-attack.conf                            #Apache .htaccess         ...
Bloqueador de patrones conocidos                            # Bloqueo de cadenas muy largas                            loc...
Bloqueador de patrones conocidos                            if ($query_string ~ Anonymous ) {                            !...
Blocker cronjob                            # ...                            # Known strings used in brute force attacks 45...
Resultados del uso individual de                                  las técnicas propuestas                            Repli...
Resultados del uso combinado                                de las técnicas propuestas                            300 peti...
Resultados del uso combinado                                de las técnicas propuestas                            Picos de...
Resultados del uso combinado                                de las técnicas propuestas                            Provisio...
Agradecimiento                 A las personas que han aportado sus ideas                              nahual <nahual@secur...
Conclusiones                            Conforme aumenta la intensidad del                            ataque distribuído m...
Referencias                            http://en.wikipedia.org/wiki/Ddos#Distributed_attack                            htt...
Upcoming SlideShare
Loading in …5
×

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

1,516 views

Published on

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.

Published in: Technology

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

  1. 1. 2013-02-15 Técnicas para contenció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.Friday, February 15, 2013 1
  2. 2. Distributed Denial DDoS = of Service Ataque de negación de servicio distribuídoFriday, February 15, 2013 2
  3. 3. Ataque de una botnetFriday, February 15, 2013 3
  4. 4. Ataque de AnonymousFriday, February 15, 2013 4
  5. 5. Ancho de banda de bajada fuente: ddos.arbornetworks.comFriday, February 15, 2013 5
  6. 6. Ancho de banda de subidaFriday, February 15, 2013 6
  7. 7. Uso de memoria fuente: tumblr.comFriday, February 15, 2013 7
  8. 8. Efecto del ataque fuente: NetcraftFriday, February 15, 2013 8
  9. 9. 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 IPFriday, February 15, 2013 9
  10. 10. Uso de la nubeFriday, February 15, 2013 10
  11. 11. Caché estáticoFriday, February 15, 2013 11
  12. 12. Imposición de límitesFriday, February 15, 2013 12
  13. 13. Bloqueo de atacantesFriday, February 15, 2013 13
  14. 14. IntegraciónFriday, February 15, 2013 14
  15. 15. IntegraciónFriday, February 15, 2013 15
  16. 16. IntegraciónFriday, February 15, 2013 16
  17. 17. Modelo experimental Xen / KVM, 1 CPU, 1 GiB RAM, 25 GB HD CentOS 6 64 bits nginx nagios bash iptables bindFriday, February 15, 2013 17
  18. 18. Instalador de nodos en “La Nube” for i in `cat hosts | sed “s/#.*$/ ` ; do /” ssh $i < scripts/install-key ./scripts/install-node $i done ./sync-nginx-allFriday, February 15, 2013 18
  19. 19. 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 reload doneFriday, February 15, 2013 19
  20. 20. 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 ; raicilla www! ! ! CNAME! a.cdn.1-1-0-1.net. origen!! CNAME! b.w.h.srvr.mx.Friday, February 15, 2013 20
  21. 21. 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 B a! ! A! 50.97.145.147 ; Nodo H a! ! A! 50.97.65.34 ; Nodo I a! ! A! 50.19.77.249 ; Nodo J a! ! A! 23.22.168.71 ; Nodo KFriday, February 15, 2013 21
  22. 22. 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;Friday, February 15, 2013 22
  23. 23. 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.hFriday, February 15, 2013 23
  24. 24. 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 ;Friday, February 15, 2013 24
  25. 25. 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/ | -Friday, February 15, 2013 25
  26. 26. Configuración de un sitio en el caché server {! listen 80; server_name ! nli.org.mx ; e 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 ! ww.enli.org.mx ; w 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; ! }Friday, February 15, 2013 26
  27. 27. 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-prohibitedFriday, February 15, 2013 27
  28. 28. 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;Friday, February 15, 2013 28
  29. 29. 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;Friday, February 15, 2013 29
  30. 30. 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; ! } }Friday, February 15, 2013 30
  31. 31. Bloqueador de patrones conocidos common-attack.conf #Apache .htaccess location ~ /.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; }Friday, February 15, 2013 31
  32. 32. Bloqueador de patrones conocidos # Bloqueo de cadenas muy largas location ~ "(.{105})" { ! return 414 "Request-URI Too Long";! } if ($query_string ~ "(.{105})" ) { ! return 414 "Request-URI Too Long"; } # Un abuso conocido location = /wp-login.php { ! return 464 "Acknowledged Brute Force attack"; }Friday, February 15, 2013 32
  33. 33. 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"; }Friday, February 15, 2013 33
  34. 34. 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_FILE done # ...Friday, February 15, 2013 34
  35. 35. Resultados del uso individual de las técnicas propuestas 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 positivosFriday, February 15, 2013 35
  36. 36. Resultados del uso combinado de las técnicas propuestas 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 datosFriday, February 15, 2013 36
  37. 37. Resultados del uso combinado de las técnicas propuestas 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éFriday, February 15, 2013 37
  38. 38. Resultados del uso combinado de las técnicas propuestas 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 origenFriday, February 15, 2013 38
  39. 39. Agradecimiento A las personas que han aportado sus ideas nahual <nahual@security-dojo.com> gozner <mago@gozner.com> puilli <dan@microbit.com> A las personas que han participado en el desarrollo pajarito <gnu.yair@gmail.com>Friday, February 15, 2013 39
  40. 40. Conclusiones Conforme 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ónFriday, February 15, 2013 40
  41. 41. Referencias http://en.wikipedia.org/wiki/Ddos#Distributed_attack http://netfilter.org/documentation/HOWTO/packet-filtering-HOWTO.html http://www.tldp.org/HOWTO/DNS-HOWTO-5.html http://wiki.nginx.org/HttpCoreModule http://wiki.nginx.org/HttpProxyModule Sandino Araico Sánchez <sandino@1101.mx> #mendozaaaa @KBrownFriday, February 15, 2013 41

×