4.2. Implémentation du modèle de
détection de trafic malveillant
Nous avons à ce niveau vérifié qu'on
pouvait bel et bien bloquer un paquet au niveau du kernel en fonction des
prédictions du modèle.
Pour ce faire, notre programme doit :
? Ouvrir une file d'attente
? se lier à une famille de réseau ( AF_PACKET
pour IPv4)
? fournir une fonction de rappel, qui sera automatiquement
appelée lors de la réception d'un paquet.
? Renvoyer un verdict avec le rappel en fonction des
prédictions
? Créer la file d'attente, en fournissant le
numéro de file d'attente qui doit correspondre aux --queue-num
grâce à iptables
? Lancez une boucle en attendant les événements.
Le programme devrait également fournir un moyen propre de quitter la
boucle
Nous nous sommes servis de Netfilter [38].
Netfilter fournit un mécanisme pour faire passer des paquets hors de la
pile pour la mise en file d'attente dans l'espace utilisateur, puis pour les
recevoir de nouveau dans le noyau avec un verdict spécifiant quoi faire
avec les paquets (comme ACCEPT ou DROP). Ces paquets peuvent
également être modifiés dans l'espace utilisateur avant
d'être réinjectés dans le noyau.
Un module de noyau appelé gestionnaire de
files d'attente peut s'inscrire auprès de Netfilter pour
effectuer les mécanismes de transmission de paquets vers et depuis
l'espace utilisateur.
Nfqueue est un petit wrapper autour de
libnetfilter_queue. NFQUEUE permet d'envoyer
des paquets pour des files d'attente séparées et
spécifiques. La file d'attente est identifiée par un id de 16
bits. Une fois nfqueue chargé, les paquets IP peuvent être
sélectionnés avec iptables et mis en file d'attente pour le
traitement de l'espace utilisateur via la cible QUEUE.
libnetfilter_queue est une bibliothèque de l'espace
utilisateur qui fournit un API aux paquets qui ont été
placés en file d'attente par le filtre de paquet du kernel. Il a
remplacé le vieux ip_queue / libipq. Il utilise nfqueue [39].
L'option --queue-num spécifie quelle file d'attente
utilisé et vers où envoyer les données. Si cette option
n'est pas placée, la file d'attente par défaut sera à 0.
Le chiffre de la file d'attente est un entier non signé de 16 bits, ce
qui veut dire qu'elle peut prendre n'importe quelle valeur comprise entre 0 et
65535.
Les cibles (les verdicts) les plus classiques sont :
? NF_ACCEPT: continuez la traversée normalement.
? NF_DROP: abandonnez le paquet; ne continuez pas la
traversée.
? NF_STOLEN: J'ai repris le paquet; ne continuez pas la
traversée.
? NF_QUEUE: mettez le paquet en file d'attente
(généralement pour la gestion de l'espace utilisateur).
? NF_REPEAT: rappelez, réinjecter le à la file
d'attente
Ces cibles permettent d'envoyer le paquet en espace
utilisateur pour qu'une application puisse effectuer sa propre analyse et
décider du verdict. Cependant avant toute chose nous devons rediriger le
trafic qui passe par la passerelle vers la file d'attente.
A moins de nous même programmer notre propre module qui
communique avec le kernel pour pouvoir mettre en place notre filtre, nous nous
sommes servis de celui-ci pour pouvoir émettre un verdict sur un paquet
en fonction du résultat de la prédiction. De cette façon,
nous accélérons le traitement des paquets dans la file d'attente
du pare-feu.
|