Thématiques principales

samedi 21 septembre 2019

Reseau : Iptables, firewall


Inutile d’expliquer ce qu’est un firewall? Si ?

Un firewall [firewall] est un système réseau logiciel ou matériel dont le rôle est de gérer l'accès à une machine où à un sous-réseau. Alors bien sur des firewalls, il en existe de toute sorte agissant pour divers rôles.

Le premier de ceux-ci est évidemment l'accès à un sous réseau. Il s’agit d’ici d'un système qui couplé à une passerelle permettant à deux réseaux de communiquer tout en garantissant un maximum de sécurité. Nous ne nous intéresserons pas à ce type de firewall puisque ces derniers sont généralement matériel et sont très complexe dans leur utilisation ainsi que dans leur intégration au sein d’une architecture réseau (généralement en couche).

Le second type de firewall, et qui va ici nous intéresser est le firewall logiciel dont le rôle est de sécuriser les interfaces réseaux d’un système. Par système on parle ici bien sûr tout autant d’une machine physique comme d’un PC mais aussi d’un serveur ou d’une machine virtuelle ou même encore d’un conteneur.

Dans notre exemple, nous allons utiliser Iptables, nous l'avions vu dans un article précédent [iptables]. Je vous invite a vous reporter pour faire le point.



On commence par se créer une chaîne à nous et on ajoute une règle permettant de l’appeler quand un message est reçu (cette règle va donc router tous les messages vers notre chaîne) et on ajoute une dernière règle dans justement notre chaîne personnalisé pour DROP les messages.

iptables -N TEST-CHAIN
iptables -A INPUT -s 0/0 -j TEST-CHAIN
  • -j permet de spécifier la cible du paquet, celle ci pouvant être soit une règle de gestion (DROP, ACCEPT, etc…) ou une autre chaîne, ce que nous faisons ici.
  • -s spécifie toutes adresses de tout type de réseau (IP/masque)
Une fois configurer on inspecte la table filter qui nous donne alors:

$ iptables -L


Chain INPUT (policy ACCEPT)
target prot opt source destination
TEST-CHAIN all -- anywhere anywhere

Chain TEST-CHAIN (1 references)
target prot opt source destination
DROP all -- anywhere anywhere 

On test alors avec un simple ping:


$ ping localhost

PING localhost (127.0.0.1) 56(84) bytes of data.


pas de réponse alors que si on retire la règle, le ping est possible:

$ iptables -D TEST-CHAIN 1

$ ping localhost
PING localhost (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: seq=0 ttl=64 time=0.130 ms
64 bytes from 127.0.0.1: seq=1 ttl=64 time=0.121 ms

On notera qu’ici la chaîne d’entrée est politique ACCEPT et que c’est parceque notre chaine perso possède une chaine contenant une règle DROP sur tout que nous ne parvenons plus à ping notre machine.

En terme de sécurité, ce n’est pas terrible, normalement on fait l’inverse, on supprime tous les droits et on rétablit des permissions au cas par cas.

On va donc sécuriser la chaîne INPUT en changeant sa politique et on supprimera notre règle DROP pour la remplacer ensuite par une règle autorisant le ping:


$ iptables -P INPUT DROP


On verifie que le ping est desactivé:

$ ping localhost
PING localhost (127.0.0.1) 56(84) bytes of data


On ajoute une regle dans TEST-CHAIN pour le reactiver et le tester:

$ iptables -A TEST-CHAIN -s 0/0 -p icmp -j ACCEPT
$ ping localhost
PING localhost (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.063 ms
  • -p permet de specifier le protocole, permettant de choisir par exemple, udp, tcp où ici pour le ping, icmp.

C’est un peu tout où rien, si par exemple notre machine possede deux interface reseaux, une filaire et une wifi, on pourrait souhaiter diferencier la politique de gestion et n’autoriser que les ping realisés sur l’interface filaire.

Pour cela on va utiliser le parametre -i:

$ iptables -D TEST-CHAIN 1
$ iptables -A TEST-CHAIN -i eth0 -p icmp -j ACCEPT


On test:


$ ping -I eth0 localhost
PING localhost (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.063 ms

$ ping -I wlan0 localhost
PING localhost (127.0.0.1) 56(84) bytes of data.


Ainsi, on peut de la même maniere selection specifiquement les messages associé à telle où telle IP (et de même par le reseau) en multipliant bien sur les regles associés

À noter que l’on peut egalement filtrer le traffic sortant de la machine afin de s’assurer qu’aucun message ne puisse s’en echappé sans avoir ete gerer (à laide des parametres -d, ip destination, ou -o, interface de sortie). On pourra aussi specifier les ports avec -sport et -dport.

De même il est possible d’effectuer des controles sur la nature des messages. Par exemple avec le parametre --syn, on pourra s’interesser specifiquement au message de synchro TCP permettant l’etablissement d’une nouvelle connexion.

On pourra egalement imposer des limites en terme de nombre de connexion par seconde afin de se premunir d’attaque de type DoS en utilisant le parametre -m:

-m limit --limit 5/s

Ce même paramètre pourra aussi servir pour la détection de l'état de la connexion par exemple:

-m state --state ESTABLISHED

Pour poursuivre et aller plus dans les finesse du matching, cette très bonne documentation vous permettra d'affiner vos regles [howto-firewall].

References

[firewall] https://fr.wikipedia.org/wiki/Pare-feu_(informatique)
[iptables] https://un-est-tout-et-tout-est-un.blogspot.com/2019/09/reseau-iptables-bases.html
[howto-firewall] http://www.linuxhomenetworking.com/wiki/index.php/Quick_HOWTO_:_Ch14_:_Linux_Firewalls_Using_iptables

Aucun commentaire:

Enregistrer un commentaire