Attaques DoS et Anti-DoS OVH

Un article sur les attaques DoS et les protections fournies par OVH.
Je n’ai pas énormément d’expériences sur le sujet mais le site ayant subit quelques attaques, j’ai tout de même quelques notions.
Le site est hébergé chez l’hébergeur OVH, ce dernier propose maintenant une solution Anti-DoS – voici une présentation de cette protection.

Quelques présentations d’attaques DoS

Il existe plusieurs types d’attaques, les plus répondus sont des attaques de type :

  • TCP Syn flood : ce dernier consiste à envoyer des requêtes SYN avec des IPs falsifiées (spoofing), le serveur peux alors répondre à ces requêtes (si le fait qu’elle soit falsifiées n’est pas détectée) est coulée sous la demande – le but est de saturer la couche réseau du serveur visé voire le système en son entier.
  • UDP flood : le mécanisme est assez similaire au TCP Syn – On peux aussi de tenter de saturer la bande passante du serveur.
  • HTTP Flood:  à destination des serveurs WEB – le but est d’envoyer une multitude de requêtes sur le serveur WEB pour le saturer.

Plus d’informations, se reporter au dossier sur les attaques DDoS : les attaques DoS

Les deux premières sont plutôt à destination de tout type de serveur (serveur de jeux, Teamspeak etc) – Notez que vous pouvez simuler une attaque de ce type avec le programme hping3 (par exemple, pour un Syn Flood : hping3 -S –faster dest).
Le dernier est à destination des serveurs WEB, c’est ce type d’attaque, que j’ai en général eu, puisqu’avec peu de ressources, on peux mettre à genoux un serveur WEB si aucune protection n’est présente.

Je ne parlerai pas donc des deux premières attaques. La protection Anti-DoS d’OVH est justement à destination de ce type d’attaque.

Une petite note pour vous signaler que votre serveur peux servir dans les attaques DoS par amplification/réflexion.
Le principe est d’envoyer les paquets sur un service en écoute qui va appliquer un facteur d’amplification.
Le facteur d’amplification peut-être sur les datas ou sur le nombre de paquets.
A partir de x machines qui devrait générer x paquets ou data, on peux donc parvenir à obtenir x*y paquets ou datas  et donc au final une attaque plus conséquente.

Les services DNS et NTP ont été utilisés dernièrement pour ces attaques par amplifications, pour le NTP, la page suivante donne une bonne explication : http://www.bortzmeyer.org/dns-attaque-ns-point.html

Ci-dessous, un exemple d’amplification de paquets sur mon kimsufi.
On voit en première ligne un SYN de 10 data avec une IP spoofée (Google) envoyé depuis une connexion ADSL.
Le kimsufi se met à envoyer une multitude de paquets ACK à Google.

Reflection_DoS
en abaissant la valeur /proc/sys/net/ipv4/tcp_synack_retries à 1, on constate que le nombre de paquets ack envoyé est moindre et donc l’amplification aussi.
Par défaut, sur Debian, le nombre est 5, vous pouvez par exemple le réduire à 3 : sysctl -w net.ipv4.tcp_synack_retries=3

Reflection_DoS2

Pour ceux qui sont chez OVH, après quelques essais, il semblerait qu’on ne peux pas s’appuyer sur une machine OVH pour en attaquer une autre (le spoof semble être rejeté).
Par contre, il est possible d’utiliser une machine OVH pour spoofer vers une machine or OVH (comme dans l’exemple ci-dessus en tappant sur Google).

Anti-DOS OVH

La protection Anti-DoS d’OVH consiste, lorsqu’une attaque est détectée, de rediriger le trafic vers le serveur à travers un VAC (solutions Arbor + Firewall Network).
Le VAC permet une mitigation, le trafic néfaste est stoppé et le trafic légitime passe. Cela permet d’atténuer voire de bloquer l’intégralité de l’attaque.
Un Firewall Network est aussi disponible sur lequel, il est possible de configurer soit même ses règles.

Voici un schéma qui résume cette solution :

OVH_AntiDoS

La protection protège donc du traffic venant d’internet mais pas du traffic intra-OVH
Notez que lorsqu’un serveur participe à DDoS en interne, OVH peut le détecter (j’imagine que ça dépend la vitesse de l’attaque), vous pouvez alors obtenir un mail « Anti-Hack » de ce type :

