lid's Wiki

Firewall M1

Définition, principe de fonctionnement

Définition

Un pare-feu ou firewall en anglais est un équipement réseau (matériel ou logiciel) dont le but est de faire respecter les politiques d’accès et de sortie du réseau en utilisant un ensemble de règles définissant la politique de sécurité du réseau.

Un pare-feu fonctionne en général sur les couches 3 et 4 du modèle OSI (réseau et transport) et 2 et 3 du modèle TCP/IP (Internet protocol et transport).

Attention, un pare-feu classique ne fonctionnera pas sur les couches supérieures (et notamment applicative) de ces modèles et donc ne filtrera pas, par exemple, d’URLs: c’est le “job” de votre reverse-proxy et/ou de votre WAF (Web Application Firewall)

Principe de fonctionnement

Un pare-feu va filtrer le trafic en utilisant plusieurs critères:

En règle générale, on voudra configurer notre pare-feu afin qu’il utilise un fonctionnement de type “ce qui n’est pas explicitement autorisé est implicitement interdit” et non pas en mode “ce qui n’est pas explicitement interdit est implicitement autorisé”.

Suivant sa complexité, un pare-feu peut aussi modifier à la volée le trafic réseau, par exemple en effectuant du NAT (SNAT ou DNAT).

Lorsqu’un paquet arrive sur l’une des interfaces réseau du pare-feu, il va devoir “passer” un ensemble de règles définis dans la table de filtrage (en entrée, en sortie ou en transmission), ligne par ligne, en commençant par la première. Lorsqu’une règle matche, le trafic est autorisé, ou au contraire refusé. Il est donc très important de bien définir l’ordre de ces règles de filtrage!

Types de pare-feux

On distingue deux grands type de pare-feux (hors WAF):

Si le filtrage en entrée du réseau d’un pare-feu peut sembler évident, un pare-feu est aussi capable de filtrer le trafic en sortie du réseau, voire en interne du réseau (entre VLANs par exemple).

Le but peut être, par exemple, de filtrer en sortie des protocoles de communication qui, mal utilisés, peuvent porter préjudice à l’entreprise, par exemple les protocoles de partage de fichiers en peer-to-peer tels que bittorrent.

Bonnes pratiques

Positionnement du pare-feu

Dans un petit SI, en général le pare-feu est “intégré” au routeur. Cependant, si le trafic est plus important ou si on désire des fonctionnalités plus avancées, il peut être pertinent d’utiliser du matériel dédié, qu’on placera alors derrière le routeur.

En règle générale, on voudra donc placer nos pare-feux près des points d’entrée et de sortie de nos réseaux.

Matrice de flux

Avant de configurer notre pare-feu, il faut d’abord identifier les flux entrants et sortants que nous autoriserons - les autres étant bien sûr filtrés par défaut.

Pour cela, on doit identifier, pour chaque flux entrant et sortant:

Exemple:

Source Destination Protocole Port Règles Description Infos
WAN 192.168.1.9 TCP, HTTPS 443 allow only FR, TLSv1.3 flux https clients fr vers WAF WAF
192.168.1.10 192.168.10.12 TCP, Postgre 5432 allow only 192.168.1.10 && 11, TLS accès DB site web
192.168.1.11 192.168.10.12 TCP, Postgre 5432 allow only 192.168.1.10 && 11, TLS accès DB site web
192.168.2.0/24, VLAN 200 192.168.10.53, VLAN 1000 UDP, DNS 53 allow only LAN, rate-limit 5 qps/IP VIP serveurs DNS
VPN LAN TCP, SSH 22 allow, only for authentified admin users accès SSH admin

La matrice de flux va donc nous permettre d’identifier correctement les flux nécessaires au bon fonctionnement de notre système d’information ainsi que les mesures de sécurité en place ou à mettre en place, le but étant toujours de respecter la règle du moindre privilège: par exemple, les postes de travail du vlan compta doivent accéder à l’ERP de l’entreprise dans le VLAN IT, mais ne doivent pas avoir accès par exemple à l’IPAM dans ce même VLAN.

De la même façon, il est important de réfléchir à la défense en profondeur de notre système d’information: chaque équipement doit avoir son pare-feu configuré correctement, jusqu’au poste de travail des utilisateur⋅ices du SI.

Planifier l’organisation de nos tables de filtrage

Une fois notre matrice de flux déterminée, nous allons pouvoir mettre en place les différentes règles. Pour ce faire, il est important de bien déterminer l’ordre de nos différentes règles d’accès.

Par exemple, regardons les règles suivantes en entrée de notre réseau:

Source Destination Protocole Port Règle
* * TCP 80,443 ACCEPT
154.123.214.23 * * * DROP

À votre avis, à quoi a accès 154.123.214.23?

En règle générale, lorsqu’on établit des règles d’interdiction d’accès (par exemple, pour un pays non-ami), il est important de les placer avant toutes les autres règles et notamment celles qui acceptent le trafic!

