David Pellissier et Michael Ruckstuhl
ATTENTION : Commencez par créer un Fork de ce repo et travaillez sur votre fork.
Clonez le repo sur votre machine. Vous retrouverez notamment dans ce repo les ficher Dockerfile
et docker-compose.yml
indispensables pour l'ajout des conteneurs et configuration du réseau.
Vous pouvez répondre aux questions en modifiant directement votre clone du README.md ou avec un fichier pdf que vous pourrez uploader sur votre fork.
Le rendu consiste simplement à compléter toutes les parties marquées avec la mention "LIVRABLE". Le rendu doit se faire par une "pull request". Envoyer également le hash du dernier commit et votre username GitHub par email au professeur et à l'assistant
Installation de l’environnement virtualisé
Tests des connections et exemple de l'application d'une règle
Règles pour les protocoles HTTP et HTTPS
L’objectif principal de ce laboratoire est de familiariser les étudiants avec les pares-feu et en particulier avec netfilter et iptables. En premier, une partie théorique permet d’approfondir la rédaction de règles de filtrage.
Par la suite, la mise en pratique d’un pare-feu permettra d’approfondir la configuration et l’utilisation d’un pare-feu ainsi que la compréhension des règles.
Ce texte se réfère au laboratoire « Pare-feu » à suivre dans le cadre du cours Sécurité des Réseaux, 2021, version 7.0. Au cours du temps, il a été rédigé, modifié et amélioré par les co-auteurs suivants : Gilles-Etienne Vallat, Alexandre Délez, Olivia Manz, Patrick Mast, Christian Buchs, Sylvain Pasini, Vincent Pezzi, Yohan Martini, Ioana Carlson, Abraham Rubinstein et Frédéric Saam.
Ce travail devra être rendu le dimanche après la fin de la 2ème séance de laboratoire, soit au plus tard, le 01 avril 2021, à 23h59.
Durant ce laboratoire, nous allons utiliser une seule topologie réseau :
Notre réseau local (LAN) sera connecté à Internet (WAN) au travers d’un pare-feu. Nous placerons un serveur Web en zone démilitarisée (DMZ).
Par conséquent, nous distinguons clairement trois sous-réseaux :
- Internet (WAN), le réseau de l'école ou votre propre réseau servira de WAN,
- le réseau local (LAN),
- la zone démilitarisée (DMZ).
Ce réseau sera créé de manière virtuelle. Il sera simulé sur un seul ordinateur utilisant trois conteneurs Docker basés sur le système d’exploitation Ubuntu :
- La première machine, Firewall, fait office de pare-feu. Elle comporte trois interfaces réseaux. Afin que ce poste puisse servir de pare-feu dans notre réseau, iptables sera utilisé.
- La seconde machine, Client_In_LAN, fait office de client dans le réseau local (LAN).
- La dernière machine, Server_In_DMZ, fait office de serveur Web en (DMZ).
Nous allons utiliser les trois interfaces réseaux de la machine Firewall afin de pouvoir connecter le LAN et la DMZ à Internet (WAN). Les machines Client_In_LAN et Server_In_DMZ comportent chacune une interfaces réseau eth0.
Afin de bien spécifier le réseau, il est nécessaire d’avoir un plan d'adressage précis. C'est la liste des réseaux que vous utiliserez, comprenant pour chaque interface l'adresse IP ainsi que le masque de sous-réseau. Pour ce laboratoire, nous vous imposons le plan d’adressage suivant :
- Le réseau "LAN" → 192.168.100.0/24
- Le réseau "DMZ" → 192.168.200.0/24
- Le réseau "WAN" sera défini par le NAT interne du réseau Docker
Les adresses IP sont définies dans le schéma ci-dessous :
Avant de configurer les règles, il est primordial de connaître les besoins de notre réseau. Ceci afin de laisser passer les flux légitimes lors de la rédaction des règles.
Le but du LAN est de fournir aux utilisateurs de votre réseau un accès à Internet ; à certains services de base uniquement en empêchant les connexions provenant de l'extérieur. Il faudra tout de même laisser entrer les paquets répondants aux requêtes de notre LAN. Une seule machine est présente sur ce réseau. Il s’agit de la machine dont le nom est Client_In_LAN. (il est très facile de rajouter de machines supplémentaires sur le LAN utilisant Docker). __ La DMZ est un réseau réservé aux serveurs que l'on veut rendre accessibles depuis l'extérieur et l’intérieur de notre réseau. Par exemple, si nous voulons publier un site web que l'on héberge, il faut accepter des connexions sur le serveur web; dans ce cas, nous ne pouvons pas le placer dans le LAN, cela constituerait un risque. Nous accepterons donc les connexions entrantes dans la DMZ, mais seulement pour les services que l'on désire offrir. Le serveur Web situé dans la DMZ est simulé par la machine Server_In_DMZ.
Le WAN n'est que l'accès à Internet. Il est connecté au réseau de l'école ou à votre propre à travers le système de réseau fourni par Docker.
Pour établir la table de filtrage, voici les conditions à respecter dans le cadre de ce laboratoire :
- Les serveurs DNS utilisés par les postes dans le LAN sont situés sur le WAN. Les services DNS utilisent les ports UDP 53 et TCP 53.
- Laisser passer les PING uniquement du LAN au WAN, du LAN à la DMZ et de la DMZ au LAN pour les tests. Le ping utilise le protocole ICMP (echo request et echo reply).
- Les clients du LAN doivent pouvoir ouvrir des connexions HTTP pour accéder au web. Le protocole HTTP utilise les ports TCP 80 et typiquement aussi le 8080.
- Les clients du LAN doivent pouvoir ouvrir des connexions HTTPS pour accéder au web. Le protocole HTTPS utilise le port TCP 443.
- Le serveur web en DMZ doit être atteignable par le WAN et le LAN et n'utilise que le port 80.
- Le serveur de la DMZ peut être commandé à distance par ssh depuis votre client du LAN uniquement. Le service ssh utilise le port TCP 22.
- Le firewall peut être configuré à distance par ssh depuis votre client du LAN uniquement.
- Toute autre action est par défaut interdite.
- En suivant la méthodologie vue en classe, établir la table de filtrage avec précision en spécifiant la source et la destination, le type de trafic (TCP/UDP/ICMP/any), les ports sources et destinations ainsi que l'action désirée (Accept ou Drop, éventuellement Reject).
Pour l'autorisation d'accès (Accept), il s'agit d'être le plus précis possible lors de la définition de la source et la destination : si l'accès ne concerne qu'une seule machine (ou un groupe), il faut préciser son adresse IP ou son nom (si vous ne pouvez pas encore la déterminer), et non la zone. Appliquer le principe inverse (être le plus large possible) lorsqu'il faut refuser (Drop) une connexion.
Lors de la définition d'une zone, spécifier l'adresse du sous-réseau IP avec son masque (par exemple, "/24" correspond à 255.255.255.0) ou l'interface réseau (par exemple : "interface WAN") si l'adresse du sous-réseau ne peut pas être déterminé avec précision.
Rappel: ICMP 0 = response, ICMP 8 = request
- LAN = 192.168.100.0/24, interface eth1
- WAN = n'importe quelle adresse IP
- DMZ = 192.168.200.0/24, interface eth0
Adresse IP source | Adresse IP destination | Type | Port src | Port dst | Action |
---|---|---|---|---|---|
LAN | WAN | TCP + UDP | * | 53 | Accept |
WAN | LAN | ICMP 0 | * | * | Accept |
LAN | WAN | ICMP 8 | * | * | Accept |
DMZ | LAN | ICMP 0 | * | * | Accept |
LAN | DMZ | ICMP 8 | * | * | Accept |
LAN | DMZ | ICMP 0 | * | * | Accept |
DMZ | LAN | ICMP 8 | * | * | Accept |
LAN | WAN | TCP | * | 80, 8080 | Accept |
LAN | WAN | TCP | * | 443 | Accept |
LAN, WAN | WebServer DMZ | TCP | * | 80 | Accept |
LAN | WebServer DMZ | TCP | * | 22 | Accept |
LAN | Firewall | TCP | * | 22 | Accept |
* | * | * | * | * | Drop |
Dans le tableau, pour les règles utilisant TCP/UDP, seul le sens d'initiation de la connexion est montré, le retour est implicite.
Les règles par défaut sont configurées avec ces commandes:
iptables -P FORWARD DROP
iptables -P INPUT DROP
iptables -P OUTPUT DROP
: Ce chapitre indique comment installer l'environnement. Il se base sur des outils gratuits, téléchargeables sur Internet.
Il est possible d’utiliser les mêmes instructions sur une version de Windows ou un système Linux ou Mac OS X.
Afin d'installer les différents logiciels présentés ici, il faut disposer d’un ordinateur (avec les droits administrateur).
Docker est un logiciel permettant de créer des conteneurs virtuels afin de simuler diverses configurations. Nous l'utiliserons pour exécuter les trois machines dont nous aurons besoin pour ce laboratoire. L’installation de Docker ne comporte pas de difficulté particulière. Une installation « par défaut » suffira. Il est possible d’utiliser une version que vous avez déjà installée ou une version téléchargée, mais la documentation pour ce laboratoire a été testée avec la version 3.2.2 de Docker Desktop pour Mac. Si vous rencontrez des problèmes, une mise à jour de Docker es peut-être la solution.
Vous pouvez trouver Docker pour Windows et Mac OS ici.
Pour Linux, referez-vous au gestionnaire de paquets de votre distribution.
Vous avez probablement déjà installé Git pour d’autres cours ou projets. Si ce n’est pas le cas, vous pouvez prendre la bonne version pour votre OS ici.
Ce laboratoire utilise docker-compose, un outil pour la gestion d'applications utilisant multiples conteneurs. Il va se charger de créer les réseaux lan
et dmz
, la machine Firewall, un serveur dans le réseau DMZ et une machine dans le réseau LAN et de tout interconnecter correctement.
Nous allons commencer par lancer docker-compose. Il suffit de taper la commande suivante dans le répertoire racine du labo (celui qui contient le fichier docker-compose.yml
:
docker-compose up --detach
Le téléchargement et génération d'images prend peu de temps.
Vous pouvez vérifier que les réseaux ont été créés avec la commande docker network ls
. Un réseau lan
et un réseau dmz
devraient se trouver dans la liste.
Les images utilisées pour les conteneurs sont basées sur l'image officielle Ubuntu. Le fichier Dockerfile
que vous avez téléchargé contient les informations nécessaires pour la génération de l'image de base. docker-compose
l'utilise comme un modèle pour générer les conteneurs. Vous pouvez vérifier que les trois conteneurs sont crées et qu'ils fonctionnent à l'aide de la commande suivante.
docker ps
Afin de simplifier vos manipulations, les conteneurs ont été configurées avec les noms suivants :
- Firewall
- Client_in_LAN
- Server_in_DMZ
__ Pour accéder au terminal de l’une des machines, il suffit de taper :
docker exec -it <nom_de_la_machine> /bin/bash
Par exemple, pour ouvrir un terminal sur votre firewall :
docker exec -it Firewall /bin/bash
Vous pouvez bien évidemment lancer des terminaux avec les trois machines en même temps !
La plupart de paramètres sont déjà configurés correctement sur les trois machines. Il est pourtant nécessaire de rajouter quelques commandes afin de configurer correctement le réseau pour le labo.
Vous pouvez commencer par vérifier que le ping n'est pas possible actuellement entre les machines. Depuis votre Client_in_LAN, essayez de faire un ping sur le Server_in_DMZ (cela ne devrait pas fonctionner !) :
ping 192.168.200.3
En effet, la communication entre les clients dans le LAN et les serveurs dans la DMZ doit passer à travers le Firewall. Dans certaines configuration, il est probable que le ping arrive à passer par le bridge par défaut. Ceci est une limitation de Docker. Si votre ping passe, vous pouvez accompagner votre capture du ping avec une capture d'une commande traceroute qui montre que le ping ne passe pas actuellement par le Firewall mais qu'il a emprunté un autre chemin.
Il faut donc définir le Firewall comme passerelle par défaut pour le client dans le LAN et le serveur dans la DMZ.
Dans un terminal de votre client, taper les commandes suivantes :
ip route del default
ip route add default via 192.168.100.2
__ Dans un terminal de votre serveur dans DMZ, taper les commandes suivantes :
ip route del default
ip route add default via 192.168.200.2
service nginx start
service ssh start
Les deux dernières commandes démarrent les services Web et SSH du serveur.
La communication devrait maintenant être possible entre les deux machines à travers le Firewall. Faites un nouveau test de ping, cette fois-ci depuis le serveur vers le client :
ping 192.168.100.3
Route client
Route serveur
Nouvelle tentative de ping
La communication est maintenant possible entre les deux machines. Pourtant, si vous essayez de communiquer depuis le client ou le serveur vers l'Internet, ça ne devrait pas encore fonctionner sans une manipulation supplémentaire au niveau du firewall ou sans un service de redirection ICMP. Vous pouvez le vérifier avec un ping depuis le client ou le serveur vers une adresse Internet.
Par exemple :
ping 8.8.8.8
Si votre ping passe mais que la réponse contient un Redirect Host, ceci indique que votre ping est passé grace à la redirection ICMP, mais que vous n'arrivez pas encore à contacter l'Internet à travers de Firewall. Ceci est donc aussi valable pour l'instant et accepté comme résultat.
On va fournir une route vers l'internet à travers le firewall aux deux réseaux connectés :
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
service ssh start
Cette commande iptables
définit une règle dans le tableau NAT qui permet la redirection de ports et donc, l'accès à l'Internet pour les deux autres machines.
L'autre commande démarre le service SSH du serveur.
Vérifiez que la connexion à l'Internet est maintenant possible depuis les deux autres machines. Pas besoin de capture d'écran mais assurez vous que les pings passent sans besoin de redirection de host avant de continuer.
Une règle permet d’autoriser ou d’interdire une connexion. iptables
met à disposition plusieurs options pour la création de ces règles. En particulier, on peut définir les politiques par défaut « Policy », des règles de filtrage pour le firewall (tableau filter) ou des fonctionnalités de translation d’adresses (tableau nat) :
- Policy permet d’appliquer des règles générales (vous devez configurer vos politiques en premier)
- Le tableau filter permet d’appliquer des règles de filtrage propres d’un firewall
- Le tableau nat permet de paramétrer la translation d’adresses
iptables
vous permet la configuration de pare-feux avec et sans état. Pour ce laboratoire, vous avez le choix d'utiliser le mode avec état, sans état ou une combinaison des deux.
Chaque règle doit être tapée sur une ligne séparée. Référez-vous à la théorie et appuyez-vous sur des informations trouvées sur Internet pour traduire votre tableau de règles de filtrage en commandes iptables
. Les règles prennent effet immédiatement après avoir appuyé sur <enter>. Vous pouvez donc les tester au fur et à mesure que vous les configurez.
Important : Les règles de filtrage définies avec iptables
ne sont pas persistantes (elles sont perdues après chaque redémarrage de la machine firewall). Pour sauvegarder votre configuration de firewall au fur et à mesure que vous avancez, vous pouvez utiliser les outils iptables-save
et iptables-restore
.
Sauvegarder la configuration du firewall dans le fichier iptables.conf
:
iptables-save > iptables.conf
Récuperer la config sauvegardée :
iptables-restore < iptables.conf
→ Note : pour plus de détails, la commande iptables –L
affiche toutes les règles en vigueur.
→ Note : avant chaque installation, la commande iptables -F
efface les règles en vigueur.
→ Note : avant chaque installation, la commande iptables –X
efface les chaînes.
→ Note : Puisque vous travaillez depuis un terminal natif de votre machin hôte, vous pouvez facilement copier/coller les règles dans un fichier local. Vous pouvez ensuite les utiliser pour reconfigurer votre firewall en cas de besoin.
Pour chaque manipulation, il est important de garder les règles déjà créées, les nouvelles sont ajoutées aux existantes.
Pour commencer sur une base fonctionnelle, nous allons configurer le pare-feu pour accepter le ping dans certains cas. Cela va permettre de tester la connectivité du réseau.
Le but est de configurer les règles pour que le pare-feu accepte
- les ping depuis le LAN sur les machines de la DMZ,
- les ping depuis le LAN sur le WAN,
- les ping depuis la DMZ vers le LAN.
Ceci correspond a la condition 2 du cahier des charges.
Commandes iptables :
# ping DMZ -> LAN
iptables -A FORWARD -s 192.168.200.0/24 -i eth0 -d 192.168.100.0/24 -o eth1 -p icmp --icmp-type 8 -j ACCEPT
iptables -A FORWARD -s 192.168.100.0/24 -i eth1 -d 192.168.200.0/24 -o eth0 -p icmp --icmp-type 0 -j ACCEPT
# PING LAN -> *
iptables -A FORWARD -s 192.168.100.0/24 -i eth1 -p icmp --icmp-type 8 -j ACCEPT
iptables -A FORWARD -d 192.168.100.0/24 -o eth1 -p icmp --icmp-type 0 -j ACCEPT
- Afin de tester la connexion entre le client (Client_in_LAN) et le WAN, tapez la commande suivante depuis le client :
ping 8.8.8.8
Faire une capture du ping.
Vérifiez aussi la route entre votre client et le service 8.8.8.8
. Elle devrait partir de votre client et traverser votre Firewall :
traceroute 8.8.8.8
Ping
Traceroute
Traceroute ne fonctionne pas, ce qui est normal car nous n'avons pas défini de règle pour le port qu'il utilise.
- Testez ensuite toutes les règles, depuis le Client_in_LAN puis depuis le serveur Web (Server_in_DMZ) et remplir le tableau suivant :
De Client_in_LAN à | OK/KO | Commentaires et explications |
---|---|---|
Interface DMZ du FW | KO | La chaîne INPUT du firewall n'autorise pas les pings |
Interface LAN du FW | KO | Pareil |
Client LAN | OK | Localhost |
Serveur WAN | OK |
De Server_in_DMZ à | OK/KO | Commentaires et explications |
---|---|---|
Interface DMZ du FW | KO | Pas configuré sur le firewall (en INPUT) |
Interface LAN du FW | KO | Pareil |
Serveur DMZ | OK | Localhost |
Serveur WAN | OK |
- Si un ping est effectué sur un serveur externe en utilisant en argument un nom DNS, le client ne pourra pas le résoudre. Le démontrer à l'aide d'une capture, par exemple avec la commande suivante :
ping www.google.com
- Faire une capture du ping.
- Créer et appliquer la règle adéquate pour que la condition 1 du cahier des charges soit respectée.
Commandes iptables :
iptables -A FORWARD -i eth1 -s 192.168.100.0/24 -p tcp --dport 53 -j ACCEPT
iptables -A FORWARD -i eth1 -s 192.168.100.0/24 -p udp --dport 53 -j ACCEPT
iptables -A FORWARD -o eth1 -d 192.168.100.0/24 -p tcp --sport 53 -j ACCEPT
iptables -A FORWARD -o eth1 -d 192.168.100.0/24 -p udp --sport 53 -j ACCEPT
- Tester en réitérant la commande ping sur le serveur de test (Google ou autre) :
- Remarques (sur le message du premier ping)?
Réponse
C'est normal, le serveur DNS n'est pas accessible. Le domaine www.google.ch ne peut alors pas être traduit en IP
Créer et appliquer les règles adéquates pour que les conditions 3 et 4 du cahier des charges soient respectées. Tester que les règles soient fonctionnelles en utilisant wget depuis le Client_in_LAN pour télécharger une ressource depuis un site Web de votre choix (sur le WAN). Par exemple :
wget http://www.heig-vd.ch
- Créer et appliquer les règles adéquates avec des commandes iptables.
Commandes iptables :
iptables -A FORWARD -i eth1 -s 192.168.100.0/24 -p tcp -m multiport --dports 80,8080,443 -j ACCEPT
iptables -A FORWARD -o eth1 -d 192.168.100.0/24 -p tcp -m multiport --sports 80,8080,443 -j ACCEPT
- Créer et appliquer les règles adéquates avec des commandes iptables pour que la condition 5 du cahier des charges soit respectée.
Commandes iptables :
iptables -A FORWARD -i eth0 -s 192.168.200.3/24 -p tcp --dport 80 -j ACCEPT
iptables -A FORWARD -o eth0 -d 192.168.200.3/24 -p tcp --sport 80 -j ACCEPT
- Tester l’accès à ce serveur depuis le LAN utilisant utilisant wget (ne pas oublier les captures d'écran).
- Créer et appliquer la règle adéquate pour que les conditions 6 et 7 du cahier des charges soient respectées.
Commandes iptables :
# SSH Firewall
iptables -A INPUT -s 192.168.100.0/24 -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -d 192.168.100.0/24 -p tcp --sport 22 -j ACCEPT
# SSH Serveur
iptables -A FORWARD -s 192.168.100.0/24 -i eth1 -d 192.168.200.3/24 -o eth0 -p tcp --dport 22 -j ACCEPT
iptables -A FORWARD -s 192.168.200.3/24 -i eth0 -d 192.168.100.0/24 -o eth1 -p tcp --sport 22 -j ACCEPT
Depuis le client dans le LAN, tester l’accès avec la commande suivante :
- Expliquer l'utilité de ssh sur un serveur.
Réponse
SSH permet de se connecter sur une machine de manière chiffrée, ce qui permet la maintenance facile de la machine distante.
- En général, à quoi faut-il particulièrement faire attention lors de l'écriture des règles du pare-feu pour ce type de connexion ?
Réponse
Définir à l'avance qui peut se connecter au SSH, car il ne faut pas laisser l'accès à n'importe quel réseau/IP.
A présent, vous devriez avoir le matériel nécessaire afin de reproduire la table de filtrage que vous avez conçue au début de ce laboratoire.
- Insérer la capture d’écran avec toutes vos règles iptables