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 :
- Position ( 1 ): Sur cette position, l'IDS va pouvoir détecter l'ensemble des attaques frontales, provenant de l'extérieur, en amont du firewall. Ainsi, beaucoup (trop?) d'alertes seront remontées ce qui rendra les logs difficellement consultables.
- Position ( 2 ): Si l'IDS est placé sur la DMZ, il détectera les attaques qui n'ont pas été filtrées par le firewall et qui relèvent d'un certain niveau de compétence. Les logs seront ici plus clairs à consulter puisque les attaques bénines ne seront pas recensées.
- Position ( 3 ): L'IDS peut ici rendre compte des attaques internes, provenant du réseau local de l'entreprise. Il peut être judicieux d'en placer un à cet endroit étant donné le fait que 80% des attaques proviennent de l'intérieur. De plus, si des trojans ont contaminé le parc informatique (navigation peu méfiante sur internet) il pourront êtres ici facilement identifiés pour être ensuite éradiqués.
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 :
- Mode écoute : Ce mode permet de lancer snort en mode sniffer et permet d'observer les paquets que l'IDS perçoit ("snort -v")
- Mode "log de paquets" : Le log de paquet permet l'archivage des paquets circulant sur le réseau de l'IDS. Il permet, gràce à ses arguments des opérations intéressantes permettant de limiter les logs à certains critères, comme une plage d'adresse IP (ex : "snort -l ../log/snort -h 192.168.0.0/24")
- Mode "détection d'intrusion" : Le mode IDS permet à snort d'adopter un comprtement particulier en cas de détection d'une (succession) de chaînes de caractères dans les paquets interceptés ; selon les règles définies dans les fichiers d'extension ".rules" du répertoire /rules ("snort -A full -d -l ../log -c $SNORTPATH/snort.conf").
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- l'action de la règle (la réaction de snort);
- le protocole qui est utilisé pour la transmission des données (snort en considère trois: TCP, UDP et ICMP);
- les adresses IP source et destination et leur masque;
- les ports source et destination sur lesquels il faudra vérifier les paquets.
- le message d'alerte;
- les conditions qui déterminent l'envoi de l'alerte en fonction du paquet inspecté.
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.