Vous êtes sur la page 1sur 9

Office de la Formation Professionnelle et de la Promotion du Travail

Direction Régionale du Marrakech - Safi

Compétence 14 : Sécuriser une infrastructure digitale


TP N°3 : Implémentation de Pare-feu IPTABLES

- Les pare-feu sont souvent la première ligne de défense d'une entreprise ou d'un réseau
domestique. Dans cet atelier, nous comprendrons les principes fondamentaux des pare-feu,
rédigerons des règles de pare-feu qui configurent son comportement, puis testerons si le pare-
feu fonctionne comme prévu.
- Les pare-feu minimisent le nombre de façons dont les réseaux internes et les ordinateurs qui
s'y trouvent peuvent être exploités. Ils encouragent également le moins de fonctionnalités en
désactivant les ports qui ne sont pas nécessaires. Les pare-feu peuvent également rejeter le
trafic réseau qui n'est pas conforme aux modèles attendus (comme les requêtes malveillantes à
un serveur d'applications).
- Tous les systèmes d'exploitation courants sont désormais équipés d'un pare-feu. Pour les
installations de serveur, nous nous concentrerons sur le module de filtrage de paquets
NETFILTER intégré au noyau Linux lui-même. Ce module est configuré à l'aide de la IP
tables, commande émise dans un terminal. L'utilitaire ip tables offre beaucoup de flexibilité et
de contrôle sur la configuration du pare-feu.

iptables Manipulations
Netfilter Internal
command Structure

Linux Kernel

- Les fonctions de NETFLITER sont présentées sous forme de tables en terme d’architecture
- Dans chaque table on trouve un ensemble de chaines et sur chaque chaine on peut assigner des
règles de filtrage associées

- Pour commencer l’activité


- Démarrez la machine virtuelle Ubuntu.
- Connectez-vous et ouvrez un terminal. Notons l'adresse IP en exécutant la commande
IFCONFIG dans le terminal. Il devrait commencer par 192.168.
- Installons maintenant un serveur Web sur cette machine. Nous allons installer le serveur Web
Apache Http avec les paramètres par défaut:
sudo apt-get install apache2
- Vous Allez-y et démarrez le serveur Web avec la commande suivante : service apache2 start
- Maintenant, effaçons tous nos paramètres de pare-feu afin qu'ils soient réinitialisés aux
paramètres d'usine. Nous comprendrons parfaitement ces commandes un peu plus tard dans le
laboratoire. Mais pour l'instant, lancez ces commandes dans un terminal. Si vous y êtes invité,
authentifié avec le mot de passe du compte de vol. Ces commandes, si elles réussissent, ne
produiront aucune sortie.
sudo iptables -F INPUT
sudo iptables -F INPUT sudo iptables -P INPUT ACCEPT
- Pour voir les effets de notre configuration de pare-feu, nous avons besoin d'une autre machine
qui peut nous aider à faire des observations.
- Alors maintenant, démarrez la Kali VM. Connectez-vous et ouvrez un terminal.
- Maintenant, envoyez un ping à la machine virtuelle Ubuntu en utilisant son adresse IP. ping est
un utilitaire réseau pour tester l'accessibilité. ping Ubuntu_machine_IP_address
- Vous devriez voir des messages de réussite. Appuyez sur CRTL + C pour fermer le processus
de ping.
- Nous avons également un serveur Web apache par défaut exécuté sur la machine virtuelle
Ubuntu sur le port 80. Pour tester cela, dans votre machine virtuelle Kali, ouvrez un navigateur
et entrez l'adresse IP de la machine virtuelle Ubuntu dans la barre d'adresse. Vous devriez voir
la page Web Apache par défaut.
- Pour voir ce qui est ouvert d'autre, nous pouvons effectuer une analyse de port à l'aide de
Nmap , qui est un analyseur de réseau. Pour l'utiliser, utilisez simplement cette commande
dans le terminal Kali VM. Gardez à l'esprit que l'analyse des ports des ordinateurs non
autorisés n'est ni légale ni éthique. nmap Ubuntu_machine_IP_address
- Bien que vous puissiez faire beaucoup plus avec nmap, y compris l'évasion du pare-feu , la
commande ci-dessus signalera probablement que le port 22 (SSH) et le port 80 (HTTP) sont
ouverts sur la machine virtuelle Ubuntu. Puisque nous savons maintenant que SSH est en cours
d'exécution, nous pouvons ouvrir un shell distant à l'aide de la commande suivante : ssh -l steal
Ubuntu_machine_IP_address
- Travailler avec iptables
- Passer à la machine virtuelle Ubuntu
- Comme mentionné précédemment, Linux a un pare-feu intégré directement dans le noyau et il
est configuré à l'aide de la iptablescommande. Puisqu'il s'agit d'un utilitaire pour les utilisateurs
privilégiés, vous devrez d'abord élever votre niveau de privilège en utilisant sudole préfixe de
la iptablescommande. Faites cela à chaque fois qu'une iptablescommande est émise. Voir le
bloc de code ci-dessous.
- Le pare-feu Linux intégré peut être configuré dans plusieurs modes, tels que le filtrage de
paquets, qui est le mode par défaut, la traduction d'adresses réseau ou mangle, où vous pouvez
modifier les paquets lorsqu'ils traversent le pare-feu. Nous nous concentrerons sur la fonction
de filtrage de paquets IPv4 pour ce laboratoire.
- Maintenant, pour afficher vos règles de pare-feu actuelles dans la machine virtuelle Ubuntu,
lancez cette commande dans un terminal. Entrez le mot de passe du compte de vol si vous y
êtes invité. sudo iptables -nL

