Détection des attaques DDOS avec Nagios

Date: 8/12/2010 | Catégories: Nagios,Open-source,Planet-libre,Reseau | Tags: ,,,,

Les attaques DDOS sont sous le feu de la rampe (et des médias) depuis l'affaire Wikileaks.

C'est une attaque assez difficile à détecter car contrairement à des attaques plus "classiques", elle se base sur le fait d'inonder la machine cible de requêtes venant d'un nombre important de machines zombies (c'est à dire infecté par un programme qui va lancer une attaque).

Nous allons dans ce billet voir comment utiliser Nagios pour envoyer des alertes en cas de détection d'une attaque de type DDOS SYN Flood.

Pour cela j'ai développé (sous licnce GPL v3) un plugin Nagios disponible à l'adresse suivante:

https://raw.github.com/nicolargo/nagiosautoinstall/master/check_ddos.pl

Installation du script

Il faut disposer d'un serveur Nagios correctement configuré. Puis exécuter les commandes suivantes:

cd /usr/local/nagios/libexec

sudo rm -f check_ddos.pl

wget https://raw.github.com/nicolargo/nagiosautoinstall/master/check_ddos.pl

chmod a+rx check_ddos.pl

sudo chown nagios:nagios check_ddos.pl

Test du script:

./check_ddos.pl -w 50 -c 60

No DDOS attack detected (5/50)

Configuration de Nagios

Pour ajouter un service de détection DDOS SYN Flood sur la machine locale (en clair pour vérifier les attaques DDOS vers le serveur hébergeant Nagios), il faut dans un premier temps éditer le fichier commands.cfg (par défaut dans le répertoire /usr/local/nagios/etc/objects) pour ajouter la nouvelle commande de detection DDOS SYN Flood:

# check_ddos

define command{

command_name check_ddos

command_line $USER1$/check_ddos.pl -w $ARG1$ -c $ARG2$

}

Puis il faut éditer le fichier localhost.cfg (qui se trouve également dans le répertoire /usr/local/nagios/etc/objects):

# Define a DDOS SYN Flood detection service

# http://blog.nicolargo.com/?p=4100

# Warning: >50 SYN_RECV

# Critical: >70 SYN_RECV

define service{

use local-service

host_name bilbo

service_description DDOS SYN Flood detect

check_command check_ddos!50!70

}

Nous venons ainsi de définir un service qui va émettre une alerte Warning quand le serveur aura plus de 50 connexions de type SYN_RECV ouvertes (plus de 70 pour une alerte Critical). Ces chiffrent sont bien sur à adapter selon les serveurs...

En bonus, si une alerte est généré, le plugin affiche le TOP 10 des adresses IP des machines zombies (pratique pour les bloquer avec des règles de Firewall Iptables).

Si vous souhaitez surveiller les attaques DDOS SYN Flood sur une autre machine, il faut utiliser le plugin NRPE qui va faire l'interface entre le serveur Nagios et le serveur à superviser.

Sources pour la rédaction de ce billet:

  • Pingback: Tweets that mention Détection des attaques DDOS avec Nagios -- Topsy.com()

  • maskk

    Bonjour Nico, encore un super article que je vais appliquer des demain au boulot ^^ , en revanche, pour tester mon serveur web en dmz il me faut impérativement nrpe ? ou je pourrais faire un test par snmp? Merci bonne soirée

  • SurcouF

    L’étude rapide du plugin permet de voir qu’il utilise la sortie de la commande netstat. Je constate à ce sujet que les options de netstat utilisées ne limitent pas les protocoles et prennent inutilement en compte les connexions Unix et UDP. Ne serait-il pas opportun de limiter cela à TCP via l’option -t ? Le manuel de netstat précise d’ailleurs que la colonne d’état peut être vierge pour UDP et Unix…

    @maskk : pour te répondre rapidement, tu peux toujours exécuter des scripts via un agent Net-SNMP, si toutefois tu en disposes, via les directives exec (obsolète) et extend. Leurs tables respectivent permettent d’obtenir la sortie et le code de retour générés. Maintenant, pour rester purement dans le contexte SNMP, tu dois pouvoir obtenir la même information depuis la table TCP-MIB::tcpConnectionsTable (si cette MIB est implémentée par ton agent, comme Net-SNMP) ou .1.3.6.1.2.1.6.19. L’OID .1.3.6.1.2.1.6.19.1.7 permet ainsi d’obtenir l’état de la connexion TCP :
    1 – closed
    2 – listen
    3 – synSent
    4 – synReceived
    5 – established
    6 – finWait1
    7 – finWait2
    8 – closeWait
    9 – lastAck
    10 – closing
    11 – timeWait
    12 – deleteTCB

    Pour plus d’informations :
    http://net-snmp.sourceforge.net/docs/mibs/tcp.html#tcpConnectionTable

    • Exact pour l’option -t, je viens de mettre à jour le script en version 0.3.

      Je garde ton commentaire sur l’utilisation de SNMP pour aller lire l’état des tables TCP sous le coude, peut être pour un prochain plugin Nagios.

      Tu connais un plugin existant faisant la même chose par SNMP ?

      • SurcouF

        Pas à ma connaissance, non.

  • maskk

    rhooo ! merci beaucoup

  • SurcouF

    Et l’on peut même s’offrir le luxe de couper la connexion TCP via une requête SNMP SET en fixant tcpConnectionState à deleteTB(12).

  • maskk

    Je dois dire que tu m’impressionne ^^
    Jusque la je me contentais d’utiliser mes sondes gentiment surcouf, je vois le principe de MIB par contre comment construire une sonde a la main de base? (Desolé nico je te polue les com ^^)

    • Pas du tout le blog est justement fait pour voir naître ce genre de discussion…

    • SurcouF

      Et pourtant, je n’ai fait que lire la description de la MIB.

      • maskk

        Bonsoir j’ai essayé de m’inspirer du script de Nico mais bon c’est pas gagné ^^

  • Super intéressant, bon les admin sécu vont harceler les admin Supervision maintenant :))

  • kIMO

    Hello ,
    Ça fonctionne a merveille :d
    Merci NIco.

  • andre arseneault

    je croyais m’être débarassé d’une Prise de contrôle de mon ordi apres avoir lancé ton script mais en redémarrant mon ordi il était revenu j’ai refait ton script mais il revient. que puis-je faire?

    • Je ne comprend pas ta question. Mon script n’est pas fait pour empêcher une prise de contrôle à distance de ton serveur mais de détecter les attaques de type DDOS SYN…

  • Pingback: links for 2010-12-29 « SILOPOLIS Blog()

  • krachid

    Bonsoir,
    après redémarrage de mon serveur, j’ai rencontré un bug avec nagios ,
    le nagios refuse de démarrer il m’affiche « Starting nagios:CONFIG ERROR! Start aborted. Check your Nagios configuration. » et dans le web il affiche « Whoops!
    Error: Could not read host and service status information!

    The most common cause of this error message (especially for new users), is the fact that Nagios is not actually running. If Nagios is indeed not running, this is a normal error message. It simply indicates that the CGIs could not obtain the current status of hosts and services that are being monitored. If you’ve just installed things, make sure you read the documentation on starting Nagios.

    Some other things you should check in order to resolve this error include:

    Check the Nagios log file for messages relating to startup or status data errors.
    Always verify configuration options using the -v command-line option before starting or restarting Nagios!
    Make sure you’ve compiled the main program and the CGIs to use the same status data storage options (i.e. text file or database). If the main program is storing status data in a text file and the CGIs are trying to read status data from a database, you’ll have problems.

    Make sure you read the documentation on installing, configuring and running Nagios thoroughly before continuing. If all else fails, try sending a message to one of the mailing lists. More information can be found at http://www.nagios.org.  »

    j’ai essayé de voir avec /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg

    il m’a afficher qu’il y a un bug dans les ligne de detection ddos dans localhost.cfg :
    Error: Could not find any host matching ‘bilbo’ (config file ‘/usr/loca/nagios/etc/objects/localhost.cfg’, starting on line 162)
    Error: Could not expand hostgroups and/or hosts specified in service (config file ‘/usr/local/nagios/etc/objects/localhost.cfg’, starting on line 162)Error processing object config files!
    apres q j’ai commenté les lignes de détections des attaques ddos par #, j’ai réussi de lancé nagios.
    Avez-vous une idée de comment résoudre ce bug?

  • J’aimerai savoir comment on simule une attaque DDOS pour voir si notre configuration est correcte.

    Merci

  • zorgh

    Bonjour,

    Le script check_ddos.pl présente une coquille.

    Un sort -rn ne classera pas les IP par ordre décroissant de connexions de type SYN_RECV.

    Si les 2 premiers octets sont :

    8 63.208
    6 203.208
    2 203.208
    1 203.208

    La sortie sera :

    6 203.208
    2 203.208
    1 203.208
    8 63.208

    863 sera toujours inférieur à 6203

    Il faudrait pour cela effectuer un classement sur le préfixe du nombre d’occurences.

  • zorgh

    Cela va mieux comme ceci :

    sort -k1,1rn

    • Script corrigé et passé en version 0.4.

      Merci !

  • zendel

    Bonjour,

    En premier, je te félicite pour ton Blog qui m’a grandement aidé dans mes travaux.

    J’aurais une question sur le script.

    Celui-ci mesure bien le nombre de connexion au serveur ?

    Quand je l’applique, j’obtiens :
    No DDOS attack detected (0/50).

    Pourtant, je devrais avoir au moins une personne connecter (moi-même) ?

  • Ivy

    Bizarre, je n’arrive pas à obtenir http://svn.nicolargo.com/nagiosautoinstall/trunk/check_ddos.pl.
    Je ne peux pas l’atteindre avec mon browser et un wget me retourne :
    –2011-11-10 16:43:42– http://svn.nicolargo.com/nagiosautoinstall/trunk/check_ddos.pl
    Résolution de svn.nicolargo.com… 92.243.16.42
    Connexion vers svn.nicolargo.com|92.243.16.42|:80… connecté.
    requête HTTP transmise, en attente de la réponse… 403 Forbidden
    2011-11-10 16:43:42 ERREUR 403: Forbidden.

    pourtant j’ai essayé avec check_smart.pl(sur une autre page du blog)et ça marche.

    Ivy

    • Je suis passé de SVN à GIT… Je viens de changer le billet avec les bonnes URLS…

      • Ivy

        Oui c’est tout bon.
        Merci

  • Aaron5

    Salut Nicolargo, je viens de récupérer ton script. Il marche nikel en étant lancé par root, mais lorsque j’essaye de le lancer par nagios, il me renvoie:

    ./check_ddos.pl -w 50 -c 70
    netstat: no support for `AF INET (tcp)’ on this system.
    UNKNOWN: /bin/netstat -ant failed (256) at ./check_ddos.pl line 88.

    J’ai essayé de mettre « nagios ALL=NOPASSWD:/bin/netstat -ant » dans /etc/sudoers mais ca n’a pas réglé le problème.

    • jack

      Il faut positionner le SUID sur le fichier /bin/netstat

  • Bonjour Nicolargo,

    Tout d’abord bravo pour ton billet, il marche à merveille sur mes serveurs linux, par contre comment le mettre en place sur des serveurs Windows.

    Merci

    Cdlt,

  • Irvin Montes

    RIEN COMPRIS !

  • Kim Hòa Mai

    Je regardais votre plugin check_ddos.pl, ça fait plaisir. Mais je veux grandir à l’aide de l’algorithme «La détection précoce de l’attaque par SYN Seuil adaptatif (EDSAT) » pour déterminer le seuil de plug-in