Bonjour,
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.
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
Si il n’est pas installé, installez-le avec :
sudo apt install fail2ban
Vérifier la présence du paquet iptables
:
Si il n’est pas installé, installez-le avec :
sudo apt install iptables
iptables
est remplacé par nftables
dans les dernières versions.
Vérifier la présence du paquet nftables
:
dpkg -s nftables
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/
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 :
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
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).
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 !
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é.
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
Si l’adresse IP a été banni dans plusieurs jails, il faudra la débannir dans chaque jail.
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 :