Le projet présenté est le dossier n°2 remis au jury pour l’épreuve E4, et celui-ci a été retenu pour qu’il soit modifié durant cette épreuve comme le voulait le référentiel. Je laisse ce document disponible dans sa version originale. Aucune modification n’a été faite depuis sa présentation à l’examen, en juin 2013.
Note: Toutes les commandes exécutées ont été lancées sur un serveur Debian en version 6. Depuis la version 7, certaines commandes pourraient ne plus être valables.
La situation initiale :
L’hôpital Lenval dispose d’une connexion internet en fibre optique de 8Mega pour son propre réseau et celui de Santa-Maria. De plus, le serveur d’E-mail (Exchange) utilise cette connexion pour envoyer les courriers depuis internet.
Le besoin :
Afin de garantir la sécurité de cette connexion à internet et pour garder une trace du trafic néfaste, un système de détection d’intrusion va être mis en place. Le but est de pouvoir surveiller toutes les données qui circulent entre le routeur du FAI et le Pare-Feu de l’hôpital.
A ce moment là, le dossier présentait une topologie logique de l’infrastructure qui devait être mise en place, cependant pour des raisons de sécurités j’ai préféré supprimer cet élément de l’article.
Matériels & logiciels utilisés :
Pour mettre en place notre IDS nous avons utilisé un poste reconditionné de marque Fujitsu Siemens (Processeur doubleur cœur et 2GO de mémoire vive, disque dur de 160 GO). Le système d’exploitation choisi sera du Linux avec une interface graphique permettant de visualiser les résultats directement sur la machine.
Le logiciel utilisé qui va permettre de récupérer nos activités sera SNORT, il comprendra l’installation d’une base de données pour recueillir nos attaques recensées. Une interface graphique sera installée pour mieux suivre les activités.
De ce fait, cette installation ne reposera que sur des logiciels libres.
I. A propos de :
1. SNORT
C’est un logiciel OpenSource développé par SourceFire qui est disponible sur le site officiel de SNORT. Cette même entreprise vends ses services en intégrant ce logiciel dans des équipements tels que les Pare-feux. Il est capable de détecter les intrusions par les protocoles TCP, UDP et ICMP, ainsi que les scanneurs de port. Cependant son but est de référencer les attaques et donc n’agit pas en conséquence.
Il s’agit de l’IDS le plus répandu et le plus utilisé. C’est pour cela qu’il a été choisi dans notre cas. Il est souvent mis à jour et dispose d’une base de données de règles, elle aussi mise à jour régulièrement. De ce fait, de nouvelles attaques sont trouvées chaque jour, d’où la nécessité d’avoir un logiciel fiable.
2. La sécurité
Pour éviter toute corruption de notre poste, nous le mettrons en place de façon à ce qu’il soit totalement autonome. C’est-à-dire, qu’il ne communiquera pas avec le reste du réseau privé et vers internet.
Pour cette raison, notre machine a été installée avec une interface graphique comme GNOME pour pouvoir visualiser les résultats directement sur le poste.
3. Les ressources utilisées
Pour réussir à mettre en place cette solution, nous avons utilisé différentes documentations disponibles sur internet ainsi que sur le site officiel de l’éditeur.
Cependant, les documentations trouvées ont nécessité des adaptations car certaines étapes des actions proposées n’étaient plus valides ou rendaient l’application inutilisable. La présentation suivante est fonctionnelle.
II. Installation de la solution
A) Installation et paramétrages des Pré-requis
Snort a besoin d’un certains nombres de paquets pour fonctionner, ceux-ci se trouvent dans les dépôts. Mais d’autres devront être installés manuellement en téléchargeant les sources et en les compilant.La carte réseau qui recevra les trames depuis l’extérieur ne sera configurée avec aucune adresse IP.
Toutes les commandes qui seront présentées, seront exécutées sous un système Linux Debian 6.0.7 (Squeeze) et en tant que super administrateur (root) :
1. Rajout des dépôts pour PHP et MySQL:.
En modifiant les fichiers sources avec la commande :Nano /etc/apt/sources.list
On rajoute les deux lignes suivantes :
deb http://packages.dotdeb.org squeeze all
deb-src http://packages.dotdeb.org squeeze all
Rajout de la clé public qui permettra de contacter le serveur :
cd /usr/src && wget http://www.dotdeb.org/dotdeb.gpg
cat dotdeb.gpg | apt-key add –
Puis, il faut mettre à jour la liste des paquets et éventuellement mettre à jour le système :
Apt-get update && apt-get upgrade
2. Installation des paquets nécessaires : Nous procédons à l’installation de tout ce qu’il sera nécessaire pour notre système d’intrusion (Apache et ses addons, Mysql, compilateurs etc…) :
apt-get install apache2 apache2-doc autoconf automake bison ca-certificates ethtool flex g++ gcc gcc-4.4 libapache2-modphp5 libcrypt-ssleay-perl libmysqlclient-dev libnet1 libnet1-dev libpcre3 libpcre3-dev libphp-adodb libssl-dev libtool libwww-perl make mysqlclient mysql-common mysql-server ntp php5-cli php5-gd php5-mysql php-pear sysstat usbmount vim
Lors de l’installation de MySQL, il est demandé de définir le mot de passe du serveur. Il s’agit du mot de passe du compte « root » du serveur. Plusieurs questions nous seront posées durant l’installation, nous laissons les options par défaut.
3. Installation de LibCAP: C’est un analyseur de paquet TCP, il n’est pas disponible depuis les dépôts d’installation, il est nécessaire d’effectuer une installation manuelle :cd /usr/src && wget http://www.tcpdump.org/release/libpcap-1.3.0.tar.gz
tar -zxf libpcap-1.3.0.tar.gz && cd libpcap-1.3.0
./configure --prefix=/usr && make && make install
4. Installation de Libnet :
cd /usr/src && wget http://libdnet.googlecode.com/files/libdnet-1.12.tgz
tar -zxf libdnet-1.12.tgz && cd libdnet-1.12
./configure --prefix=/usr --enable-shared && make && make install
5. Installation de DAQ:
Complément fourni par les concepteurs de SNORT :
cd /usr/src && wget http://www.snort.org/dl/snort-current/daq-2.0.0.tar.gz
tar -zxf daq-2.0.0.tar.gz && cd daq-2.0.0
./configure && make && make install
Mise à jour de la liste des « library » disponible pour le système :
echo >> /etc/ld.so.conf /usr/lib
echo >> /etc/ld.so.conf /usr/local/lib && ldconfig
6. Paramétrage du réseau:
Dans le fichier /etc/network/network, il faut vérifier que notre carte réseau va correctement remontée au démarrage du système pour éviter un plantage de SNORT à son lancement. Dans ce fichier, les lignes suivantes sont nécessaires :
allow-hotplug eth0
Désactivation de l’option « Large Receive Offload » sur la carte réseau qui récupérera les trames (préconisée dans la documentation de SNORT) :
ethtool -K eth1 gro off
7. Préparation de la base de données :
Création de la base de données pour SNORT et son utilisateur avec les droits qui sont définis :
mysql -u root –p
mysql> CREATE DATABASE snort;
mysql> grant CREATE, INSERT, SELECT, UPDATE on snort.* to snort@localhost;
mysql> grant CREATE, INSERT, SELECT, UPDATE on snort.* to snort;
mysql> SET PASSWORD FOR snort@localhost=PASSWORD('votrePasswordSnort');
mysql> SET PASSWORD FOR snort=PASSWORD('votrePasswordSnort');
mysql> flush privileges;
mysql>exit
B) Installation de SNORT
SNORT s’installe via apt-get mais il devra être configuré en deux fois. Car la base de données devra être créée après la première phase de la configuration :
1. Installation des paquetages :apt-get install snort-mysql snort-rules-default
Méthode de démarrage:
Choix de la carte réseau qui fera office de capture de trames :
L’outil de configuration de paquet s’arrête et nous demande d’importer la base de données disponible dans le répertoire : « /usr/share/doc/snort-mysql » 2. Importation de la base de données:De retour dans notre console Linux en root, les commandes suivantes sont exécutées pour l’importation :
cd /usr/share/doc/snort-mysql
gzip -d create_mysql.gz
mysql -u root –p
mysql>use snort;
mysql>source create_mysql
mysql > show tables;
(Pour voir si notre table a bien été créé)
mysql > exit
3. Relance de l’installation :
Suppression du fichier de blocage empêchant de définir les identifiants de la base de données :
rm /etc/snort/db-pending-config
dpkg --configure –pending
dpkg-reconfigure snort-mysql
Au lancement de ces deux commandes, l’outil de configuration va à nouveau, nous poser les mêmes questions. Nous laissons donc les options par défaut et cette fois, il est demandé de renseigner les identifiants pour la base de données :
- Serveur: localhost
- Utilisateur: snort
- Nom de la base de donnée : snort
- Mot de passe : votre_mot_de_passe
Une fois la configuration terminée, Snort doit se lancer sans erreur en exécutant la commande :
/etc/init.d/snort start
C) Installation de l’interface graphique BASE:
Base pour « Basic Analysis and Security Engine » est un addon développé par la communauté de SNORT. Il affichera les attaques qui seront répertoriées dans la base de données. Son installation s’effectue manuellement :
cd /usr/src && wget http://sourceforge.net/projects/secureideas/files/BASE/base-1.4.5/base-1.4.5.tar.gz
tar -zxf base-1.4.5.tar.gz && cp -r base-1.4.5 /var/www/base
chmod 777 /var/www/base
Notre interface est accessible à l’adresse http://localhost/base ou http://adresse_ip/base. Nous nous rendons sur la page pour le paramétrer :
Pour disposer des graphiques dans l’interface, des composants PEAR doivent être installés :
pear install Image_Color
pear install Image_Canvas
pear install Image_Graph
pear install Numbers_Word
pear install Numbers_Roman
D) Mise à jour des règles :
En installant SNORT, des règles par défaut ont été instaurées. Mais de nouvelles attaques sont répertoriées chaque jour par la communauté du logiciel. Afin d’être certains que l’IDS de l’hôpital détectera les attaques récentes, il doit être mis à jour.
Sur le site Officiel de Snort, une inscription est nécessaire pour disposer d’un « oinkcode » (élément encadrer en orange) qui va nous servir à télécharger les nouvelles règles :
1. Installation d’OinkMaster: C’est un script écris en PERL par l’éditeur du logiciel qui va nous servir à mettre jour les fichiers de règles qui sont présents dans /etc/snort/rules : Téléchargement du paquet :Wget http://prdownloads.sourceforge.net/oinkmaster/oinkmaster-2.0.tar.gz?download
Décompression du fichier :
tar zxvf oinkmaster-2.0.tar.gz?download
Copie des fichiers dans les répertoires:
Cd oinkmaster-2.0
Cp oinkmaster.conf /etc/oinkmaster-2.0.conf
Cp oinkmaster.conf usr/share/lib
Modification du fichier de configuration :
Nano /etc/oinkmaster-2.0.conf
Dans le fichier la ligne suivante est ajoutée :
url = http://www.snort.org/pub-bin/oinkmaster.cgi/b804c84132ca37c764a4e4b72fc7a851cdc2f60b/snortrules-snapshot-2931.tar.gz
Puis pour terminer, la mise à jour des règles s’effectuent en exécutant la commande :
usr/share/lib/ oinkmaster.pl –o /etc/snort/rules
III.Tests de la nouvelles solution
1. En interneLes premiers tests ont été effectués sur le réseau local de l’hôpital afin de connaître la réaction de notre détecteur d’intrusion. Le principe est de mettre la machine sur un étage de l’hôpital et créer un port miroir d’une fibre optique desservant l’étage. C’est ainsi qu’il a été possible de lancer un scanneur de port sur n’importe quel poste et d’avoir ainsi la possibilité de vérifier qu’il soit bien répertorié :
2. Réglage du cœur de réseau
Le test en interne étant réussi, notre machine a été installée à côté du cœur de réseau et un port miroir a été mis en place. Il enverra la totalité des données entrantes sur le poste. De même à cette occasion, la base de données a été vidée des précédentes données récoltées. Les commandes qui ont été exécutées sur le cœur de réseau sont les suivantes :
Pour valider le bon fonctionnement du détecteur d’intrusion, nous avons effectué un scan de port depuis un serveur privé (5.135.XXX.XXX) et installé l’outil nmap :
Apt-get install nmap
nmap -sS 213.244.XX.XXX
Starting Nmap 5.00 ( http://nmap.org ) at 2013-05-10 23:38 CEST
sendto in send_ip_packet: sendto(5, packet, 40, 0, 213.244.XX.XXX, 16) => Operation not permitted
Offending packet: TCP 5.135.XXX.XXX:41733 > 213.244.XX.XXX:80 A ttl=48 id=8850 iplen=40 seq=2931055400 win=1024 ack=4065922441
sendto in send_ip_packet: sendto(5, packet, 40, 0, 213.244.XX.XXX, 16) => Operation not permitted
Offending packet: ICMP 5.135.XXX.XXX > 213.244.XX.XXX Timestamp request (type=13/code=0) ttl=56 id=7826 iplen=40
sendto in send_ip_packet: sendto(5, packet, 44, 0, 213.244.XX.XXX, 16) => Operation not permitted
Offending packet: TCP 5.135.XXX.XXX:41733 > 213.244.XX.XXX:1720 S ttl=56 id=63892 iplen=44 seq=3781947308 win=1024 <mss 1460>
sendto in send_ip_packet: sendto(5, packet, 44, 0, 213.244.XX.XXX, 16) => Operation not permitted
Offending packet: TCP 5.135.XXX.XXX:41733 > 213.244.XX.XXX:995 S ttl=58 id=60061 iplen=44 seq=3781947308 win=3072 <mss 1460>
sendto in send_ip_packet: sendto(5, packet, 44, 0, 213.244.XX.XXX, 16) => Operation not permitted
Offending packet: TCP 5.135.XXX.XXX:41733 > 213.244.XX.XXX:1025 S ttl=48 id=10086 iplen=44 seq=3781947308 win=1024 <mss 1460>
sendto in send_ip_packet: sendto(5, packet, 44, 0, 213.244.XX.XXX, 16) => Operation not permitted
Offending packet: TCP 5.135.XXX.XXX:41733 > 213.244.XX.XXX:993 S ttl=48 id=48916 iplen=44 seq=3781947308 win=1024 <mss 1460>
sendto in send_ip_packet: sendto(5, packet, 44, 0, 213.244.XX.XXX, 16) => Operation not permitted
Offending packet: TCP 5.135.XXX.XXX:41733 > 213.244.XX.XXX:445 S ttl=44 id=57892 iplen=44 seq=3781947308 win=1024 <mss 1460>
sendto in send_ip_packet: sendto(5, packet, 44, 0, 213.244.XX.XXX, 16) => Operation not permitted
Offending packet: TCP 5.135.XXX.XXX:41733 > 213.244.XX.XXX:21 S ttl=38 id=40106 iplen=44 seq=3781947308 win=3072 <mss 1460>
sendto in send_ip_packet: sendto(5, packet, 44, 0, 213.244.XX.XXX, 16) => Operation not permitted
Offending packet: TCP 5.135.XXX.XXX:41733 > 213.244.XX.XXX:256 S ttl=50 id=47593 iplen=44 seq=3781947308 win=3072 <mss 1460>
sendto in send_ip_packet: sendto(5, packet, 44, 0, 213.244.XX.XXX, 16) => Operation not permitted
Offending packet: TCP 5.135.XXX.XXX:41733 > 213.244.XX.XXX:587 S ttl=41 id=21805 iplen=44 seq=3781947308 win=2048 <mss 1460>
Omitting future Sendto error messages now that 10 have been shown. Use -d2 if you really want to see them.
Interesting ports on et.s01.p1.cpe1.Lenval.nic.completel.fr (213.244.XX.XXX):
Not shown: 992 filtered ports
PORT STATE SERVICE
20/tcp closed ftp-data
22/tcp closed ssh
25/tcp closed smtp
53/tcp closed domain
80/tcp closed http
110/tcp closed pop3
113/tcp closed auth
443/tcp closed https
Nmap done: 1 IP address (1 host up) scanned in 11.69 seconds
Nous remarquons que tous les ports sont fermés et que le pare-feu Cisco rend l’audit des ports inutilisable.Mais grâce à ce test, SNORT a détecté le port de scan et a référencé l’IP du serveur privé dans sa base de données.Notre nouveau service fonctionne.Fin du dossier