OVH_AntiHack_DDoS_mail

Ca peut vite monter avec un seul serveur :

DDoS_UDP_intra_OVH

Pour les utilisateurs Pro, il est possible de mettre son serveur en permanence derrière le VAC et le Firewall Network ou seulement le Firewall Network (donc sans le VAC).
Notez que cette solution protège contre les attaques venant de l’internet mais pas des attaques intra-OVH (un serveur OVH qui en attaque un autre).

Voici quelques traceroutes selon les différentes solutions :

Aucune protection activée :
DoS_traceroute_nu
Avec seulement le Firewall Network (saut de 11 à 14) :
DoS_traceroute_seulement_fw
Mitigation + Firewall network (saut de 11 à 14):

DoS_VAC_Firewall

La gestion de la mitigation, activer la mitigation en permanence ou Firewall Network (Options Pros obligatoires) ou ajouter des règles peux se faire à partir du manager OVH en version 6.
Ci dessous, la mitigation et le firewall sont activés :

DoS_OVH_mitigation_manager

 

Les règles du Firewall Network :

OVH_Firewall_reseau

OVH_Firewall_reseau2

L’ajout de règles sur le Firewall Network :DoS_OVH_mitigation_manager3

 

Une offre OVH pour des firewalls matériels est aussi disponible :

DoS_Syn

Lorsqu’une attaque est détectée par OVH et que la mitigation se met en route pour protéger le serveur, un mail vous ait envoyé.
De même, lorsque l’attaque est terminée, un mail vous le notifie.

OVH_DDoS_Protection_mail

Enfin notez que le programme floodmon peut aussi aider.
Vous pouvez aussi configurer le sytème pour limiter les SYNs, je vous laisse googler 🙂

La solution OVH permet donc de bloquer les attaques sur la couche 4.
Les attaques HTTP étant sur la couche 7, la solution Arbor n’est pas adaptée.

HTTP Flood

Ci-dessous quelques captures d’écran d’attaques HTTP :

DOS_HTTP3

DOS_HTTP2

DOS_HTTP

Cela peux faire vite pas mal de paquets : DOS_HTTP_MRTG2 DOS_HTTP_MRTG

Comme vous pouvez le constater sur les captures ci-dessus des logs Apache, il existe une pattern afin de pouvoir isoler les requêtes issues de l’attaque.
Par exemple, dans la première captures, on a un referrer avec des lettres aléatoires de 10 caractères . 2 caractères.
Dans le second cas, on a des GET sans referrer.
Via un script, on peux donc récupérer les reqûetes répétées à partir des pattern.
Cela demande donc quelques connaissances systèmes.

Ce qui peux arriver, c’est que la table de routage soit pleine, on obtient en général ce message : nf_conntrack: table full, dropping packet

Vous pouvez alors augmenter le nombre de paquets avec cette commande : sysctl -w net.ipv4.netfilter.ip_conntrack_max=<more than currently set>

Noter que vous pouvez aussi jouer sur le timeout:

sysctl -w net.ipv4.netfilter.ip_conntrack_tcp_timeout_established=54000
sysctl -w net.netfilter.nf_conntrack_generic_timeout=120

DoS_syslog

mod-evasive

Afin de limiter le nombre de requêtes sur une page, vous pouvez installer le module evasive pour Apache :

aptitude install libapache2-mod-evasive
a2enmod mod-evasive
/etc/apache2/mods-available/mod-evasive.conf

et ajouter :

<IfModule mod_evasive20.c>
           # taille de la table de surveillance, a augmenter pour les DDoS
           DOSHashTableSize 2048
           # Nb maximum de refresh d'une uri par periode
           DOSPageCount 5
           # Duree de la periode pour la uri
           DOSPageInterval 1
           # Nb maximum de requete sur le site par periode
           DOSSiteCount 150
           # Duree de la periode pour le site
           DOSSiteInterval 1
           # Duree du blacklistage de l'IP reconduite si retentative
           DOSBlockingPeriod 10
           # envoie de mail quant une IP est bloquee
           DOSEmailNotify "admin@localhost"
           # repertoire des logs
           DOSLogDir "/var/log/apache2/"
           # Whitelist non surveillee
           DOSWhiteList 127.0.0.1
           DOSWhitelist 192.168.0.*
</IfModule>

