Recevoir une alerte dans Jeedom lorsque Fail2Ban bannit une adresse IP

Bonjour,

:warning: Ce tutoriel est destiné à des utilisateurs avancés qui sont à l’aise en SSH. Concernant les boxs officielles je ne sais pas dans quelles mesures vous avez le droit de modifier des fichiers de configuration, je vous conseille donc de vous renseigner. :warning:

Fail2Ban est un framework de prévention contre les intrusions, écrit en Python. Il lit les logs de divers services (SSH, Apache, FTP, …) à la recherche d’erreurs d’authentification répétées et ajoute une règle iptables pour bannir l’adresse IP de la source.
Il est nativement installé et configuré par le script d’installation de Jeedom.

1)_ Prérequis
Vérifier la présence du paquet fail2ban :
dpkg -s fail2ban
image
Si il n’est pas installé, installez-le avec :
sudo apt install fail2ban

Vérifier la présence du paquet iptables :
image
Si il n’est pas installé, installez-le avec :
sudo apt install iptables

:warning: iptables est remplacé par nftables dans les dernières versions. :warning:
Vérifier la présence du paquet nftables :
dpkg -s nftables
image
Si il n’est pas installé, installez-le avec :
sudo apt install nftables

Vérifier la présence du fichier de configuration de Jeedom :
ls /etc/fail2ban/jail.d/
image
Si il n’est pas présent copiez-le depuis l’arborescence de Jeedom avec :
cp /var/www/html/install/fail2ban.jeedom.conf /etc/fail2ban/jail.d/jeedom.conf

2)_Configurer Fail2Ban
Fail2Ban lit les fichiers de configuration dans cet ordre :
Capture d’écran 2022-08-11 210350
On va créer un fichier de configuration qui va être lu après le fichier de configuration par défaut ainsi qu’après le fichier de configuration de Jeedom, par conséquent les paramètres présents dans ce fichier vont écraser les paramètres des fichiers précédents.
sudo nano /etc/fail2ban/jail.local

[DEFAULT]

# The simplest action to take: ban only
action = %(action_)s
         jeedom

Sauvegarder le fichier.

Création d’un fichier d’action personnalisé :
sudo nano /etc/fail2ban/action.d/jeedom.conf

[Definition]

# bypass action for restored tickets
norestored = 1

# Option:  actionban
# Notes.:  command executed when banning an IP. Take care that the
#          command is executed with Fail2Ban user rights.
# Tags:    See jail.conf(5) man page
# Values:  CMD
#
actionban = curl -X POST https://#DOMAIN_NAME#/core/api/jeeApi.php -d "apikey=#APIKEY#" -d "type=message" -d "category=Fail2Ban" --data-urlencode "message=L'IP <ip> vient d'être bannie après <failures> tentative(s) contre <name>."

Sauvegarder le fichier.
Notes : Pour que la requête curl fonctionne il faut que votre clé API globale soit activée dans la configuration de Jeedom. J’ai choisi d’envoyer un message à Jeedom mais sachez que vous pouvez mettre à jour une commande, appeler un scénario avec des tags, … Voir la doc. de l’ API HTTP et adapter le curl en conséquence.

Redémarrer Fail2Ban pour charger les nouveaux fichiers de configuration :
sudo systemctl restart fail2ban

3)_Tester
Pour tester la nouvelle configuration nous allons simplement bannir manuellement une adresse IP externe quelconque dans le jail [apache-noscript] :
sudo fail2ban-client set apache-noscript banip XX.XX.XX.XX

Vérifier que Fail2Ban a bien banni l’adresse l’IP :
sudo tail -f /var/log/fail2ban.log (cette commande permet de visualiser les 10 dernières lignes du log de Fail2Ban en temps réel, Ctrl+C pour arrêter le processus)

Si tout va bien, vous devriez recevoir un message dans Jeedom :

Vous pouvez débannir l’IP manuellement avec :
sudo fail2ban-client set apache-noscript unbanip XX.XX.XX.XX
Sinon elle sera automatiquement débannie dans 8 heures.

Si vous avez bien reçu le message dans Jeedom, votre configuration est opérationnelle, vous recevrez automatiquement un nouveau message à chaque fois que Fail2Ban bannira une adresse IP.

