La sécurité informatique est un terme général qui cache de nombreux aspects, tels que la sécurité physique de la machine, le contrôle d'accès aux fichiers, etc. L'un des aspects de la sécurité concerne la sécurité des réseaux. Avec la démocratisation d'Internet, les tentatives d'intrusions se développent. Afin de limiter le nombres de ces attaques, le mieux est encore de filtrer dès l'entrée du réseau tout ce qui n'est pas sensé y entrer. Le système qui permet la mise en place de ce filtrage s'appelle un firewall ou un «pare-feu» en français.
Un firewall peut se définir comme un dispositif de protection (matériel et/ou logiciel) constituant un filtre entre un ordinateur ou un réseau local et un réseau non sûr (Internet ou un autre réseau local par exemple). On distingue deux grandes familles de firewalls :
-
Les firewalls basés sur le filtrage réseau. Ces éléments fonctionnent au niveau transmission de l'information des couches du modèle OSI. Le filtrage s'effectue en fonction des informations contenues dans les en-têtes des trames, des paquets (adresses source et destination) et des segments (ports source et destination). Ce type de filtrage ne s'intéresse pas au contenu des paquets.
-
Les firewalls applicatifs ou de services. Ce type de filtrage permet de contrôler le traitement de l'information. Dans ce cas, l'information contenue dans le paquet peut être prise en compte. Les demandes de connexions sont dirigées vers un programme spécial appelé mandataire ou proxy de service. C'est ce dernier qui établira la connexion vers le service extérieur demandé.
Pour pouvoir bénéficier des fonctions de filtrage réseau du noyau LINUX, il faut y intégrer l'option iptables.
lors de la compilation. Cette fonctionnalité est une structure générale qui permet à d'autres éléments de se «brancher» dessus. Pour pouvoir indiquer les différentes règles au noyau, on dispose de l'utilitaire appeléL'outil iptables
utilise le concept de tables de règles, chaque table correspondant
à une fonctionnalité d'examen du paquet. La table filter
correspond au filtrage des paquets, la table
nat
concerne la traduction d'adresse et
la table mangle
permet la modification
des paquets.
Dans un premier temps, iptables servira à la gestion des
chaînes. Une chaîne peut être assimilée à une politique de sécurité
associée à un flux de données. Par exemple, on peut définir une
chaîne INTERNET
pour désigner tous les
flux venant de l'extérieur de votre réseau local. Trois chaînes par
défaut existent, à savoir INPUT
,
FORWARD
et OUTPUT
. Si le nombre de règles est limité, on peut
se contenter de celles-ci, mais si les règles deviennent
conséquentes, il est préférable, pour faciliter la gestion, de
créer de nouvelles chaînes. Les commandes de l'outil iptables associées à la gestion
des chaînes sont les suivantes :
-N
-
Création d'une nouvelle chaîne. Exemple
iptables -N INTERNET
. -X
-
Suppression d'une chaîne vide. Exemple
iptables -X INTERNET
. -P
-
Mise en place de la règle par défaut pour une chaîne existante. Exemple :
iptables -P INPUT DROP
. Seules les chaînesINPUT
,FORWARD
etOUTPUT
peuvent avoir une règle par défaut et les seules cibles disponibles sontACCEPT
etDROP
. -L
-
Lister les règles d'une chaîne. Exemple :
iptables -L INTERNET
. -F
-
Effacer les règles d'une chaîne. Exemple :
iptables -F INTERNET
.
Dans un deuxième temps, il convient de construire les règles à
l'intérieur des différentes chaînes. L'ajout d'une règle s'effectue
avec l'option -A
de l'outil
iptables, tandis que
l'effacement d'une règle se fait avec l'option -D
. Les principales spécifications sur lesquelles
les règles peuvent s'appuyer sont les suivantes :
-
-s : spécifie l'adresse IP source
-
-d : spécifie l'adresse IP de destination
-
-p : spécifie le protocole. Le protocole peut être tcp, udp ou icmp
-
-i : spécifie le nom de l'interface physique à travers laquelle les paquets entrent
-
-o : spécifie le nom de l'interface physique à travers laquelle les paquets sortent
Ces spécifications sont les plus générales, mais il en existe bien d'autres qui sont parfaitement listées dans la page de manuel de l'outil iptables.
Avec iptables, les
différentes règles de filtrage sont organisées et regroupées dans
des chaînes. Par défaut, il y a trois chaînes appelées INPUT
, OUTPUT
et FORWARD
. L'arrangement de ces chaînes
est proposé sur le schéma suivant :
_____ Incoming / \ Outgoing -->[Routing ]--->|FORWARD|-------> [Decision] \_____/ ^ | | v ____ ___ / \ / \ |OUTPUT| |INPUT| \____/ \___/ ^ | | ----> Local Process ---- (c)2000 Rusty Russell
Les différentes chaînes sont consultées suivant la procédure suivante :
-
Quand un paquet arrive, le noyau décide de la destination de ce paquet : c'est la phase de routage.
-
Si le paquet est destiné à la machine, le paquet descend dans le diagramme et la chaîne INPUT est appliquée. Si le paquet passe cette chaîne, celui-ci sera transmis à l'un des processus locaux.
-
Si le routage décide que le paquet est destiné à un autre réseau, alors c'est la chaîne
FORWARD
qui est appliquée. -
Enfin, les paquets envoyés par un processus local seront examinés par la chaîne OUTPUT. Si le paquet est accepté, celui-ci sera envoyé quelle que soit son interface de sortie.
Une chaîne est composée d'une liste de règles. Une règle décide de l'avenir d'un paquet en fonction de son en-tête. Les règles d'une chaîne sont examinées les unes après les autres jusqu'à ce qu'une correspondance soit trouvée. Finalement, si aucune correspondance n'est trouvée, la règle par défaut, policy, est appliquée. On associe à chaque règle une action à réaliser qui décide de l'avenir du paquet. Les fonctions principales sont les suivantes :
-
ACCEPT : cette cible permet d'accepter les paquets.
-
DROP : cette cible permet de refuser les paquets sans avertir le demandeur que sa demande de connexion a été refusée.
-
REJECT : cette cible permet de refuser les paquets, mais en avertissant le demandeur que sa demande de connexion a été refusée en lui envoyant un paquet RESET (RST).
L'une des grandes nouveautés de la partie réseau du noyau 2.4 est la possibilité du suivi des communications. Ceci fait référence à la capacité du noyau à maintenir une table de suivi des communications en se basant, par exemple, sur le couple adresses (source et destination), sur les numéros de ports (source et destination), sur les types de protocoles ou l'état de la communication. Les pare-feux disposant de cette fonctionnalité sont appelés stateful firewalls. Dans ce cas, les paquets sont inspectés dans le contexte d'une session. Par exemple, un segment TCP avec le bit ACK activé sera rejeté si aucun segment SYN correspondant n'a été reçu auparavant.
Le suivi des «communications» se base sur trois états :
-
NEW
: correspond à la demande de communication TCP initiale, au premier datagramme UDP ou au premier message ICMP. -
ESTABLISHED
: si une entrée de la table de suivi des communications correspond, alors le paquet appartient à une communication de typeESTABLISHED
. Dans le cas du protocole TCP, on se réfère au bit ACK après qu'une communication ait été initiée. Dans le cas de datagrammes UDP c'est l'échange entre deux hôtes et les correspondances de numéros de ports qui sont prises en compte. Enfin, les messages ICMPecho-reply
doivent correspondre aux requêtesecho-request
. -
RELATED
: se réfère aux messages d'erreurs ICMP correspondant à une «communication» TCP ou UDP déjà présente dans la table de suivi.
D'un point de vue pratique, le module de suivi des
communications sera activé grâce à l'option -m
state
de la commande iptables. L'option --ctstate
permet de spécifier l'état de la
communication à considérer.
Exemple 36. Autorisation d'une connexion ssh vers l'extérieur
#
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT#
iptables -A OUTPUT -p tcp -d 0/0 --dport 22 -m conntrack --ctstate NEW -j ACCEPT
La traduction d'adresse est une technique qui permet de
remplacer une adresse source ou destination par une autre. La
traduction d'adresse du noyau 2.4 supporte le source NAT (SNAT) et le destination
NAT (DNAT). La table
nat
permet la modification des adresses
source et destination grâce à deux chaînes par défaut :
-
PREROUTING
: permet la modification de l'adresse de destination (DNAT) avant que le paquet ne passe par les fonctions de routage. -
POSTROUTING
: permet la modification de l'adresse source (SNAT) après que le paquet soit passé par les fonctions de routage.
_____ _____ / \ / \ PREROUTING -->[décision]----------------->POSTROUTING-----> \D-NAT/ [de routage] \S-NAT/ ----- | ^ | __|__ | / \ | | OUTPUT| | \D-NAT/ | ^ | | -------->Processus local------
Intéressons nous dans un premier temps à la traduction d'adresse
source ou S-NAT. Il existe en
deux formes distinctes au sein des noyaux (2.4|2.6) : SNAT
et MASQUERADE
.
SNAT
est la forme standard de la
traduction d'adresse source, tandis que la deuxième est plus
spécialisée au cas d'adresses IP assignées dynamiquement. La
distinction entre les deux formes est subtile.
Avec SNAT
, la communication est
maintenue pendant un certain temps d'attente lors d'un
dysfonctionnement. Si cette communication est rétablie suffisamment
rapidement, les programmes réseaux ne seront pas affectés et le
trafic TCP interrompu sera
retransmis, dans la mesure où l'adresse IP n'a pas été changée.
Avec la forme MASQUERADE
, il n'y a
pas de temps d'attente quand la connexion est rompue et les
informations concernant la traduction d'adresse sont effacées. Ceci
permet d'utiliser immédiatement la nouvelle adresse IP qui peut
être attribuée lors d'une reconnexion à un fournisseur d'accès, par
exemple.
Exemple 37. SNAT standard
# iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 192.192.192.192