Dès lors, il est nécessaire de bien réfléchir en amont, avant d’implémenter les règles de notre pare-feu, à leur organisation et leur répartition sous forme de table.

Réviser et documenter régulièrement les règles en place

Les règles d’un pare-feu sont amenées à être modifiées à intervalles plus ou moins réguliers. En effet, on peut vouloir temporairement bloquer l’accès à une ressource en fonction de certains critères (par exemple, à un subnet appartenant à un cloud public). Cet ajout doit être documenté, car il est possible que dans le futur, on veuille lever cette restriction car un service que l’on utilise (ex: Let’s Encrypt) va utiliser ce subnet, hors s’il est filtré, le service risque de ne pas fonctionner correctement.

À l’inverse, on peut se rendre compte que certaines règles en place ne reflètent plus la production, voire, ne sont plus utilisées du tout, et il est donc important de “faire le ménage” régulièrement.

Surveiller, agréger, alerter

Comme tout équipement dans notre infrastructure, notre, ou plutôt nos pare-feux (haute disponibilité oblige) doivent être monitorés correctement.

Supervision

Bien évidemment, on voudra récupérer les métriques “habituelles”: CPU, RAM, entrées/sorties réseau, QoS, etc.

Il peut être intéressant aussi de vérifier l’efficacité de nos règles de filtrage:

11G  650G DROP  0 --  * *  0.0.0.0/0    0.0.0.0/0   match-set singapore src

Comme on peut le voir ci-dessus, le filtrage en entrée des utilisateurs (enfin, des bots...) en provenance de Singapour a bloqué 11 milliards de paquets depuis le dernier reboot de cette machine, totalisant 650Go de trafic (il s’agit de simples requêtes HTTP). On voit ici (surtout que des machines similaires, il y en a 4) que ce blocage - ainsi que plusieurs autres - est efficace dans notre cas (plateforme web à destination de l’Europe), bloquant à l’arrivée le trafic à 99.999% illégitime en provenance de ce pays.

Ce genre de métrique peut permettre de vérifier le bon fonctionnement de nos règles, mais aussi nous indiquer de potentiels comportements anormaux (par exemple un fort trafic à destination d’un service à usage interne de l’entreprise).

Agrégation de logs

De la même manière, l’agrégation des journaux de connexion de nos pare-feux peut là aussi permettre de nous alerter d’un comportement anormal voire d’une tentative d’intrusion. Plusieurs solutions existent afin d’extraire et visualiser au mieux ces informations.

Par exemple ci-dessous, nous agrégeons les journaux de connexion en entrée de notre réseau et nous trions par AS (Autonomous System):

On voit tout de suite qu’Amazon AWS fait quasiment autant de trafic qu’Orange. Il est donc fort probable que cet AS soit utilisé par des bots de scraping IA et que ce trafic est au mieux gênant (il utilise des ressources dont les utilisateurs légitimes sont dès lors privés) voire potentiellement nuisible.

Il existe de nombreuses solutions d’agrégation de logs, parmi lesquelles:

NIDS : Network Intrusion Detection System

Il peut aussi être pertinent de coupler nos pare-feux à une solution de détection d’intrusion réseau comme Suricata, Snort, etc. Le but étant là encore d’être alerté le plus rapidement possible de tout comportement anormal afin de pouvoir y remédier en un minimum de temps.

Alertes

Bien évidemment, si nos différents systèmes de supervision ne nous alertent pas lorsqu’un incident survient… ils ne vont pas nous servir à grand chose! Il est donc primordial de mettre en palce un système d’alerte (SMS, “chat” type Slack, etc) afin d’être avertis dès qu’une anomalie est détectée par nos systèmes. Notre réactivité peut faire la différence entre une simple correction et une compromission du système d’information!

Backup!

Comme pour tout élément de notre système d’information, il est essentiel d’avoir une politique de sauvegarde des éléments de configuration et des règles de nos pare-feux.

Suivant l’outil utilisé, cette procédure peut varier. Concernant iptables et ipset par exemple, quelques commandes exécutées quotidiennement via cron peuvent “faire le job”:

iptables-save > iptables.$(date +%s).rules
ip6tables-save > ip6tables.$(date +%s).rules
ipset save > ipset.$(date +%s).conf

Concernant des appliances dédiées type stormshield ou autres, consultez la documentation fournisseur.

Exemples de Pare-feux

Linux

Netfilter

(source: Wikipedia, Jan Engelhardt)

Netfilter est le pare-feu intégré au noyau Linux depuis la version 2.4 du kernel. C’est la base sur laquelle sont construites les différentes solutions de pare-feu disponibles sous Linux. Il fonctionne sur les couches 2, 3 et 4 du modèle OSI (Liaison, Réseau et Transport, donc) et 1,2 et 3 du modèle TCP/IP.

Il utilise les modules suivants du noyau:

Module Rôle
arp_tables tables ARP
ip_tables tables IPv4
ip6_tables tables IPv6
ebtables tables Ethernet

iptables