- Vous devriez voir quelque chose comme ceci :

- A quoi servent ces -nLparamètres de ligne de commande ?


- -n Cette option indique à iptables de ne pas résoudre les noms de domaine pour les adresses IP
dans les règles de correspondance. Cela se traduit par un affichage plus rapide des règles.
- -L Répertorie toutes les règles d'une chaîne spécifiée. Si aucune chaîne n'est spécifiée, toutes
les chaînes sont répertoriées.
- Une note avant d'aller de l'avant : En cas de doute, consultez les pages de manuel d'iptables en
utilisant la commande suivante : man iptables.
- Sur la base d'une philosophie de liste blanche, commençons par refuser tout le trafic entrant
par défaut. Pour ce faire, nous définissons la politique par défaut de la chaîne INPUT sur
DROP : sudo iptables -P INPUT DROP
- Cette commande utilise le -Pcommutateur pour définir la stratégie par défaut de la chaîne
INPUT sur DROP. Cela signifie déposer tous les paquets entrants sur votre ordinateur. Voyons
maintenant à quoi ressemble la chaîne INPUT. sudo iptables -nL INPUT

- Vous devriez voir quelque chose comme ceci :

- Avis (policy DROP). Vous ne devriez PAS pouvoir envoyer de ping ou accéder au serveur
Web à partir de la machine virtuelle Kali. Allez-y et confirmez-le en basculant vers la VM
Kali. Vous pouvez également exécuter une analyse de port.
- Un pare-feu qui n'autorise aucun trafic, bien que sécurisé, n'est pas très convivial ni utile !
Ajoutons donc quelques règles à la chaîne INPUT pour autoriser les paquets entrants sur le
port Web par défaut, c'est-à-dire le port 80. sudo iptables -I INPUT 1 -p tcp --dport 80 -j
ACCEPT
- Cette iptablescommande suit une structure générale : iptables <option> <chain> <matching
criteria> <target>. Examinons en détail chaque élément de cette structure.
- <option> <chain>: Immédiatement après la commande iptables, le composant option nous
permet de spécifier la position dans laquelle la règle sera insérée dans une chaîne . Par
exemple –A INPUT, ajoute la règle dans la chaîne INPUT. –I OUTPUT 3insère la règle à une
position spécifiée dans la chaîne OUTPUT. Les numéros de règle commencent à la position 1.
Donc cette option -I INPUT 1dit : Insérez cette règle à la position 1 dans la chaîne INPUT.
- Quelques options plus utiles : –Dpour supprimer une règle à une position spécifiée dans la
chaîne. –Fsert à vider la chaîne, ce qui supprime toutes les règles d'une chaîne.

- <matching criteria>: Vient ensuite le composant des critères de correspondance . Ce


composant spécifie les conditions qui seront utilisées pour faire correspondre des types
spécifiques de paquets réseau entrants.
- Donc, ce critère de correspondance -p tcp --dport 80indique : Faites correspondre tous les
paquets avec le protocole TCP avec un port de destination 80. Encore une fois, le port 80 sur le
serveur est votre port de serveur Web par défaut. Nous n'avons spécifié aucune adresse IP
source ou de destination, il correspondra donc à toutes les adresses IP. Pour les paquets
entrants, la "destination" est le serveur sur lequel vous créez les règles iptables, et la "source"
est l'ordinateur client. Pour les paquets sortants, la "source" est le serveur et la "destination" est
l'ordinateur client.
- <target>: Enfin, le composant cible spécifie ce qu'il faut faire si les critères de correspondance
sont remplis. Ce composant est spécifié avec un –j commutateur. Il signifie un "saut" vers la
chaîne cible qui suit après lui. Ainsi, si un paquet entrant satisfait aux critères de
correspondance, la règle suivante est spécifiée par la valeur de la chaîne cible, qui peut être le
nom d'une chaîne définie par l'utilisateur ou l'une des valeurs spéciales qui terminent le
traitement de la règle. Les valeurs de terminaison spéciales sont ACCEPT, DROP ou
RETURN.
- ACCEPT autorise l'entrée du paquet. Ainsi, cette cible -j ACCEPTindique : Passez à
ACCEPTER ce paquet et terminez le traitement de la règle.
- DROP et REJECT, tous deux refusent le paquet et arrêtent le traitement de la règle. Mais
DROP est plus sûr que REJECT. Lorsque REJECT est utilisé, un paquet d'erreur est envoyé en
réponse au paquet correspondant. Il est préférable d'éviter de donner des informations
supplémentaires lorsque l'accès est refusé pour une raison quelconque.
- Une chaîne cible sans terminaison est la chaîne LOG. La chaîne LOG aide à documenter toutes
les anomalies qui ont été détectées dans le journal du noyau. Les préfixes de journal sont
spécifiés à l'aide de la syntaxe suivante : --log-prefix prefix. Le préfixe peut comporter environ
29 caractères.
- Examinons maintenant la chaîne INPUT. sudo iptables -nL INPUT

- Cette sortie ressemble beaucoup à l'exemple de table dont nous avons parlé précédemment. Ici,
les adresses IP source et de destination de 0.0.0.0\0équivaut à "any". Ainsi, la règle équivaut à
dire, faites correspondre tous les paquets TCP de n'importe quelle source à n'importe quelle
destination avec un port de destination 80. Si vous l'avez bien fait, votre serveur Web devrait
être à nouveau accessible depuis la VM Kali. Allez-y et confirmez.
- Qu'en est-il du HTTPS ? Vous auriez également besoin du port 443 pour que HTTPS soit
ouvert. Pour ce faire, nous devons ajouter une autre règle. Cette fois, ajoutons-le à la chaîne
INPUT en utilisant l' –A option. sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
- Notez qu'avec -Avous n'avez pas à spécifier le numéro de règle. La règle est simplement
ajoutée au bas de la chaîne INPUT. Regardons maintenant la chaîne INPUT.
- sudo iptables -nL INPUT

- Si votre site Web utilise par défaut https, vous pouvez envisager de faire de la règle du port
443 la première règle. Cela évitera une évaluation inutile de la règle du port 80 pour la plupart
des paquets réseau. Ces règles suffisent-elles ? Oui. Mais ces règles peuvent être très
restrictives et entraver le débogage. Par exemple, ajoutons un référentiel de logiciels en ligne
pour Ubuntu, puis essayons d'exécuter une commande pour mettre à jour les référentiels de
logiciels.
sudo add-apt-repository http://us.archive.ubuntu.com/ubuntu/
sudo apt-get update
- La dernière commande expirera très probablement en raison des restrictions du pare-feu. Les
messages d'erreur ne seront probablement pas utiles non plus. Ajoutons donc quelques règles
de pare-feu supplémentaires pour faciliter l'administration et les mises à jour du serveur.
Appuyez Crtl+Csur pour quitter le processus de mise à jour.
- Vous voulez d'abord que le serveur puisse communiquer avec lui-même. Ceci est souvent
appelé envoyer du trafic vers une interface de "bouclage". De plus, une carte réseau spéciale
est dédiée à l'interface de bouclage. Vous pouvez vérifier son nom en utilisant la
ifconfigcommande. Cette commande affiche toutes les cartes réseau et les adresses réseau
associées. Ci-dessous, nous voyons que le nom de l'adaptateur de bouclage est lo.

- Pour créer une règle de pare-feu permissive sur la chaîne INPUT, nous utilisons les -i
locritères de correspondance pour l'interface de bouclage d'entrée, avec la cible ACCEPT.
- sudo iptables -A INPUT -i lo -j ACCEPT
- Passez maintenant à la machine virtuelle Kali et voyez si vous pouvez envoyer un ping à la
machine Ubuntu. Cela devrait échouer. Mais ce serait bien de pouvoir "pinger" la machine
virtuelle Ubuntu à partir de n'importe quelle autre machine pour déterminer l'accessibilité. Les
"pings" sont basés sur le protocole ICMP et le type spécifique de message est echo-request.
Par conséquent, le critère de correspondance devient -p icmp --icmp-type echo-request.
- sudo iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
- Vous pouvez maintenant essayer d'envoyer à nouveau un ping à la machine virtuelle Ubuntu à
partir de la machine virtuelle Kali pour voir ce qui se passe.
- Enfin, nous voulons autoriser tous les paquets "entrants" qui répondent à une requête interne
du serveur. De tels paquets de réseau de réponse sont dits être dans un état ESTABLISHEDou
RELATED. Une telle règle de pare-feu nécessite le suivi de l'état de diverses connexions
réseau. Par conséquent, nous invoquons le conntrackmodule à l'aide du -mcommutateur.
L'ensemble des critères de correspondance est spécifié sous la forme -m conntrack --ctstate
ESTABLISHED,RELATED. Le --ctstatecommutateur est une abréviation pour "état de
connexion".
- sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
- Ces règles devraient rendre votre serveur beaucoup plus pratique à utiliser. Essayez d'exécuter
la commande de mise à jour maintenant.
- sudo apt-get update
- Cela devrait réussir maintenant.
- Enregistrement des logs:
- Une cible non terminale est LOG, c'est-à-dire que la traversée de règle continue à la règle
suivante. La chaîne LOG aide à documenter toutes les anomalies qui ont été détectées dans le
journal du noyau, mais ne filtre pas le trafic. Si aucune autre règle supplémentaire ne
correspond au paquet, la stratégie par défaut est appliquée. Cela peut également remplir le
journal du noyau, donc utilisez-le avec prudence. De plus, pour supprimer les paquets
enregistrés, vous devez utiliser deux règles distinctes avec les mêmes critères de
correspondance, en utilisant d'abord la cible LOG, puis DROP.
- Les préfixes de journal sont spécifiés à l'aide de la syntaxe suivante : --log-prefix prefix. Cette
option nous permet de préfixer les messages du journal avec le préfixe spécifié ; jusqu'à 29
lettres de long, et utile pour distinguer les messages dans les journaux.
- Disons que nous voulions savoir si quelqu'un tentait une connexion telnet via le port 23 sur
notre machine. Telnet est un protocole très peu sécurisé et souvent laissé ouvert comme porte
dérobée de maintenance dans les appareils dont la sécurité est médiocre. Ainsi, pour
enregistrer toutes les tentatives telnet, nous pouvons utiliser la commande suivante : sudo
iptables –A INPUT –p tcp --dport 23 -j LOG --log-prefix “Attempted Telnet connection: ”
- La commande ci-dessus devrait être facile à comprendre maintenant. Mais où se trouve le
message de journal généré lorsque quelqu'un tente de faire une tentative de connexion telnet ?
Tout d'abord, déclenchons cette règle.
- Basculez vers la machine virtuelle Kali. Dans un terminal de la machine virtuelle Kali,
exécutez cette commande pour établir une connexion telnet avec la machine virtuelle Ubuntu.
telnet Ubuntu_machine_IP_address
- La connexion échouera car aucun service telnet n'est en cours d'exécution sur la machine
virtuelle Ubuntu. Mais il aurait dû déclencher la règle LOG du pare-feu dans la machine
virtuelle Ubuntu pour créer une entrée de journal réussie de cette tentative. Voyons si c'est le
cas.
- Basculez vers la machine virtuelle Ubuntu.
- Les messages du journal du noyau dans la machine virtuelle Ubuntu peuvent être affichés à
l'aide de la commande suivante dans un terminal. Nous filtrons les messages avec le mot-clé
"attempted" que nous avons mis dans le log-prefix avant.
- dmesg | grep –i attempted
- Vous verrez que de nombreux détails sont maintenant disponibles sur la tentative de
connexion. Ces journaux permettent de détecter les connexions rouges ou les tentatives
d'analyse. Il existe de nombreuses autres règles de pare-feu avancées qui peuvent être créées.
Mais cet ensemble de règles devrait être suffisant pour démontrer le fonctionnement interne
d'un pare-feu. Nous avons également réussi à réduire considérablement les ports exposés de la
machine virtuelle Ubuntu à ceux qui sont absolument nécessaires à son fonctionnement. Rien
de plus. Tout trafic réseau IPv4 qui ne correspond pas à nos règles sera traité par la politique
par défaut. Dans notre cas, la politique par défaut est DROP.
- Discussion : Maintenant, prenez du recul et réfléchissez à cette question : Ai-je pris soin de
toutes les ouvertures de réseau dans le serveur ?
- Vérifions quelque chose. ssest un excellent utilitaire réseau Linux. Entre autres choses, il
affiche un résumé des statistiques du réseau.
- ss –s
Remarquez quelque chose dans la sortie ?
- Il s'avère que nous contrôlions l'interface réseau IPv4, mais que nous avons complètement
oublié IPv6 . Cela se produit également beaucoup dans les systèmes réels. En particulier, alors
que le port 22 pour l'accès ssh peut être bloqué en IPv4, il est souvent laissé accessible à l'aide
d'une adresse IPv6. Vérifiez si c'est le cas avec votre serveur.
- Pour illustration, définissons la stratégie de chaîne INPUT par défaut sur drop.
sudo iptables -P INPUT DROP
# Flush all rules in the INPUT chain
sudo iptables -F INPUT
- Passer à la machine virtuelle Kali
- Exécuter une analyse nmap : nmap Ubuntu_machine_IP_address_here
- Aucun port ouvert ne doit être signalé.
- Revenez à la machine virtuelle Ubuntu et fait: ifconfig
- Enregistrez l'adresse IPv6. Cela ressemblera à quelque chose de similaire à ceci :
fe80::250:56ff:fea0:14a. Ignorez la barre oblique et les chiffres qui la suivent.$
- Passer à la machine virtuelle Kali, Exécutez une analyse nmap pour les interfaces IPv6 à l'aide
de l' -6option.
- nmap -6 IPV6_Ubuntu_machine_address
- les deux ports, 22 et 80, seront désormais ouverts !

- Revenir à la machine virtuelle Ubuntu, Exécutez la commande suivante pour vérifier l'état de
l'interface IPv6. Remarquez le 6dans la ip6tablescommande.
- sudo ip6tables –nL
- L'interface réseau IPv6 est GRANDE OUVERTE !!!
- Résolvons cela en définissant la politique par défaut
sur la chaîne INPUT IPv6 sur DROP.
sudo ip6tables -P INPUT DROP
Vérifiez si les paramètres ont été correctement appliqués.
sudo ip6tables –nL
Vous pouvez basculer vers la machine virtuelle Kali et exécuter à nouveau une analyse nmap IPv6
pour confirmer qu'aucun port ouvert n'est annoncé sur l'interface IPv6.

- Remettez les paramètres à ce qu'ils étaient


- Effacons tous nos paramètres de pare-feu afin qu'ils n'interfèrent pas avec les futurs
laboratoires.
- # Flush all rules in the INPUT chain
- sudo iptables -F INPUT
- # Set default policy to accept
- sudo iptables -P INPUT ACCEPT
- # Set the default policy for IPv6 INPUT chain
- sudo ip6tables -P INPUT ACCEPT
- Rendre les paramètres du pare-feu persistants
- Sauf si vous validez vos règles iptables à un emplacement spécifique, elles seront réinitialisées
au redémarrage de la machine. Pour enregistrer les règles et les rendre persistantes lors des
redémarrages de la machine, les commandes suivantes fonctionneront sur le système
d'exploitation Ubuntu.
sudo apt-get install iptables-persistent
sudo iptables-save > rules.v4
sudo cp rules.v4 /etc/iptables/rules.v4
sudo ip6tables-save > rules.v6
sudo cp rules.v6 /etc/iptables/rules.v6
- Observez le résultat de la commande suivante :sudo iptables -v -L

Vous aimerez peut-être aussi