La suite du tutoriel est facultative…

4)_Simuler une tentative d’attaque
:warning: Il est conseillé d’utiliser un proxy ou un VPN qui permet de changer d’adresse IP afin de ne pas s’auto-bannir bien qu’on puisse toujours se débannir manuellement. Dans tous les cas, prévoyez un accès SSH à votre serveur depuis une adresse IP locale qui ne peut pas être bannie (https://github.com/jeedom/core/blob/alpha/install/fail2ban.jeedom.conf#L3). :warning:

Nous allons simplement reproduire ce que font les robots qui scannent des fichiers connus sur nos serveurs à la recherche de failles. Il suffit de surveiller le log http.error pour s’en rendre compte.

Le nombre maximum de tentatives de connexion autorisées par Fail2Ban dans le jail [apache-multiport] est de 3 (https://github.com/jeedom/core/blob/alpha/install/fail2ban.jeedom.conf#L24).
Nous allons donc effectuer 3 requêtes curl sur des dossiers « bidons » afin d’être banni :
curl https://#DOMAIN_NAME#/ztp
curl https://#DOMAIN_NAME#/owa
curl https://#DOMAIN_NAME#/ecp

Vous devriez obtenir ceci dans le log http.error :

0000|[Mon Aug 15 20:52:43.362898 2022] [access_compat:error] [pid 13657] [client 149.202.XX.XX:60761] AH01797: client denied by server configuration: /var/www/html/ztp
0001|[Mon Aug 15 20:53:35.441825 2022] [access_compat:error] [pid 12234] [client 149.202.XX.XX:55291] AH01797: client denied by server configuration: /var/www/html/owa
0002|[Mon Aug 15 20:54:13.948591 2022] [access_compat:error] [pid 31006] [client 149.202.XX.XX:52331] AH01797: client denied by server configuration: /var/www/html/ecp

Et ceci dans le log de Fail2Ban :


Cela prouve que Fail2Ban fait bien son boulot !

:warning: Si vous vous êtes auto-banni vous ne recevrez pas le message dans Jeedom puisque toutes les requêtes provenant de votre adresse IP seront refusés, un moyen simple de contourner cela est d’utiliser votre adresse IP locale dans le curl du fichier d’action personnalisé. :warning:

Récupérer l’adresse IP bannie dans le log de Fail2Ban et la débannir :
sudo tail -f /var/log/fail2ban.log
sudo fail2ban-client set apache-multiport unbanip XX.XX.XX.XX

:warning: Si l’adresse IP a été banni dans plusieurs jails, il faudra la débannir dans chaque jail. :warning:

Lister les jails actifs :
sudo fail2ban-client status
Lister les adresses IP bannies dans le jail [apache-multiport] :
sudo fail2ban-client status apache-multiport

Vous pouvez aussi utiliser OWASP ZAP qui est un scanner de sécurité d’application Web open source.

5)_Pour aller plus loin
5)a)_Passer les logs Fail2Ban en DEBUG
Si vous rencontrez des problèmes, il peut être utile de passer les logs de Fail2Ban en DEBUG :
sudo nano /etc/fail2ban/fail2ban.local

[DEFAULT]

# Option: loglevel
# Notes.: Set the log level output.
#         CRITICAL
#         ERROR
#         WARNING
#         NOTICE
#         INFO
#         DEBUG
# Values: [ LEVEL ]  Default: INFO
#
loglevel = DEBUG

Sauvegarder le fichier.
Redémarrer Fail2Ban pour charger le nouveau fichier de configuration :
sudo systemctl restart fail2ban

5)b)_Recevoir un mail avec des informations détaillées sur l’IP bannie
Sachez qu’il est également possible de recevoir un mail avec des informations détaillées sur l’adresse IP qui a été banni. Pour cela, il vous faut un client/serveur SMTP configuré et fonctionnel. J’ai choisi d’utiliser msmtp mais vous pouvez utiliser celui de votre choix.

Modifier le fichier jail.local en adaptant les paramètres à votre configuration :
sudo nano /etc/fail2ban/jail.local

[DEFAULT]

