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 Marotte ⛧ . Évalué à 3. Dernière modification le 30 janvier 2018 à 12:21.
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 electro575 . É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 NeoX . Évalué à 2.
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 electro575 . É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 electro575 . Évalué à 1.
Je prend l'exemple de /etc/fail2ban/filter.d/sshd.conf ,
Le failregex est le suivant :
Il y a bien le user dedans en plus du HOST !
Syntaxe utilisable ?
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 electro575 . É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 :
Si vous avez des iées pour le failregex, merci par avance
[^] # Re: Mes deux centimes
Posté par NeoX . É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 electro575 . É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 :
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.
sur une seule ligne :
Je te remercie.
[^] # Re: Mes deux centimes
Posté par electro575 . É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 Marotte ⛧ . Évalué à 3.
Je te recommande la lecture de https://fr.wikipedia.org/wiki/Expression_r%C3%A9guli%C3%A8re
[^] # Re: Mes deux centimes
Posté par electro575 . Évalué à 1.
Je te remercie
[^] # Re: Mes deux centimes
Posté par electro575 . É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 Marotte ⛧ . É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 Kerro . É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.