iptables (et ip6tables pour IPv6) est un utilitaire permettant de manipuler les tables ip_tables du kernel. C’est un composant legacy qui doit à terme être remplacé par nftables. Cependant, des années d’utilisation d’iptables ont bien ancré la syntaxe de cet utilitaire dans le cerveau de pas mal d’administrateurs systèmes et réseaux (dont votre humble serviteur) au point qu’il existe iptables-nft, une surcouche de nftables utliisant la syntaxe d’origine d’iptables et produisant les règles nftables correspondantes.

iptables utilise plusieurs tables (filter - par défaut -, nat et mangle) contenant plusieurs chaînes (INPUT, FORWARD, OUTPUT par exemple) qui elles-mêmes vont contenir les règles à appliquer au trafice entrant, sortant ou transféré.

Note: ipset

ipset permet de résoudre un problème de taille. Imaginons que nous voulions bannir un grand nombre de sous-réseaux (par exemple, les sous-réseaux d’un Système Autonome (AS) utilisé pour des tentatives d’attaques par déni de service). Si nous utlisons les mécanismes de base de nos pare-feux, nous risquons donc de remplir les tables de nos pare-feux de dizaine de milliers de lignes. Ce qui veut dire que chaque paquet légitime traité devra passer plusieurs dizaines de milliers de conditions avant d’arriver à une condition le validant et le laissant donc “passer”. Multiplions ça par quelques centaines de milliers de paquets par seconde, et nous avons une belle recette d’auto-déni de service.

ipset permet de construire des tables de hashage (appelées listes) contenant un grand nombre d’éléments (65536 par liste, sachant qu’on peut utiliser plusieurs listes) qu’il est capable de parcourir extrêmement rapidement. Il fournit un module iptables permettant, en une règle iptables, de vérifier si une IP n’appartient pas à une liste ipset. Ainsi, on peut facilement appliquer une règle iptables à tout un AS, voire, à tout un pays, sans créer des dizaines de milliers de lignes dans nos chaînes iptables.

Note: nftables

nftables est le remplaçant d’iptables. Il est disponible depuis la version 3.14 du kernel (2014). Sa syntaxe plus verbeuse que celle d’iptables permet néanmoins plus de flexibilité: nftables incorpore des structures avancées telles que des dictionnaires, des mappings et autres n’existant pas avec l’utilitaire iptables seul.

UFW

Uncomplicated FireWall est là aussi une surcouche de netfilter, utilisée notamment par la distribution Ubuntu, simplifiant l’utilisation de netfilter notamment grâce à une syntaxe plus simple que celle d’iptables.

BSD

Sous les UNIX de la branche BSD (Berkeley Software Distribution), on retrouve plusieurs pare-feux, notamment:

Windows

Microsoft Windows implémente lui aussi un pare-feu, Windows Firewall, depuis Windows XP SP2. Il fonctionne sur le même concept que les pare-feux des autres systèmes d’exploitation en ajoutant une notion de profils:

Appliances logicielles (semi-)propriétaires et open-source

Les routeurs logiciels bien connus:

disposent d’un pare-feu - de mémoire OpenBSD PF - ainsi que d’une interface graphique de gestion permettant de créer, modifier et supprimer les différentes règles de contrôle d’accès aux réseaux auxquels ces appliances sont connectées.

Appliances propriétaires

Il s’agit de matériels dédiés, offrant une couche logicielle généralement propriétaire.

TP 1: Découverte d’iptables et ipset

Normalement, nous avons créé trois VMs:

Nous allons nous concentrer sur notre VM de base de données.

En effet, une stratégie de pare-feu ne s’arrête pas à l’entrée et à la sortie de nos réseaux: on voudra mettre en place une défense en profondeur et donc configurer correctement les pare-feux intégrés à tous les hôtes de nos réseaux, le but étant de s’assurer que seuls les communications autorisées sont permises entre les hôtes de nos réseaux.

Par exemple, dans le cas de notre base de données, notre routeur doit-il pouvoir communiquer directement avec le port de notre base de données?

Nous allons donc établir une première matrice de flux, puis ensuite configurer correctement le pare-feu de cette VM via iptables.

De la même façon, lorsqu’on utilise des charges de travail conteneurisées et notamment dans l’environnement Kubernetes, on voudra mettre en place des stratégies réseau (Network Policies) définissant quelles connexions sont autorisées entre conteneurs (et pods dans le cas de kubernetes). Par exemple, je ne voudrais pas que les charges de travail du namespace “client1” de mon cluster kubernetes puissent dialoguer avec les charges de travail du namespace “client2” pour des raisons évidentes de sécurité et de confidentialité.

Pour la configuration d’iptables, je vous invite à suivre ce lien: https://wiki.lidstah.info/en/linux/shell-basics#netfilteriptables

TP 2: Mise en place d’une stratégie de pare-feu à l’échelle de notre petite infrastructure

Matrice de flux et planification

Mise en place

Mettez en place sur le routeur et les hôtes de votre petite infrastructure les règles définies précédemment.

Vérification

Vérifions la bonne application de nos règles de filtrage.