Haka pour le traitement de flux réseau

Posté par  . Édité par BAud et Nils Ratusznik. Modéré par bubar🦥. Licence CC By‑SA.
Étiquettes :
28
18
juil.
2014
Sécurité

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

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.