# Destination email address used solely for the interpolations in
# jail.{conf,local,d/*} configuration files.
destemail = root@localhost

# Sender email address used solely for some actions
sender = root@<fq-hostname>

# E-mail action. Since 0.8.1 Fail2Ban uses sendmail MTA for the
# mailing. Change mta configuration parameter to mail if you want to
# revert to conventional 'mail'.
mta = sendmail

# ban & send an e-mail with whois report to the destemail.
action = %(action_mw)s
         jeedom

Sauvegarder le fichier.
Redémarrer Fail2Ban pour charger le nouveau fichier de configuration :
sudo systemctl restart fail2ban

Dans mon cas le mail est généré à partir du paramètre actionban de ce fichier : https://github.com/fail2ban/fail2ban/blob/master/config/action.d/sendmail-whois.conf

Exemple d’un mail généré par Fail2Ban avec le service whois :

Hi,

The IP 167.114.102.230 has just been banned by Fail2Ban after
3 attempts against apache-multiport.


Here is more information about 167.114.102.230 :


#
# ARIN WHOIS data and services are subject to the Terms of Use
# available at: https://www.arin.net/resources/registry/whois/tou/
#
# If you see inaccuracies in the results, please report at
# https://www.arin.net/resources/registry/whois/inaccuracy_reporting/
#
# Copyright 1997-2022, American Registry for Internet Numbers, Ltd.
#


NetRange:       167.114.0.0 - 167.114.255.255
CIDR:           167.114.0.0/16
NetName:        OVH-ARIN-8
NetHandle:      NET-167-114-0-0-1
Parent:         NET167 (NET-167-0-0-0-0)
NetType:        Direct Allocation
OriginAS:       AS16276
Organization:   OVH Hosting, Inc. (HO-2)
RegDate:        2014-08-29
Updated:        2014-09-02
Ref:            https://rdap.arin.net/registry/ip/167.114.0.0


OrgName:        OVH Hosting, Inc.
OrgId:          HO-2
Address:        800-1801 McGill College
City:           Montreal
StateProv:      QC
PostalCode:     H3A 2N4
Country:        CA
RegDate:        2011-06-22
Updated:        2017-01-28
Ref:            https://rdap.arin.net/registry/entity/HO-2


OrgTechHandle: NOC11876-ARIN
OrgTechName:   NOC
OrgTechPhone:  +1-855-684-5463 
OrgTechEmail:  noc@ovh.net
OrgTechRef:    https://rdap.arin.net/registry/entity/NOC11876-ARIN

OrgAbuseHandle: ABUSE3956-ARIN
OrgAbuseName:   Abuse
OrgAbusePhone:  +1-855-684-5463 
OrgAbuseEmail:  abuse@ovh.ca
OrgAbuseRef:    https://rdap.arin.net/registry/entity/ABUSE3956-ARIN

RNOCHandle: NOC11876-ARIN
RNOCName:   NOC
RNOCPhone:  +1-855-684-5463 
RNOCEmail:  noc@ovh.net
RNOCRef:    https://rdap.arin.net/registry/entity/NOC11876-ARIN

RAbuseHandle: NOC11876-ARIN
RAbuseName:   NOC
RAbusePhone:  +1-855-684-5463 
RAbuseEmail:  noc@ovh.net
RAbuseRef:    https://rdap.arin.net/registry/entity/NOC11876-ARIN

RTechHandle: NOC11876-ARIN
RTechName:   NOC
RTechPhone:  +1-855-684-5463 
RTechEmail:  noc@ovh.net
RTechRef:    https://rdap.arin.net/registry/entity/NOC11876-ARIN


#
# ARIN WHOIS data and services are subject to the Terms of Use
# available at: https://www.arin.net/resources/registry/whois/tou/
#
# If you see inaccuracies in the results, please report at
# https://www.arin.net/resources/registry/whois/inaccuracy_reporting/
#
# Copyright 1997-2022, American Registry for Internet Numbers, Ltd.
#

Regards,

Fail2Ban

Testé sur Bullseye et Buster.
Sources utilisées :

https://wiki.archlinux.org/title/fail2ban

