IDS : Intrusion Detection Systems

Les IDS par la pratique (gratuite) : Snort

Mise en place d'un IDS

Où positionner son IDS ??

Il existe plusieurs endroits stratégiques où il convient de placer un IDS.

Le sché ma suivant illustre un réseau local ainsi que les trois positions que peut y prendre un IDS :

Positions d'un IDS

Idéalement, on placerait des IDS sur les trois positions puis on délèguerait la consultation des logs à l'application "acid" (cf http://acidlab.sourceforge.net/) qui permet d'analyser les alertes et d'en présenter clairement les résulats via une interface web complète. Si une seule machine peut être déployée, autant la mettre sur la position 2, crutiale pour le bons fonctionnement des services.


Installation et configuration de Snort

Snort est un IDS gratuit disponible dans sa version 2.2.20 (www.snort.org). A l'origine, ce fut un sniffer qui connnu une telle évolution qu'il fut vite adopter et utiliser dans le monde de la détection d'intrusion en s'appuyant sur une base de signature régulièrement enrichie par le "monde du libre".

Sous Linux (comme sous windows) son installation est simple et se résume (pour linux) par les commandes suivantes, une fois l'archive téléchargée dans le répertoire "/usr/local/snort"


cd /usr/local/snort
tar -xvf SNORT-2.2.*.tar.gz
./configure --mysql=/usr/lib/mysql
make
make install

Ainsi, on effectue le lien entre snort et mysql afin d'utiliser une base de donnée pour la détection d'intrusion. L'outil sera alors bien plus riche et réactif. Il est possible d'utiliser d'autres solutions de bases de données en renseignant les variables d'environnement corespondantes :


--with-postgresql=$PATH_POSTGRE : pour une base PostegreSQL
--with-oracle=$ORACLE_HOME : pour une base Oracle
-with-odbc=$PATH_ODBC : pour une base de données Microsoft SQL server

Afin d'indiquer à snort la base où il doit envoyer ses alertes, il convient de modifer la ligne suivante, dans le fichier de configuration "snort.conf":


#output database:log,mysql,user=root password=test dbname=SNORT 
host=localhost

par

output database:log,mysql,user=user password=password dbname=snort
host=localhost

Pour l'exemple, l'utilisateur "user" a pour mot de passe "snort_pwd", et le nom de la base MySQL utilisée par snort est "snort" (le serveur concerné est la machine où tourne snort).

Sous MySQL, il faut ensuite créer la base SNORT ainsi que l'utilisateur user en lui indiquant les bon paramètres par la commande suivante :


insert into user values('localhost', 'user_snort', password('password')
, 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 
'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', '', '',
'', '', 'Y', 'Y', 'Y');
grant ALL PRIVILEGES ON SNORT.* TO user@localhost IDENTIFIED BY 
'password' WITH GRANT OPTION; 	

Il est alors possible de lancer l'outil snort par la commande suivante, si nous voulons utiliser la base de donnée (au lieu de simple fichier texte de log, cf commande bis) :


/usr/local/snort*/src/snort -c /etc/snort/snort.conf

commande bis : 
/usr/local/snort*/src/snort -c /etc/snort/snort.conf -i eth0 -D

Lancement de Snort

Snort dispose de plusieurs modes de fonctionnements qui sont les suivants :


Fonctionnement des règles de Snort

Les règles de snort sont décrites dans un langage simple et suivent le schéma suivant :

l'en-tête de règle qui contient les options de la règle(entre parenthèse) qui contiennent

L'exemple de règle suivant est simple et permet de détecter les tentatives de login sous l'utilisateur root, pour le protocole ftp (port 21) :


alert tcp any any -> 192.168.1.0/24 21 (content: "USER root"; nocase; 
msg: "Tentative d'accès au FTP pour l'utilisateur root";)

Les messages en direction de cette plage d'adresse IP effectuant une tentative de login root ("USER root" contenu dans le paquet) auront pour conséquence la génération de l'alerte "Tentative d'accès au FTP pour l'utilisateur root".


