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 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é iptables.
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înes INPUT, FORWARD et
OUTPUT peuvent avoir une règle par défaut et les seules
cibles disponibles sont ACCEPT et
DROP.
-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 type ESTABLISHED. 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 ICMP
echo-reply doivent correspondre aux requêtes
echo-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 --state 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 state --state ESTABLISHED,RELATED -j ACCEPT # iptables -A OUTPUT -p tcp -d 0/0 --dport 22 -m state --state 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'un 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
Vous êtes ici :