TP N°3: Implémentation de Pare-Feu IPTABLES: Compétence 14: Sécuriser Une Infrastructure Digitale
TP N°3: Implémentation de Pare-Feu IPTABLES: Compétence 14: Sécuriser Une Infrastructure Digitale
TP N°3: Implémentation de Pare-Feu IPTABLES: Compétence 14: Sécuriser Une Infrastructure Digitale
- 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
- 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.
- 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.