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.
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.
Exemples
Un Hello World qui enverra un message de catégorie info
dans les logs à chaque paquet IPv4 reçu :
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.
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('<img .*/>', 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('<img src="http://linuxfr.org/images/logos/logo-linuxfr-cadre-ombre.png"></img>'))
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.
Aller plus loin
- Site officiel (520 clics)
- Image iso de test (63 clics)
# complément
Posté par Tonton Th (Mastodon) . Évalué à 4.
Stéphane Bortzmeyer a fait un petit galop d'essai avec le système Haka.
[^] # Re: complément
Posté par Stéphane Bortzmeyer (site web personnel, Mastodon) . Évalué à 4.
C'est normal, on était au même atelier aux RMLL :-)
# merci
Posté par voxmundix . Évalué à -1.
Merci pour cette découverte :)
# Vivement la version 47 !
Posté par kowalsky . Évalué à 2.
Tout est dans le titre.
# Release 0.2
Posté par haka-security . Évalué à 1.
Nous venons de publier une seconde version de Haka intégrant un certain nombre de nouvelles fonctionnalités. Nous vous laissons les découvrir par ici : http://www.haka-security.org/blog/2014/08/11/second-release.html
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.