Forum Linux.débutant Fail2ban conf : failregex

Posté par  . Licence CC By‑SA.
Étiquettes :
0
30
jan.
2018

Bonjour à tous,

Je débute avec fail2ban et j'aimerais traiter la ligne de log suivante :

{
"reqId":"nkUHMTIR238pHO8fZ4E3",
"level":2,
"time":"January 29, 2018 21:25:30",
"remoteAddr":"192.168.1.1",
"user":"--",
"app":"core",
"method":"POST",
"url":"\/login?user=arthur575",
"message":"Login failed: 'arthur575' (Remote IP: '192.168.1.1')",
"userAgent":"Mozilla\/5.0 (X11; Linux x86_64; rv:52.0) Gecko\/20100101 Firefox\/52.0",
"version":"12.0.5.3"
}

Ainsi, je me suis documenté et voici ce que j'en ressors pour le fichier /etc/fail2ban/filter.d/nextcloud.conf

Est-il nécessaire de mettre le caractère '\' au niveau de la ligne ci-dessous "message":"Login failed: '.*' (Remote IP: '')" ?

[Definition] 
failregex = {
"reqId":".*",
"level":2,
"time":".*",
"remoteAddr":".*",
"user":".*",
"app":"core",
"method":".*",
"url":".*",
"message":"Login failed: '.*' \(Remote IP: '<HOST>'\)",
"userAgent":".*",
"version":".*"
}

Merci par avance.

Bonne journée.

  • # Mes deux centimes

    Posté par  . Évalué à 3. Dernière modification le 30 janvier 2018 à 12:21.

    "message":"Login failed: '.*' (Remote IP: '')"

    Il s’agit d’une « expression régulière », donc si le message à matcher comporte des parenthèses (ce qui est la cas d’après l’exemple de message que tu donnes) il faut mettre \ devant, car sinon les parenthèses ont une signification spéciale : elles entourent un « groupe de capture ».

    Je dirais donc : oui.

    • [^] # Re: Mes deux centimes

      Posté par  . Évalué à 1.

      D'accord, je te remercie.

      Je me posais également la question.

      Que faut-il appliquer comme stratégie de ban d'IP :

      1-compter le nombre de max retry quelque soit le user demandé  ?
      -> si le user n'existe pas, que ce passe t-il, est-ce que l'essai est tout de même pris en compte ?

      2-compter le nombre de max retry pour un user existant dans la base de données ?
      -> c'est mieux car si l'on se trompe de user, on peut être embêté

      Pour le moment je suis sur le cas 1- mais j'aimerais appliquer le cas 2- si tu as une idée.

      Merci

      • [^] # Re: Mes deux centimes

        Posté par  . Évalué à 2.

        Que faut-il appliquer comme stratégie de ban d'IP :

        celle que tu veux pardi,
        c'est toi qui gere la securité, c'est toi qui voit si tu bannes à vie, ou si tu bannes pour x minutes…

        • [^] # Re: Mes deux centimes

          Posté par  . Évalué à 1. Dernière modification le 30 janvier 2018 à 19:30.

          C'est juste que je ne connais pas la syntaxe, je sais qu'il y a la syntaxe 'HOST' mais je n'ai pas de doc la dessus.

          Est-ce que pour prendre en compte un user particulier pour appliquer la règle on peut mettre 'user' ?

          • [^] # Re: Mes deux centimes

            Posté par  . Évalué à 1.

            Je prend l'exemple de /etc/fail2ban/filter.d/sshd.conf ,

            Le failregex est le suivant :

            failregex = ^%(__prefix_line)sFailed \S+ for (?P<cond_inv>invalid user )?(?P<user>(?P<cond_user>\S+)|(?(cond_inv)(?:(?! from ).)*?|[^:]+)) from <HOST>(?: port $

            Il y a bien le user dedans en plus du HOST !

            Syntaxe utilisable ?

            <user>
            <HOST>

            Avec le fail2ban de base on bannit une IP lorsque le max retry est atteint pour :
            -1 seul user
            -pour tous les user même non existant ?
            => en gros quand est-ce qu'on est banni ?

            • [^] # Re: Mes deux centimes

              Posté par  . Évalué à 1.

              J'ai essayé de faire un essai de correspondance de mon premier failregex du premier poste mais sans réussite.

              Je ne vois pas comment faire ma règle par rapport à mon log.

              J'avais fait un test dont voici le résultat :

              root@raspberrypi:/home/pi# fail2ban-regex /var/tmp/nextcloud.log /etc/fail2ban/filter.d/nextcloud.conf
              
              Running tests
              =============
              
              Use   failregex filter file : nextcloud, basedir: /etc/fail2ban
              Use         log file : /var/tmp/nextcloud.log
              Use         encoding : UTF-8
              
              
              Results
              =======
              
              Failregex: 0 total
              
              Ignoreregex: 0 total
              
              Date template hits:
              
              Lines: 24 lines, 0 ignored, 0 matched, 24 missed
              [processed in 0.11 sec]
              
              Missed line(s): too many to print.  Use --print-all-missed to print all 24 lines

              Si vous avez des iées pour le failregex, merci par avance

              • [^] # Re: Mes deux centimes

                Posté par  . Évalué à 2.

                pour connaitre la regex à faire, il faudrait peut-etre avoir la ligne de log

                mais d'apres les documentations :
                https://www.fail2ban.org/wiki/index.php/Main_Page

                il n'y aurait pas de gestion 'utilisateur'
                le fail2ban de memoire agit sur des lignes de logs similaires,
                X lignes de log qui disent que user=toto failed => je bannis l'hote qui a tenté de se connecter en tant que toto
                Y lignes de log qui disent que user=titi failed => je bannis l'hote qui a tenté titi.

                si tu filtres sur "user=* failed" alors ca devrait bannier des que X+Y depasse le seuil max

                • [^] # Re: Mes deux centimes

                  Posté par  . Évalué à 1. Dernière modification le 31 janvier 2018 à 08:18.

                  D'accord, je te remercie pour ton explication.

                  Voici le log que j'ai découpé mais qui se remet sur une ligne :

                  {
                  "reqId":"nkUHMTIR238pHO8fZ4E3",
                  "level":2,
                  "time":"January 29, 2018 21:25:30",
                  "remoteAddr":"192.168.1.1",
                  "user":"--",
                  "app":"core",
                  "method":"POST",
                  "url":"\/login?user=arthur575",
                  "message":"Login failed: 'arthur575' (Remote IP: '192.168.1.1')",
                  "userAgent":"Mozilla\/5.0 (X11; Linux x86_64; rv:52.0) Gecko\/20100101 Firefox\/52.0",
                  "version":"12.0.5.3"
                  }
                  {
                  "reqId":"nkUHMTIR238pHO8fZ4E3","level":2,"time":"January 29, 2018 21:25:30","remoteAddr":"192.168.1.1","user":"--","app":"core","method":"POST","url":"\/login?user=arthur575","message":"Login failed: 'arthur575' (Remote IP: '192.168.1.1')","userAgent":"Mozilla\/5.0 (X11; Linux x86_64; rv:52.0) Gecko\/20100101 Firefox\/52.0","version":"12.0.5.3"}

                  Après j'ai vu des .conf mais syntaxiquement je ne sais aps ce que ça fait, je ne connais que le .* pour dire qu'importe l'adresse IP par exemple comme je l'ai fait ci-dessous. Je l'ai découpé comme au dessus.

                  [Definition] 
                  failregex = {
                  "reqId":".*",
                  "level":2,
                  "time":".*",
                  "remoteAddr":".*",
                  "user":".*",
                  "app":"core",
                  "method":".*",
                  "url":".*",
                  "message":"Login failed: '.*' \(Remote IP: '<HOST>'\)",
                  "userAgent":".*",
                  "version":".*"
                  }

                  sur une seule ligne :

                  [Definition] 
                  failregex = {"reqId":".*","level":2,"time":".*","remoteAddr":".*","user":".*","app":"core","method":".*","url":".*","message":"Login failed: '.*' \(Remote IP: '<HOST>'\)","userAgent":".*","version":".*"}

                  Je te remercie.

                  • [^] # Re: Mes deux centimes

                    Posté par  . Évalué à 1.

                    Pour le moment je n'ai toujours pas trouvé de cours pour trouver un failregex qui match avec mon fichier log.

                    Les expressions régulières font partie de Linux OS ?

                    • [^] # Re: Mes deux centimes

                      Posté par  . Évalué à 3.

                      Les expressions régulières font partie de Linux OS ?

                      Je te recommande la lecture de https://fr.wikipedia.org/wiki/Expression_r%C3%A9guli%C3%A8re

                      • [^] # Re: Mes deux centimes

                        Posté par  . Évalué à 1.

                        Je te remercie

                        • [^] # Re: Mes deux centimes

                          Posté par  . Évalué à 1. Dernière modification le 06 février 2018 à 13:22.

                          Je continue de chercher comment m'en sortir.

                          J'avance dans le sens ou je sais que :
                          1-mon fichier log est de type "FailJSON metadata" (voir 1er lien)
                          2-que fail2ban utilise du python

                          J'ai vu un lien pour fail2ban et la partie python qui le compose :

                          https://fail2ban.readthedocs.io/en/latest/filters.html
                          https://docs.python.org/2/library/re.html

                          Il parait que mon fichier log est en fait de type "FailJSON metadata".

                          Le chapitre "Developing Filter Regular Expressions" du 1er lien pourrait être une piste.

                          • [^] # Re: Mes deux centimes

                            Posté par  . Évalué à 3.

                            Il y a un truc que je ne comprends pas. Qu’est-ce que ce <HOST> ici :

                            "message":"Login failed: '.*' \(Remote IP: '<HOST>'\)",

                            Est-ce que par hasard ce ne serait pas un truc donné en exemple dans une doc, et donc à remplacer ? Ou bien c’est fail2ban qui remplace automatiquement ? Si tu remplaces '<HOST>' par '.*' ça donne quoi ?

                            Ici le premier .* va matcher n’importe quel user (arthur575 dans ton exemple), mais là, d’après ce que je comprends (mais je ne connais vraiment pas fail2ban attention!) il faudrait, pour matcher, que ton JSON de log ait une valeur (pour "message") contenant réellement la chaîne <HOST>, bref : ??! (j’essaie d’apprendre en même temps…)

                            De manière générale, en terme d’expression régulière, dans l’expression .* on a :

                            • . signifiant « n’importe quel caractère »
                            • * un « quantifieur » (ou quantificateur), signifiant « répété zéro ou plus fois » (ça s’applique au caractère (ou au groupe de capture ou à la classe…) qui le précède)

                            .* est donc une regex un peu particulière : elle match tout. Même une chaîne vide puisque le caractère peu être répété zéro fois.

                            À titre d’exemple : .+ matcherait tout, sauf une chaîne vide, le quantifieur + signifiant lui : « répété une ou plus fois »

                            Les regex semblent difficiles à comprendre de prime abord mais une fois qu’on a compris les bases, on se rend compte que c’est hyper-puissant et qu’on peut faire pas mal de choses avec. Personnellement j’ai découvert les regex trop tard dans ma carrière, ça m’aurait parfois fait gagner énormément de temps dans des développements…

                            • [^] # Re: Mes deux centimes

                              Posté par  . Évalué à 2.

                              <HOST> est la marque qui indique à fail2ban où se trouve l'adresse IP de l'attaquant.
                              Ça lui permet de compter le nombre d'occurences de cette IP dans le journal, et d'indiquer à netfilter quelle IP filtrer.

Suivre le flux des commentaires

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