• [^] # Re: whitelist/blacklist

    Posté par . En réponse à la dépêche reaction, remplaçant de fail2ban. Évalué à 3.

    Pour ce qui est d'une denylist (/blacklist) permanente, je sais pas si c'est pertinent d'implémenter ça directement dans reaction.

    Par contre je viens de réfléchir à une configuration qui le permette de manière pas si dégueu !

    • À chaque fois que reaction ban une IP, il la stocke également dans un fichier.
    • reaction suit ce fichier comme un stream, et n'en garde que les 3 premiers nombres (la partie "réseau")
    • au bout de 50 occurences du même réseau en un mois, il ban tout le réseau pour un an.

    reaction.jsonnet

    local permanentfile = '/var/lib/reaction/permanent';
    {
     patterns: {
     // full ip
     ip: {
     regex: '...',
     },
     // Only keep "network" part of an IPv4
     ipD: {
     regex: @'[0-9]\.[0-9]\.[0-9]\.',
     },
     },
     streams: {
     myservice: {
     // ...
     filters: {
     myfilter: {
     // ...
     actions: {
     ban: {
     // ...
     },
     unban: {
     // ...
     },
     // when banning an IP, you also put it in a file
     storeinfile: {
     cmd: ['store.sh', '<ip>', permanentfile]
     },
     },
     },
     },
     },
     myotherservice: {
     // ... same 'storeinfile' action
     },
     permanent: {
     cmd: ['tail', '-fn0', permanentfile],
     filters: {
     oneyearban: {
     regex: [@'^<ipD>.*'],
     // 50 bans of this network in one month
     retry: 50,
     retryperiod: std.toString(31 * 24) + 'h',
     actions: {
     ban: {
     // ...
     },
     unban: {
     // ...
     // unban after 12 months
     after: std.toString(12 * 31 * 24) + 'h',
     },
     },
     },
     },
     },
     },
    }
    

    store.sh

    #!/usr/bin/env bash
    echo "1ドル" >> "2ドル"

    Notes:

    • J'utilise un petit script plutôt que la commande ['sh', '-c', 'echo <ip> >> ' + permanentfile], car faire un sh -c est risqué, de manière inhérente.
    • Pour ban un rang d'IP, il faut ajouter le /24: iptables -w -A reaction -s a.b.c.0/24 -j DROP
    • Je n'ai pas testé, mais c'est forcément pas loin de fonctionner 😄 S'il y a un vrai intérêt autour de cette méthode, je ferai une page dans le wiki.
    • Si quelqu'un trouve une manière élégante de permettre de chainer des streams dans reaction, et ainsi d'ajouter de la réflexivité, ça m'intéresse d'implémenter ça, et d'éviter d'avoir recours à un fichier externe comme dans cet exemple. Mais il faut alors trouver de nouvelles options de conf pour permettre ça de manière élégante. (Les issues sont ouvertes !)
    • Si je vous ai perdu avec ce bout de conf, je peux essayer d'expliquer mieux, n'hésitez pas à poser des questions.