Comment protéger un serveur Nginx avec Fail2Ban sur Ubuntu 22.04
Introduction
Lors de la configuration d'un serveur Web, il existe souvent des sections du site auxquelles vous souhaitez restreindre l'accès. Les applications Web fournissent souvent leurs propres méthodes d'authentification et d'autorisation, mais le serveur Web lui-même peut être utilisé pour restreindre l'accès si celles-ci sont inadéquates ou indisponibles. Cependant, l'authentification du serveur Web représente également une surface d'attaque ou vecteur d'attaque très prévisible à travers laquelle les gens peuvent tenter d'accéder.
Tout service exposé au réseau est une cible potentielle de cette manière. Si vous examinez les journaux d'un serveur Web à fort trafic, vous verrez souvent des tentatives de connexion répétées et systématiques qui représentent des attaques par force brute de la part des utilisateurs et des bots.
Les déploiements de production à grande échelle pour lesquels cette responsabilité est totalement inacceptable mettront généralement en œuvre un VPN tel que WireGuard devant tout point de terminaison privé, de sorte qu'il est impossible de se connecter directement à ces URL depuis l'Internet extérieur sans autre abstraction logicielle ou passerelles. Ces solutions VPN sont largement approuvées, mais ajouteront de la complexité et peuvent casser certaines automatisations ou autres petits crochets logiciels.
Avant ou en plus de vous engager dans une configuration VPN complète, vous pouvez implémenter un outil appelé Fail2ban. Fail2ban peut considérablement atténuer les attaques par force brute en créant des règles qui modifient automatiquement la configuration de votre pare-feu pour interdire des adresses IP spécifiques après un certain nombre de tentatives de connexion infructueuses. Cela permettra à votre serveur de se prémunir contre ces tentatives d'accès sans intervention de votre part.
Dans ce guide, vous apprendrez à installer fail2ban
sur un serveur Ubuntu 22.04 et configurez-le pour surveiller vos journaux Nginx pour les tentatives d'intrusion.
Conditions préalables
- Accès à un environnement de serveur Ubuntu 22.04 avec un utilisateur non root avec
sudo
privilèges pour effectuer des tâches administratives. Pour savoir comment créer un tel utilisateur, suivez le Guide de configuration initiale du serveur Ubuntu 22.04. - Nginx installé sur votre système, en suivant les Étapes 1 et 2 de ce guide sur comment installer Nginx sur Ubuntu 22.04.
- Nginx est installé et configuré avec l'authentification par mot de passe en suivant Comment configurer l'authentification par mot de passe avec Nginx sur Ubuntu 22.04.
Étape 1 - Installation et configuration de Fail2ban
Fail2ban est disponible dans les dépôts de logiciels d'Ubuntu. Commencez par exécuter les commandes suivantes en tant qu'utilisateur non root pour mettre à jour vos listes de packages et installer Fail2ban :
sudo apt update sudo apt install fail2ban
Fail2ban mettra automatiquement en place un service d'arrière-plan après avoir été installé. Cependant, il est désactivé par défaut, car certains de ses paramètres par défaut peuvent provoquer des effets indésirables. Vous pouvez le vérifier en utilisant le systemctl
commande:
systemctl status fail2ban.service
Output○ fail2ban.service - Fail2Ban Service Loaded: loaded (/lib/systemd/system/fail2ban.service; disabled; vendor preset: enabled Active: inactive (dead) Docs: man:fail2ban(1)
Vous pouvez activer Fail2ban tout de suite, mais d'abord, vous passerez en revue certaines de ses fonctionnalités.
Le service fail2ban conserve ses fichiers de configuration dans le /etc/fail2ban
annuaire. Il existe un fichier avec les valeurs par défaut appelé jail.conf
. Allez dans ce répertoire et imprimez les 20 premières lignes de ce fichier en utilisant head -20
:
cd /etc/fail2ban head -20 jail.conf
Output# # WARNING: heavily refactored in 0.9.0 release. Please review and # customize settings for your setup. # # Changes: in most of the cases you should not modify this # file, but provide customizations in jail.local file, # or separate .conf files under jail.d/ directory, e.g.: # # HOW TO ACTIVATE JAILS: # # YOU SHOULD NOT MODIFY THIS FILE. # # It will probably be overwritten or improved in a distribution update. # # Provide customizations in a jail.local file or a jail.d/customisation.local. # For example to change the default bantime for all jails and to enable the # ssh-iptables jail the following (uncommented) would appear in the .local file. # See man 5 jail.conf for details. # # [DEFAULT]
Comme vous le verrez, les premières lignes de ce fichier sont commentées - elles commencent par #
caractères indiquant qu'ils doivent être lus comme documentation plutôt que comme paramètres. Comme vous le verrez également, ces commentaires vous demandent de ne pas modifier directement ce fichier. Au lieu de cela, vous avez deux options : soit créer des profils individuels pour Fail2ban dans plusieurs fichiers au sein du jail.d/
répertoire, ou créez et collectez tous vos paramètres locaux dans un jail.local
dossier. La jail.conf
sera périodiquement mis à jour au fur et à mesure que Fail2ban lui-même est mis à jour, et sera utilisé comme source de paramètres par défaut pour lesquels vous n'avez créé aucun remplacement.
Dans ce didacticiel, vous allez créer jail.local
. Vous pouvez le faire en copiant jail.conf
:
sudo cp jail.conf jail.local
Vous pouvez maintenant commencer à modifier la configuration. Ouvrez le fichier dans nano
ou votre éditeur de texte préféré :
sudo nano jail.local
Modification des valeurs par défaut
Vous commencerez par évaluer les valeurs par défaut définies dans le fichier. Ceux-ci se trouveront sous le [DEFAULT]
section dans le fichier. Ces éléments définissent la stratégie générale et peuvent être remplacés pour chaque application. Si vous utilisez nano
, vous pouvez effectuer une recherche dans le fichier en appuyant sur Ctrl+W
, en saisissant une chaîne de recherche, puis en appuyant sur Entrée.
L'un des premiers éléments à examiner est la liste des clients qui ne sont pas assujettis à la fail2ban
Stratégies. Celle-ci est fixée par le ignoreip
directif. C'est parfois une bonne idée d'ajouter votre propre adresse IP ou réseau à la liste des exceptions pour éviter de vous enfermer. C'est moins un problème avec les connexions au serveur Web qu'avec SSH, car si vous êtes en mesure de maintenir l'accès au shell, vous pouvez toujours annuler une interdiction. Vous pouvez décommenter cette ligne et ajouter des adresses IP ou des réseaux supplémentaires délimités par un espace, à la liste existante :
/etc/fail2ban/jail.local
[DEFAULT] . . . #ignoreip = 127.0.0.1/8 your_home_IP
Un autre élément que vous voudrez peut-être ajuster est le bantime
, qui contrôle le nombre de secondes pendant lesquelles un membre fautif est banni. Il est idéal de définir une durée suffisamment longue pour perturber les efforts malveillants et automatisés, tout en étant suffisamment courte pour permettre aux utilisateurs de corriger les erreurs. Par défaut, il est défini sur 10 minutes. Vous pouvez augmenter ou diminuer cette valeur :
/etc/fail2ban/jail.local
[DEFAULT] . . . bantime = 10m
Les deux éléments suivants déterminent la portée des lignes de journal utilisées pour déterminer un client incriminé. La findtime
spécifie une durée en secondes et le maxretry
directive indique le nombre de tentatives à tolérer dans ce délai. Si un client gagne plus de maxretry
tentatives dans le délai fixé par findtime
, ils seront interdits :
/etc/fail2ban/jail.local
[DEFAULT] . . . findtime = 10m maxretry = 5
Configuration des notifications par e-mail (facultatif)
Vous pouvez éventuellement activer les notifications par e-mail pour recevoir des e-mails chaque fois qu'une interdiction a lieu. Vous devrez d'abord configurer un MTA sur votre serveur afin qu'il puisse envoyer des e-mails. Pour apprendre à utiliser Postfix pour cette tâche, suivez Comment installer et configurer Postfix sur Ubuntu 22.04.
Une fois que vous avez configuré votre MTA, vous devrez ajuster certains paramètres supplémentaires dans le [DEFAULT]
partie de la /etc/fail2ban/jail.local
dossier. Commencez par régler le mta
directif. Si vous configurez Postfix, comme le montre le tutoriel ci-dessus, changez cette valeur en "mail":
/etc/fail2ban/jail.local
[DEFAULT] . . . mta = mail
Indiquez l'adresse e-mail qui recevra le courrier dans le destemail
champ. La sender
L'option configure l'adresse à partir de laquelle le courrier sera envoyé et doit être compatible avec votre configuration Postfix :
/etc/fail2ban/jail.local
[DEFAULT] . . . destemail = [email protected] sendername = root@<fq-hostname>
La action
paramètre configure l'action que Fail2ban prend lorsqu'il veut instituer une interdiction. La valeur action_
est défini dans le fichier juste avant ce paramètre. L'action par défaut consiste à mettre à jour la configuration de votre pare-feu pour rejeter le trafic de l'hôte incriminé jusqu'à ce que le délai d'interdiction soit écoulé.
/etc/fail2ban/jail.local
[DEFAULT] . . . action = $(action_)s . . .
Il y a d'autres action_
scripts fournis par défaut que vous pouvez remplacer $(action_)
avec ci-dessus :
/etc/fail2ban/jail.local
… # ban & send an e-mail with whois report to the destemail. action_mw = %(action_)s %(mta)s-whois[sender="%(sender)s", dest="%(destemail)s", protocol="%(protocol)s", chain="%(chain)s"] # ban & send an e-mail with whois report and relevant log lines # to the destemail. action_mwl = %(action_)s %(mta)s-whois-lines[sender="%(sender)s", dest="%(destemail)s", logpath="%(logpath)s", chain="%(chain)s"] …
Tous les deux action_mw
et action_mwl
gérera l'envoi des e-mails en utilisant la configuration que vous avez fournie. À l'étape suivante, vous passerez à la configuration spécifique à Nginx.
Étape 2 - Configuration de Fail2Ban pour surveiller les journaux Nginx
Maintenant que vous avez une partie du général fail2ban
paramètres en place, vous pouvez activer certaines prisons spécifiques à Nginx qui surveilleront les journaux de votre serveur Web pour des modèles spécifiques.
Chaque prison dans le fichier de configuration est marquée par un en-tête contenant le nom de la prison entre crochets - chaque section sauf la [DEFAULT]
La section indique la configuration d'une prison spécifique. Par défaut, seul le [ssh]
la prison est activée.
Pour activer la surveillance des journaux pour les tentatives de connexion Nginx, activez le [nginx-http-auth]
prison. Ajouter un enabled = true
directive dans cette section :
/etc/fail2ban/jail.local
… [nginx-http-auth] enabled = true port = http,https logpath = %(nginx_error_log)s . . .
Lorsque vous avez terminé d'apporter des modifications, enregistrez et fermez le fichier. Si vous utilisez nano
, presse Ctrl+X
, puis lorsque vous y êtes invité, Y
puis Entrée. Ensuite, vous passerez en revue la configuration du filtre pour nginx-http-auth
.
Étape 3 - Examen des filtres pour les prisons Nginx
Vous avez peut-être remarqué que le [nginx-http-auth]
bloquer dans jail.local
ne contient aucune règle spécifique à Nginx. Ces règles ne sont pas automatiquement codées en dur dans Fail2ban - en fait, le [nginx-http-auth]
l'en-tête correspond directement à un nom de fichier à l'intérieur de Fail2ban filter.d
répertoire de filtres préemballés. Si vous répertoriez le contenu de ce répertoire, vous pouvez voir les autres filtres prépackagés disponibles, si vous avez besoin de les utiliser :
ls /etc/fail2ban/filter.d
Output3proxy.conf freeswitch.conf proftpd.conf apache-auth.conf froxlor-auth.conf pure-ftpd.conf apache-badbots.conf gitlab.conf qmail.conf apache-botsearch.conf grafana.conf recidive.conf apache-common.conf groupoffice.conf roundcube-auth.conf apache-fakegooglebot.conf gssftpd.conf scanlogd.conf apache-modsecurity.conf guacamole.conf screensharingd.conf apache-nohome.conf haproxy-http-auth.conf selinux-common.conf apache-noscript.conf horde.conf selinux-ssh.conf apache-overflows.conf ignorecommands sendmail-auth.conf apache-pass.conf kerio.conf sendmail-reject.conf apache-shellshock.conf lighttpd-auth.conf sieve.conf assp.conf mongodb-auth.conf slapd.conf asterisk.conf monit.conf softethervpn.conf bitwarden.conf murmur.conf sogo-auth.conf …
Pour l'instant, jetez un oeil à nginx-http-auth.conf
:
cat /etc/fail2ban/filter.d/nginx-http-auth.conf
Output# fail2ban filter configuration for nginx [Definition] failregex = ^ \[error\] \d+#\d+: \*\d+ user "(?:[^"]+|.*?)":? (?:password mismatch|was not found in "[^\"]*"), client: <HOST>, server: \S*, request: "\S+ \S+ HTTP/\d+\.\d+", host: "\S+"(?:, referrer: "\S+")?\s*$ ignoreregex = datepattern = {^LN-BEG} …
Ces fichiers contiennent des expressions régulières (un raccourci courant pour l'analyse de texte) qui déterminent si une ligne du journal est une tentative d'authentification ayant échoué. Ils peuvent être modifiés directement selon les besoins.
Dans les étapes suivantes, vous allez activer et tester Fail2ban.
Étape 4 - Activer vos prisons Nginx
À ce stade, vous pouvez activer votre service Fail2ban afin qu'il s'exécute automatiquement à partir de maintenant. Première exécution systemctl enable
:
sudo systemctl enable fail2ban
Ensuite, démarrez-le manuellement pour la première fois avec systemctl start
:
sudo systemctl start fail2ban
Vous pouvez vérifier qu'il fonctionne avec systemctl status
:
sudo systemctl status fail2ban
Output● fail2ban.service - Fail2Ban Service Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled; vendor preset: enabled Active: active (running) since Fri 2022-07-08 17:19:38 UTC; 7s ago Docs: man:fail2ban(1) Main PID: 5962 (fail2ban-server) Tasks: 7 (limit: 2327) Memory: 12.6M CPU: 195ms CGroup: /system.slice/fail2ban.service └─5962 /usr/bin/python3 /usr/bin/fail2ban-server -xf start
Remarque : Pour mettre en œuvre toute modification future de la configuration, vous devrez redémarrer le fail2ban
service. Vous pouvez le faire en utilisant sudo systemctl restart fail2ban
Obtenir des informations sur les prisons activées
Vous pouvez voir toutes vos prisons activées en utilisant le fail2ban-client
commande:
sudo fail2ban-client status
Vous devriez voir une liste des prisons activées :
OutputStatus |- Number of jail: 2 `- Jail list: nginx-http-auth, sshd
Si vous voulez voir les détails des interdictions appliquées par une prison, utilisez le fail2ban-client
encore:
sudo fail2ban-client status nginx-http-auth
OutputStatus for the jail: nginx-http-auth |- filter | |- File list: /var/log/nginx/error.log | |- Currently failed: 0 | `- Total failed: 0 `- action |- Currently banned: 0 | `- IP list: `- Total banned: 0
Dans la dernière étape de ce didacticiel, vous testerez délibérément votre bannissement pour vérifier que votre configuration Fail2ban fonctionne.
Étape 5 - Test des politiques Fail2Ban
Il est important de tester vos politiques Fail2ban pour vous assurer qu'elles bloquent le trafic comme prévu. Pour ce faire, accédez à votre serveur dans un navigateur Web local. À l'invite d'authentification Nginx, saisissez à plusieurs reprises des informations d'identification incorrectes. Après plusieurs tentatives, le serveur devrait cesser complètement de vous répondre, comme si votre connexion était interrompue :
Si vous regardez l'état de la nginx-http-auth
configurer avec fail2ban-client
, vous verrez votre adresse IP bannie du site :
sudo fail2ban-client status nginx-http-auth
OutputStatus for the jail: nginx-http-auth |- Filter | |- Currently failed: 0 | |- Total failed: 5 | `- File list: /var/log/nginx/error.log `- Actions |- Currently banned: 1 |- Total banned: 1 `- Banned IP list: 108.172.85.62
Vous pouvez également voir la nouvelle règle en vérifiant votre iptables
production. iptables
est une commande permettant d'interagir avec les règles de port et de pare-feu de bas niveau sur votre serveur. Si vous avez suivi le guide de DigitalOcean pour la configuration initiale du serveur, vous utiliserez ufw
pour gérer les règles de pare-feu à un niveau supérieur. Fonctionnement iptables -S
vous montrera toutes les règles de pare-feu qui ufw
déjà créé :
sudo iptables -S
Output-P INPUT DROP -P FORWARD DROP -P OUTPUT ACCEPT -N f2b-nginx-http-auth -N ufw-after-forward -N ufw-after-input -N ufw-after-logging-forward -N ufw-after-logging-input -N ufw-after-logging-output -N ufw-after-output -N ufw-before-forward -N ufw-before-input -N ufw-before-logging-forward -N ufw-before-logging-input -N ufw-before-logging-output …
Si vous redirigez la sortie de iptables -S
à grep
pour rechercher dans ces règles la chaîne f2b
, vous pouvez voir les règles ajoutées par fail2ban :
sudo iptables -S | grep f2b
Output-N f2b-nginx-http-auth -A INPUT -p tcp -m multiport --dports 80,443 -j f2b-nginx-http-auth -A f2b-nginx-http-auth -s 108.172.85.62/32 -j REJECT --reject-with icmp-port-unreachable -A f2b-nginx-http-auth -j RETURN
La ligne contenant REJECT --reject-with icmp-port-unreachable
a été ajouté par Fail2ban et doit refléter l'adresse IP de votre machine locale. Lorsque vous êtes convaincu que vos règles fonctionnent, vous pouvez manuellement dé-bannir votre adresse IP avec le fail2ban-client
en tappant:
sudo fail2ban-client set nginx-http-auth unbanip 108.172.85.62
Vous devriez maintenant pouvoir tenter une nouvelle authentification.
Conclusion
Fail2ban offre une grande flexibilité pour construire des politiques qui répondront à vos besoins de sécurité spécifiques. En examinant les variables et les modèles au sein du /etc/fail2ban/jail.local
fichier et les fichiers dont il dépend dans le /etc/fail2ban/filter.d
et /etc/fail2ban/action.d
répertoires, vous pouvez trouver de nombreux éléments à peaufiner et à modifier au fur et à mesure que vos besoins évoluent. Protégez votre serveur avec fail2ban
peut vous fournir une base de sécurité utile.
Pour découvrir d'autres façons d'utiliser fail2ban
, consultez Comment Fail2Ban fonctionne pour protéger les services sur un serveur Linux et Comment protéger SSH avec Fail2Ban sur Ubuntu 22.04.