modsecurity peux aussi aider, puisqu’il incorpore des fonctions Anti-Dos : http://www.malekal.com/2013/08/12/presentation-modsecurity-pour-apache/

Renvoyer un 403

Ce qui peux être tenté aussi, c’est de faire renvoyer un 403 forbidden sur les requêtes issues de l’attaque.
Le 403 répondra plus vite et cela demandera surtout moins de ressources (surtout s’il y a des requêtes derrière, si par exemple, la page visée est une page de recherche).
Cela peux donc être fait avec du rewrite par exemple :

RewriteEngine On
RewriteCond %{HTTP_REFERER} [a-zA-Z0-9]{8}.[a-z]{2}$
RewriteRule ^.* - [F]

Par exemple si on veux interdir les POSTs sur la page index.php :


RewriteCond %{REQUEST_METHOD} POST
RewriteRule ^/index.php$ - [F] Si modsecurity est installée, on peux aussi ajouter une règle.

Limiter le nombre de connexions TCP par IP

Une option sympa d’iptables qui, d’après les tests fonctionne pas mal, c’est l’option connlimit.
Celle-ci permet de limiter le nombre de sessions TCP par IP.

Par exemple pour limiter à 10 sessions TCP par IP pour le port 80, cela donne :

/sbin/iptables -I INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 10 -j DROP

Firewall logiciel (ipset)

Si la requête contient des éléments non aléatoire, vous pouvez utiliser l’option string d’iptables – exemple, la règle ci-dessous bloque les GET /w00tw00t :

iptables -I INPUT -p tcp --dport 80 -m string --to 70 --algo bm --string 'GET /w00tw00t' -j DROP

ici on limite la vérification à une longueur de 70 caractères, veuillez à limiter au maximum la vérification, pour libérer des ressources.
En règle générale, si le nombre d’IPs est conséquente, l’ajout des IPs peut s’avérer long et bouffer des ressources (du fait qu’iptables joue les règles de manière linéaire).
IPset permet d’ajouter beaucoup d’IPs de manière rapides sans toucher aux règles iptables.
IPset nécessite de charger des modules dans le kernel.

modprobe ip_set_hash_net
modprobe ip_set_list_set

Pour créer un set :

ipset create attaquant hash:ip

auquel on applique une règle iptable – par exemple :

iptables -A INPUT -m set --match-set attaquant src -p tcp --dport 80 -j DROP

pour ajouter une IP dans le set attaquant :

ipset -! add attaquant IP

Pour ce type d’attaque, le gros problème est le nombre d’IPs, s’il y a vraiment beaucoup d’IPs, le temps de les récupérer sur Apache et les blacklister, de nouvelles IPs peuvent arriver pour saturer Apache.
De plus selon les ressources du serveur, si ces dernières était déjà limites en temps normal, bloquer une attaque sera plus difficile qu’avec un serveur sur-dimensionné.

Pour rappel, il existe aussi un topic pour sécuriser un serveur LAMP : https://forum.malekal.com/securiser-serveur-apache-php-mysql-lamp-t12276.html

EDIT – Décembre 13

Aujourd’hui, le site a subi une attaque.
La machine a été automatiquement basculée derrière la mitigation, ce qui est une bonne chose.
Le bémol, c’est qu’on est pas prévenu.

Par contre, ce qui est sympa, c’est que des statistiques ont été ajoutée sur le manager, on peux donc visualiser si l’attaque est toujours en cours avec le débit.

DoS

DoS5

Cela bloque l’attaque, il ne reste que les IPs intra-ovh qui ne sont pas filtrées, ici par exemple 176.31.50.237
DoS2

EDIT – 9 Février 2015

Un exemple d’attaque HTTP de type SlowLoris : http://forum.malekal.com/dos-attaque-type-slowloris-t50729.html

 

Comment lire d'autres tutoriels de malekal.com ?

Si le site vous a aidé, svp, débloquez les bloqueurs de publicités, n'hésitez pas non plus à partager l'article ou le site sur les réseaux sociaux.

Pour pouvoir lire plus d'articles et tutoriels, utilisez le menu en haut du site. Plein d'articles et tutos utiles vous attendent !

Besoin d'aide ?

Posez votre question ou soumettez votre problème sur le forum malekal.com pour obtenir une aide efficace : Aller sur le forum malekal.com
(Visited 566 times, 1 visits today)

One thought on “Attaques DoS et Anti-DoS OVH

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *