Comment protéger un serveur Nginx avec Fail2Ban sur Rocky Linux 8

De Get Docs
Aller à :navigation, rechercher

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 Rocky Linux 8 et configurez-le pour surveiller vos journaux Nginx pour les tentatives d'intrusion.

Conditions préalables

Étape 1 - Installation et configuration de Fail2ban

Fail2ban n'est pas disponible dans les dépôts de logiciels par défaut de Rocky. Cependant, il est disponible dans le référentiel EPEL ou Enhanced Packages for Enterprise Linux, qui est couramment utilisé pour les packages tiers sur Red Hat et Rocky Linux. Si vous n'avez pas encore ajouté EPEL à vos sources de packages système, vous pouvez ajouter le référentiel à l'aide de dnf, comme vous installeriez n'importe quel autre paquet :

sudo dnf install epel-release

La dnf Le gestionnaire de packages vérifiera désormais EPEL en plus de vos sources de packages par défaut lors de l'installation d'un nouveau logiciel. Procédez à l'installation de Fail2ban :

sudo dnf 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: disabled
     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. L'éditeur de texte par défaut fourni avec Rocky Linux 8 est vi. vi est un éditeur de texte extrêmement puissant, mais il peut être quelque peu obtus pour les utilisateurs qui manquent d'expérience avec lui. Vous pouvez installer un éditeur plus convivial tel que nano pour éditer les fichiers de configuration sur votre serveur Rocky Linux 8 :

sudo dnf install nano

Maintenant, vous pouvez utiliser nano pour modifier votre fichier de configuration Nginx :

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

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"]
…

À 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

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 Rocky Linux 8.