Qui peut passer, et dans quel ordre ?
Un pare-feu est un filtre qui laisse passer ou jette chaque paquet, selon une liste de règles. Lire cette liste dans le bon ordre explique pourquoi un paquet passe ou non.
Une bibliothèque universitaire veut que ses visiteurs naviguent sur le web. Elle veut aussi que personne de l'extérieur n'entre sur le serveur du personnel. Tout se joue dans l'ordre des règles.
À la fin de cette leçon
Remarque
Je peux écrire et lire une liste de règles de pare-feu en suivant leur ordre.
Mots clés
| Mot | Ce que ça veut dire |
|---|---|
| Pare-feu | un filtre qui autorise ou refuse chaque paquet |
| Règle | une condition et une action : autoriser ou refuser |
| Politique par défaut | l'action quand aucune règle ne correspond |
| Pare-feu à état | un pare-feu qui retient les connexions déjà ouvertes |
| Chaîne | une liste de règles que lit un pare-feu dans un ordre fixe |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Un pare-feu lit de haut en bas
Pour chaque paquet, le pare-feu parcourt la liste depuis la première règle. Dès qu'une règle correspond, il applique son action et s'arrête. Les règles suivantes ne sont jamais lues pour ce paquet.
Si aucune règle ne correspond, c'est la politique par défaut qui décide.
Exemple : quatre paquets et une liste
| Paquet | Règle 1 : autoriser tcp 443 | Règle 2 : refuser tcp 23 | Décision |
|---|---|---|---|
| tcp 443 | Correspond | Pas lue | Autoriser |
| tcp 23 | Ne correspond pas | Correspond | Refuser |
| tcp 80 | Ne correspond pas | Ne correspond pas | Politique par défaut |
| udp 53 | Ne correspond pas | Ne correspond pas | Politique par défaut |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Faire lire la liste par un programme
# Un paquet : le protocole et le port.
paquet = "tcp 80"
regles = [
"refuser tcp 23",
"autoriser tcp 80",
"autoriser tcp 443",
]
decision = "refuser" # politique par défaut : on refuse
for regle in regles:
action, protocole, port = regle.split(" ")
if protocole + " " + port == paquet:
decision = action
break # la première règle qui correspond gagne
print(decision)
# À vous : changez le paquet en "tcp 23", puis en "tcp 25", et relancez.
Tout refuser, puis autoriser ce qui sert
Il y a deux manières de bâtir une liste. La première refuse ce qu'on connaît de dangereux et laisse le reste. La seconde refuse tout par défaut et n'autorise que ce dont on a besoin.
La seconde est la plus sûre. Un service oublié ou nouveau reste fermé jusqu'à ce que quelqu'un le décide.
Exemple : deux politiques comparées
| Question | Refuser les dangers connus | Tout refuser par défaut |
|---|---|---|
| Un nouveau service apparaît | Il est ouvert tant qu'on ne le bloque pas | Il est fermé tant qu'on ne l'autorise pas |
| Le risque oublié | Un danger absent de la liste passe | Un besoin oublié est bloqué et se voit vite |
| Ce qu'on lit pour comprendre | Une longue liste de refus | Une courte liste d'autorisations |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Lire le jeu de règles de la passerelle
sudo ip netns exec gw nft list rulesetAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Comment lire ce que la passerelle affiche
Au départ du labo, vous lisez une table inet filter avec une chaîne forward. Elle contient policy drop : tout paquet qui traverse la passerelle et qu'aucune règle n'autorise est jeté.
Deux règles suivent. La première accepte ct state established,related, c'est-à-dire les réponses aux connexions déjà ouvertes. La seconde accepte ce qui entre par l'interface to-lan. Si vous avez déjà sauvegardé vos règles, elles s'affichent en plus.
Un pare-feu à état laisse revenir les réponses
Un pare-feu à état retient chaque connexion qu'il a laissée partir. Quand la réponse revient, il la reconnaît et la laisse passer sans règle de plus.
Sans cela, il faudrait autoriser tous les ports de retour, un par un. Avec cela, on n'écrit que les connexions qu'on accepte de voir commencer.
Exemple : deux ordres, deux décisions
| Ordre des règles | Paquet tcp 22 | Pourquoi |
|---|---|---|
| 1 refuser tout tout, 2 autoriser tcp 22 | Refusé | La règle 1 correspond à tout et arrête la lecture |
| 1 autoriser tcp 22, 2 refuser tout tout | Autorisé | La règle 1 correspond avant la règle qui refuse tout |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Une erreur fréquente
Attention
On croit souvent que la règle la plus précise gagne toujours. Dans une liste simple, c'est la première qui correspond qui gagne. Mettez les règles précises avant les règles larges, sinon la règle large cache les autres.