https://wiki.archlinux.org/title/msmtp

24 « J'aime »

Hello,

J’ai déjà mis un coeur (1/11 à l’instant), et j’ai déjà des questions en attente :wink:

j’attends la fin de la rédaction :wink: n’hésite pas à me prévenir (même en privé) quand le tuto seras opérationnel :wink:

bon week

2 « J'aime »

Salut

Je viens d’essayer sur une VM deb 11 fraichement installée
avec un jeedom fraichement installé (core beta 4.4)

1/ whereis iptables ne donne rien donc pas installé

2/ Après avoir suivi le tuto a la lettre, fail2ban ne redemarre plus
3/ Si je supprime les fichiers créés, fail2ban redemarre

Bonjour,

Je viens de tester sur une fresh install Debian 11 et pas de soucis, les fichiers sont corrects :



Vous avez bien installé iptables ?
Vous êtes sûr de ne pas faire une erreur dans un fichier ? L’indentation est importante !
C’est le premier ou le deuxième fichier qui bloque ?

OK c’est bon !

Merciiiii

Bonsoir,
Hum hum j’ai pourtant suivi à la lettre et vérifié plusieurs fois mais je dois avoir un souci.
Au moment du test :
Sorry but the jail ‹ apache-multiport › does not exist

Bonsoir,

Le jail [apache-multiport] est désactivé dans le fichier de config. de Jeedom :

Ce n’était pas le cas quand j’ai fait le tuto., je vais le modifier.
Donc il faut tester avec un autre jail qui est actif, par exemple :

sudo fail2ban-client set apache-noscript banip XX.XX.XX.XX

:slight_smile:
Merci ça marche mieux, ça ban et déban mais je ne reçois pas de message dans jeedom et là je crois que c’est moi qui n’ai pas compris
dans le jeedom.conf il faut mettre mon api (qui est bien activée) entre les # ou pas ?
Capture d’écran 2023-11-11 à 21.00.30

Sans les #. :wink:

Bon c’est bien ce que j’avais fais.
J’ai mis mon ip à la place de #DOMAIN_NAME# et ma clé api globale à la place de #APIKEY#

Tout semble bon le ban et le déban se passe bien et sans erreur dans le log mais je n’ai pas de message dans le centre de message de ma jeedom. Je merde surement et j’ai un peu honte car depuis aout 2022 il y a dû avoir des pas doués comme moi ?

Il ne faut pas avoir honte, il faut bien apprendre…
Ca donne quoi cette requête directement dans la console SSH :

curl -X POST https://#DOMAIN_NAME#/core/api/jeeApi.php -d "apikey=#APIKEY#" -d "type=message" -d "category=Fail2Ban" --data-urlencode "message=Test"

Et celle là :

curl -X POST http://#JEEDOM_IP#/core/api/jeeApi.php -d "apikey=#APIKEY#" -d "type=message" -d "category=Fail2Ban" --data-urlencode "message=Test"

donne
Failed to connect to 192.168.1.228 port 443: Connexion refusée

donne le message dans le centre de message:
2023-11-11 21:46:16 Fail2Ban Test

Bonjour,

Tu as une livebox ?

Edit : c’était le https :grin:

Vous vous connectez sur une IP locale en HTTPS, ça ne peut pas fonctionner, difficile de dire ce qui ne va pas sans voir la requête, vous utilisez les DNS Jeedom ?

Donc ça fonctionne en local, vous pouvez utiliser cette requête dans jeedom.conf.

J’ai testé de modifier le jeedom.conf en http et ça marche le message arrive bien

Oui, mais pas là je suis sur mon réseau local et sur le même que la jeedom

Quand tu essayes sur ton réseau wifi tu accèdes à ton Jeedom avec le dns ?

Vous pouvez utiliser la requête locale sans soucis puisque la machine s’envoie une requête à elle même.

Pour info

J’ai une livebox fibre

En local port 80 ou DNS Jeedom port 443

Les 2 fonctionnent

La je pense qu’il a mis son adresse ip interne mais a oublié de mettre le port a 80
Ou alors il a une config reseau bizarre

Je posais la question car sur livebox le loopback des fois ça marche des fois non :sweat_smile: