URL: https://linuxfr.org/news/haka-pour-le-traitement-de-flux-reseau
Title: Haka pour le traitement de flux réseau
Authors: claudex
BAud et Nils Ratusznik
Date: 2014-07-17T11:59:25+02:00
License: CC By-SA
Tags: pare-feu, heartbleed, rmll et debian
Score: 28
Haka est un framework/langage basé sur Lua et destiné à appliquer des règles sur du trafic réseau en temps réel. Il permet aussi bien de faire un pare-feu classique, filtrant « bêtement » sur les ports, qu'un pare-feu applicatif. Il utilise la notion de _dissecteur_ qui, une fois la grammaire du langage décrite, permet de définir différents événements qui pourront être utilisés dans les règles définies.
Il faut noter que ce n'est que le tout début du langage, il manque encore certaines fonctionnalités critiques.
Haka est sous licence MPL 2.
----
[Site officiel](http://haka-security.org/)
[Image iso de test](http://haka-security.org/2014/07/15/rmll-workshop-and-slides/)
----
*Disclaimer* : j'ai fait le workshop Haka aux RMLL et il se basait sur la version 0.2 en développement de Haka, c'est donc celle-ci qui est décrite.
# À quoi ça sert ?
Vous pouvez bien sûr l'utiliser en tant que pare-feu classique, mais cela a peu d'intérêt. Il vaut mieux l'utiliser en tant que pare-feu applicatif qui va donc analyser le protocole de couche 7 ; cela peut aller de l'antispam à l'analyse de flux DNS pour, par exemple, lever une alerte en cas de détection d'attaque par *cache poisoning*. Mais il peut aussi faire de la modification de paquet, par exemple, pour éviter une attaque comme Heartbleed en corrigeant l'entête du message TLS afin qu'il ait bien la taille du message. Stéphane Bortzmeyer proposait même de l'utiliser pour mettre en place un proxy [DANE](http://fr.wikipedia.org/wiki/DNS_-_based_Authentication_of_Named_Entities).
# Exemples
Un *Hello World* qui enverra un message de catégorie `info` dans les logs à chaque paquet IPv4 reçu :
```lua
local ipv4 = require('protocol/ipv4')
haka.rule{
hook = ipv4.events.receive_packet,
eval = function (self, pkt)
haka.log('info', 'message receive from %s', pkt.src)
end
}
```
Un exemple un peu plus complexe qui remplace toutes les images qui transitent en HTTP par le logo de LinuxFr.org. On notera que c'est loin d'être parfait, il ne gère pas les images dont les tags sont sur plus d'une ligne et ne vérifie pas qu'il s'agit d'HTML qui transite. Il fonctionne en interceptant la requête au serveur pour éviter les caches et éviter un transfert gzippé qui ne peut (pour l'instant) être modifié avec Haka. Ensuite, il applique une simple expression régulière dans le contenu de la réponse du serveur.
```lua
local http = require('protocol/http')
local rem = require('regexp/pcre')
http.install_tcp_rule(80)
haka.rule {
hook = http.events.request,
eval = function(conn, request)
request.headers['Accept-Encoding'] = nil
request.headers['Accept'] = '*/*'
request.headers['If-Modified-Since'] = nil
request.headers['If-None-Match'] = nil
haka.log('info', 'request')
end
}
-- La règle suivante permet d'éviter des problèmes de Content-Length qui ne serait plus cohérent
haka.rule {
hook = http.events.response,
eval = function(conn, response)
conn:enable_data_modification()
end
}
local regexp = rem.re:compile('', rem.re.CASE_INSENSITIVE)
haka.rule {
hook = http.events.response_data,
eval = function(flow, iter)
local result = regexp:match(iter, true)
haka.log('info', 'plop %s', result)
if result then
haka.log('info', 'plop')
result:replace(haka.vbuffer_from(''))
end
end
}
```
# Débuggage
Premièrement, il est tout à fait possible d'utiliser des fichiers `pcap` au lieu d'un flux réel, très pratique pour faire des tests. Ensuite, l'outil de debug permet d'effectuer les opérations de manière interactive, ce qui permet de voir pas à pas comment se comporte le flux.
# Test
Pour tester par vous-même, le projet a mis a disposition une image iso qui a été utilisée pour le workshop aux RMLL, il s'agit d'une Debian live qui s'ouvre sur un bureau XFCE. Sur le bureau, deux liens : la documentation et les instructions du workshop. Avec cela, pas besoin de passer du temps à l'installer sur votre système pour tester.
# Développements futurs
- il manque un dissecteur IPv6 ;
- après la sortie de la version 0.2 qui devrait apporter suffisamment de fonctionnalités pour que l'outil soit utilisable, le travail va se tourner vers les performances.