Rendez-vous sur Arrakis

C'est lorsque nous croyons savoir quelque chose qu'il faut justement réfléchir un peu plus profondément. F. Herbert

Un fail2ban pour OpenBSD : vilain

Suite au message de Vincent qui me parlait de fail2ban, j'ai eu envie de reprendre ses idées . Il s'agit d'un petit programme qui reproduit le comportement de fail2ban mais pour OpenBSD.
Autrement dit, cet outil surveille les journaux du systèm et repère les erreurs d'identification. Si trop d'erreurs à la suite sont reprérées, on peut supposer que le serveur subit une attaque. Alors, on met sur liste noire l'IP.
Je l'ai modifié pour qu'il soit possible de surveiller plusieurs services et plusieurs journaux en même temps.

Il s'utilise ainsi :

table <vilain_bruteforce> persist
 block quick from <vilain_bruteforce>

On crée donc une table qui contiendra les IP à blacklister.

[DEFAULT]
 # 24h + 5min
 watch_while = 86700
 maxtries = 3
 
 #[name of the guardian]
 #logfile = /file/to/watch
 #regex = regex that return the bad guy IP
 
 [ssh]
 logfile = /var/log/authlog
 regex = .* Failed .* from ([\S]+) .*
 
 [ssh2]
 logfile = /var/log/authlog
 regex = .* Connection closed by ([\S]+) .*

La première section permet de définir pendant combien de temps une IP “mauvaise” est surveillée, et le nombre d'essais successifs qu'elle peut faire.
Ensuite, vous pouvez créez autant de sections que vous voulez. Il faut juste veiller à créer une expression régulière qui ressort l'IP du méchant.

Tout se télécharge ici : http://git.yeuxdelibad.net/vilain.tgz ou http://git.yeuxdelibad.net/vilain/

J'aimerais avoir vos idées en plus des retours de bugs : quelles regexp sur quels fichiers vous auriez besoin ?

ps : les lecteurs du site obsd4a.net auront certainement remarqué une répétition dans cet article. J'ai besoin de retours d'expérience :) ).

le 27/12/2016 à 15:24:54, 22Decembre a dit :

Faut voir… Je vais sûrement tester.

Je me demande si ça pourrait s'adapter sur d'autres trucs.

le 27/12/2016 à 18:27:52, barmic a dit :

Je n'ai pas utilisé ton outil, mais ce qu'il manque je trouve c'est de pouvoir lancer une commande à la place de bannir une IP.

Un cas d'usage possible est ici : https://linuxfr.org/users/foutaises-0/journaux/hp-l-informatique-de-trahison#comment-1677456

Mais ça ouvre plus globalement le champ à un tas de possibilités.

le 28/12/2016 à 08:55:22, thuban a dit :

@barmic : Très bonne idée !
Ce n'est en plus pas difficile à rajouter dans le fichier de configuration, donc je pense intégrer cette fonctionnalité.

le 30/12/2016 à 19:10:58, 22Decembre a dit :

Premier commentaire…

On devrait pouvoir conf' le nom de la table ! (me parait évident maintenant que je le mets en place).

Il faut aussi penser à vidanger cette table de temps en temps.

le 06/01/2017 à 15:41:14, sub a dit :

Bonjour à tous
merci Thuban pour ce bon script python qui faisait bien défaut sous openbsd en effet
je vais l'utiliser pour ma part et te remercie chaudement.
concernant les idées de regex, un indispensable serait de ban les erreurs de htpasswd (pour nginx ou httpd )

pour nginx le message de log est de ce type
2017/01/06 16:31:23 [error] 42148#0: *2 user “test2” was not found in “/htdocs/websites/staff/passwd.htpw”, client: 123.123.123.123, server: staff.exemple.fr, request: “GET │·····················································································································································
/ HTTP/2.0”, host: “staff.exemple.fr”

même si l'idéal serait de faire un tout petit portail web qui demande un login+pass et ajoute l'ip dans une table quand c'est bon et drop tout le reste
mais je ne sais pas faire :-(
ensuite ça permet de donner accès au service de notre choix a qui on veut (et uniquement qui on veut) le temps que l'on veut par un expire de dans cron

bien à vous
vive openbsd

le 07/01/2017 à 09:08:25, thuban a dit :

L'idée est notée, merci :)