Ainsi, il s'agit de renseigner ces variables par les champs que l'on pourrait trouver dans les paquets propres aux intrusion tels que les "shell code" que les "exploits" utilisent afin d'insérer des instructions malicieuses dans des programmes sujets aux "buffer overflows". Ainsi, ils obtiennent des accès privilégiés sur la machine et peuvent en prendre le contrôle.

Pour comprendre le fonctionnement des règles de snort, un exemple simple sera employé. Il s'agit ici de détecter la présence d'un ping provenant d'une station de type Windows et de lever une alerte, lorsque celle ci est détectée.

Pour cela, il nous faut récolter une trace que pourrait laisser une telle station. Il convient alors d'effectuer un ping à partir de cette station, tout en sniffant les paquets (tcpdump ou snort -v) afin d'avoir sa trace complète

Une fois les paquets identifiés, il s'agit de trouver les chaînes redondantes contenues dans ce paquets

La trace suivante montre un paquet typique provenant d'un tel ping :


[root@localhost etc]# tcpdump icmp -vv -X
tcpdump: listening on eth0, link-type EN10MB (Ethernet),
capture size 96 bytes 14:27:41.472192 
IP (tos 0x0, ttl 128, id 12102, offset 0,
flags [none], length: 60) windows > 192.168.0.101: icmp 40:
echo request seq 24300

0x0000 4500 003c 2f46 0000 8001 895e c0a8 0064 E..</F.....^...d
0x0010 c0a8 0068 0800 ea5b 0400 5f00 6162 6364 ...h...[.._.abcd
0x0020 6566 6768 696a 6b6c 6d6e 6f70 7172 7374 efghijklmnopqrst
0.0030 7576 7761 6263 6465 6667 6869           uvwabcdefghi
...
...

Ainsi, nous pouvons remarquer que la chaîne "abcdefghij..." est présente dans tous les paquets générés par les ping lancés pour la reconnaissance. On peut alors détecter de tels paquets en créeant la règle snort correspondante.

Sa syntaxe est simple :


alert icmp any any -> any any (msg:"Ping Windows détecté";\
content:"abcdefghijklmnop"; depth:16;)\

Enormément d'options sont disponibles afin d'affiner au mieux l'identification des paquets véhiculés dans le réseau.

Réactions de Snort

Les alertes émises par snort peuvent être de différentes nature. Par exemple, on peut spécifier à snort de rediriger l'intégralité des alarmes sur la sortie standard et ainsi observer l'évolution des attaques. Cependant, ceci nécessite une présence attentive devant un écran, ce qui peut parraîter rebutant.

Snort ne permet pas d'envoyer de mail directement, étant donné son rôle premier de sniffer qui est gourmand en ressource. L'envoi de mail d'alerte ralentirait snort d'une telle manière que beaucoup de paquets seraient "droppés" (éjectés). Qu'à cela ne tienne, Snort a été conçu pour interagir facilement avec le deamon syslogd afin que ce dernier génère les futurs logs qui peuvent être instantannément parsés par d'autres applications telles que "logsurfer" ou encore "swatch" respectivement :
http://www.obfuscation.org/emf/logsurfer/snort.txt http://www.theadamsfamily.net/~erek/snort/snort-swatch.conf.txt.

Ces derniers permettent d'envoyer un mail avec les logs attachés en pièces jointes, et donc aussi des sms, si l'entreprise dispose d'un tel serveur.

Snort est aussi capable d'adopter des comportements visant à interdire l'accès à certaines adresses IP, dans le cas où ces dernières auraient tenté de pénétrer le réseau. L'IDS peut alors interagir avec le firewall afin qu'il mette à jour ses règles d'accès pour empêcher tout contact avec l'éventuel pirate.

Il faut cependant ce méfier de cette possibilité puisqu'en cas de mauvaise configuration, elle peut facilement entrainer la coupure totale du réseau. Il convient alors d'utiliser une solution robuste, telle que "snortsam" (www.snortsam.net) et de lire attentivement les documentations.



Valid XHTML 1.0!