Comment protéger un serveur Nginx avec Fail2Ban sur Ubuntu 14.04
Introduction
Lors de l'exploitation d'un serveur Web, il est important de mettre en place des mesures de sécurité pour protéger votre site et les utilisateurs. Protéger vos sites Web et vos applications avec des politiques de pare-feu et restreindre l'accès à certaines zones avec une authentification par mot de passe est un excellent point de départ pour sécuriser votre système. Cependant, toute invite de mot de passe accessible au public est susceptible d'attirer des tentatives de force brute de la part d'utilisateurs et de robots malveillants.
La configuration de fail2ban
peut aider à résoudre ce problème. Lorsque les utilisateurs échouent à plusieurs reprises à s'authentifier auprès d'un service (ou à se livrer à d'autres activités suspectes), fail2ban
peut émettre des interdictions temporaires sur l'adresse IP incriminée en modifiant dynamiquement la politique de pare-feu en cours d'exécution. Chaque « prison » fail2ban
fonctionne en vérifiant les journaux écrits par un service pour les modèles qui indiquent des tentatives infructueuses. La configuration de fail2ban
pour surveiller les journaux Nginx est assez facile en utilisant certains des filtres de configuration inclus et certains que nous créerons nous-mêmes.
Dans ce guide, nous allons vous montrer comment installer fail2ban
et le configurer pour surveiller vos journaux Nginx à la recherche de tentatives d'intrusion. Nous utiliserons un serveur Ubuntu 14.04.
Conditions préalables
Avant de commencer, vous devez avoir un serveur Ubuntu 14.04 configuré avec un compte non root. Ce compte doit être configuré avec les privilèges sudo
afin d'émettre des commandes administratives. Pour savoir comment configurer un utilisateur avec les privilèges sudo
, suivez notre guide de configuration initiale du serveur pour Ubuntu 14.04.
Installation de Nginx et configuration de l'authentification par mot de passe
Si vous souhaitez protéger votre serveur Nginx avec fail2ban
, vous avez peut-être déjà un serveur configuré et en cours d'exécution. Sinon, vous pouvez installer Nginx à partir des référentiels par défaut d'Ubuntu en utilisant apt
.
Mettez à jour l'index du package local et installez-le en tapant :
sudo apt-get update sudo apt-get install nginx
Le service fail2ban
est utile pour protéger les points d'entrée de connexion. Pour que cela soit utile pour une installation Nginx, l'authentification par mot de passe doit être implémentée pour au moins un sous-ensemble du contenu sur le serveur. Vous pouvez suivre ce guide pour configurer la protection par mot de passe de votre serveur Nginx.
Installer Fail2Ban
Une fois que votre serveur Nginx est en cours d'exécution et que l'authentification par mot de passe est activée, vous pouvez continuer et installer fail2ban
(nous incluons ici une autre récupération de référentiel au cas où vous auriez déjà configuré Nginx dans les étapes précédentes) :
sudo apt-get update sudo apt-get install fail2ban
Cela installera le logiciel. Par défaut, fail2ban
est configuré pour interdire uniquement les tentatives de connexion SSH infructueuses. Nous devons activer certaines règles qui le configureront pour rechercher dans nos journaux Nginx des modèles indiquant une activité malveillante.
Réglage des paramètres généraux dans Fail2Ban
Pour commencer, nous devons ajuster le fichier de configuration que fail2ban
utilise pour déterminer les journaux d'application à surveiller et les actions à entreprendre lorsque des entrées incriminées sont trouvées. Le fichier /etc/fail2ban/jail.conf
fourni est la principale ressource fournie pour cela.
Pour apporter des modifications, nous devons copier ce fichier dans /etc/fail2ban/jail.local
. Cela empêchera nos modifications d'être écrasées si une mise à jour de package fournit un nouveau fichier par défaut :
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
Ouvrez le fichier nouvellement copié afin que nous puissions configurer notre surveillance des journaux Nginx :
sudo nano /etc/fail2ban/jail.local
Modification des valeurs par défaut
Nous devrions commencer par évaluer les valeurs par défaut définies dans le fichier pour voir si elles répondent à nos besoins. Ceux-ci se trouvent dans la section [DEFAULT]
du fichier. Ces éléments définissent la politique générale et peuvent chacun être remplacés dans des prisons spécifiques.
L'un des premiers éléments à examiner est la liste des clients qui ne sont pas soumis aux politiques fail2ban
. Ceci est défini par la directive ignoreip
. 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 si vous êtes en mesure de maintenir l'accès au shell, car vous pouvez toujours annuler manuellement l'interdiction. Vous pouvez 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 d'un acteur malveillant, tout en étant suffisamment courte pour permettre aux utilisateurs légitimes de rectifier les erreurs. Par défaut, il est défini sur 600 secondes (10 minutes). Augmentez ou diminuez cette valeur comme bon vous semble :
/etc/fail2ban/jail.local
[DEFAULT] . . . bantime = 3600
Les deux éléments suivants déterminent la portée des lignes de journal utilisées pour déterminer un client incriminé. Le findtime
spécifie une durée en secondes et la directive maxretry
indique le nombre de tentatives à tolérer dans ce délai. Si un client fait plus de maxretry
tentatives dans le délai défini par findtime
, il sera banni :
/etc/fail2ban/jail.local
[DEFAULT] . . . findtime = 3600 # These lines combine to ban clients that fail maxretry = 6 # to authenticate 6 times within a half hour.
Configuration des notifications par e-mail (facultatif)
Vous pouvez activer les notifications par e-mail si vous souhaitez recevoir un e-mail chaque fois qu'une interdiction a lieu. Pour ce faire, 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 ce guide.
Une fois que vous avez configuré votre MTA, vous devrez ajuster certains paramètres supplémentaires dans la section [DEFAULT]
du fichier /etc/fail2ban/jail.local
. Commencez par définir la directive mta
. Si vous configurez Postfix, comme le montre le tutoriel ci-dessus, changez cette valeur en "mail":
/etc/fail2ban/jail.local
[DEFAULT] . . . mta = mail
Vous devez sélectionner l'adresse e-mail à laquelle les notifications seront envoyées. Modifiez la directive destemail
avec cette valeur. La directive sendername
permet de modifier le champ « Expéditeur » dans les emails de notification :
/etc/fail2ban/jail.local
[DEFAULT] . . . destemail = [email protected] sendername = Fail2BanAlerts
Dans le langage fail2ban
, une "action" est la procédure suivie lorsqu'un client échoue trop souvent à l'authentification. L'action par défaut (appelée action_
) consiste simplement à bannir l'adresse IP du port en question. Cependant, il existe deux autres actions prédéfinies qui peuvent être utilisées si vous avez configuré la messagerie.
Vous pouvez utiliser l'action action_mw
pour bannir le client et envoyer une notification par e-mail à votre compte configuré avec un rapport "whois" sur l'adresse incriminée. Vous pouvez également utiliser l'action action_mwl
, qui fait la même chose, mais inclut également les lignes de journal incriminées qui ont déclenché l'interdiction :
/etc/fail2ban/jail.local
[DEFAULT] . . . action = %(action_mwl)s
Configuration de Fail2Ban pour surveiller les journaux Nginx
Maintenant que vous avez mis en place certains des paramètres généraux fail2ban
, nous pouvons nous concentrer sur l'activation de certaines prisons spécifiques à Nginx qui surveilleront les journaux de notre serveur Web pour des modèles de comportement 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 section [DEFAULT]
indique la configuration d'une prison spécifique). Par défaut, seule la jail [ssh]
est activée.
Pour activer la surveillance des journaux pour les tentatives de connexion Nginx, nous allons activer la prison [nginx-http-auth]
. Modifiez la directive enabled
dans cette section afin qu'elle se lise "true" :
/etc/fail2ban/jail.local
[nginx-http-auth] enabled = true filter = nginx-http-auth port = http,https logpath = /var/log/nginx/error.log . . .
Il s'agit de la seule prison spécifique à Nginx incluse avec le package fail2ban
d'Ubuntu. Cependant, nous pouvons créer nos propres prisons pour ajouter des fonctionnalités supplémentaires. L'inspiration et certains des détails de mise en œuvre de ces prisons supplémentaires sont venus de ici et ici.
Nous pouvons créer une prison [nginx-noscript]
pour interdire les clients qui recherchent des scripts sur le site Web à exécuter et à exploiter. Si vous n'utilisez pas PHP ou tout autre langage en conjonction avec votre serveur web, vous pouvez ajouter cette prison pour bannir ceux qui demandent ces types de ressources :
/etc/fail2ban/jail.local
[nginx-noscript] enabled = true port = http,https filter = nginx-noscript logpath = /var/log/nginx/access.log maxretry = 6 . . .
Nous pouvons ajouter une section appelée [nginx-badbots]
pour arrêter certains modèles de requêtes de robots malveillants connus :
/etc/fail2ban/jail.local
[nginx-badbots] enabled = true port = http,https filter = nginx-badbots logpath = /var/log/nginx/access.log maxretry = 2
Si vous n'utilisez pas Nginx pour fournir un accès au contenu Web dans les répertoires personnels des utilisateurs, vous pouvez interdire les utilisateurs qui demandent ces ressources en ajoutant une prison [nginx-nohome]
:
/etc/fail2ban/jail.local
[nginx-nohome] enabled = true port = http,https filter = nginx-nohome logpath = /var/log/nginx/access.log maxretry = 2
Nous devrions interdire les clients qui tentent d'utiliser notre serveur Nginx comme proxy ouvert. Nous pouvons ajouter une prison [nginx-noproxy]
pour répondre à ces requêtes :
/etc/fail2ban/jail.local
[nginx-noproxy] enabled = true port = http,https filter = nginx-noproxy logpath = /var/log/nginx/access.log maxretry = 2
Lorsque vous avez terminé d'apporter les modifications dont vous avez besoin, enregistrez et fermez le fichier. Nous devons maintenant ajouter les filtres pour les prisons que nous avons créées.
Ajout des filtres pour les prisons Nginx supplémentaires
Nous avons mis à jour le fichier /etc/fail2ban/jail.local
avec des spécifications de prison supplémentaires pour correspondre et interdire un plus grand nombre de mauvais comportements. Nous devons créer les fichiers de filtre pour les prisons que nous avons créées. Ces fichiers de filtre spécifieront les modèles à rechercher dans les journaux Nginx.
Commencez par passer au répertoire des filtres :
cd /etc/fail2ban/filter.d
Nous voulons en fait commencer par ajuster le filtre d'authentification Nginx pré-fourni pour qu'il corresponde à un modèle de journal d'échec de connexion supplémentaire. Ouvrez le fichier pour le modifier :
sudo nano nginx-http-auth.conf
Sous la spécification failregex
, ajoutez un motif supplémentaire. Cela correspondra aux lignes où l'utilisateur n'a entré ni nom d'utilisateur ni mot de passe :
/etc/fail2ban/filter.d/nginx-http-auth.conf
[Definition] failregex = ^ \[error\] \d+#\d+: \*\d+ user "\S+":? (password mismatch|was not found in ".*"), client: <HOST>, server: \S+, request: "\S+ \S+ HTTP/\d+\.\d+", host: "\S+"\s*$ ^ \[error\] \d+#\d+: \*\d+ no user/password was provided for basic authentication, client: <HOST>, server: \S+, request: "\S+ \S+ HTTP/\d+\.\d+", host: "\S+"\s*$ ignoreregex =
Enregistrez et fermez le fichier lorsque vous avez terminé.
Ensuite, nous pouvons copier le fichier apache-badbots.conf
à utiliser avec Nginx. Nous pouvons utiliser ce fichier tel quel, mais nous le copierons sous un nouveau nom pour plus de clarté. Cela correspond à la façon dont nous avons référencé le filtre dans la configuration de la prison :
sudo cp apache-badbots.conf nginx-badbots.conf
Ensuite, nous allons créer un filtre pour notre jail [nginx-noscript]
:
sudo nano nginx-noscript.conf
Collez la définition suivante à l'intérieur. N'hésitez pas à ajuster les suffixes de script pour supprimer les fichiers de langue que votre serveur utilise légitimement ou pour ajouter des suffixes supplémentaires :
/etc/fail2ban/filter.d/nginx-noscript.conf
[Definition] failregex = ^<HOST> -.*GET.*(\.php|\.asp|\.exe|\.pl|\.cgi|\.scgi) ignoreregex =
Enregistrez et fermez le fichier.
Ensuite, créez un filtre pour la prison [nginx-nohome]
:
sudo nano nginx-nohome.conf
Placez les informations de filtre suivantes dans le fichier :
/etc/fail2ban/filter.d/nginx-nohome.conf
[Definition] failregex = ^<HOST> -.*GET .*/~.* ignoreregex =
Enregistrez et fermez le fichier lorsque vous avez terminé.
Enfin, nous pouvons créer le filtre pour la prison [nginx-noproxy]
:
sudo nano nginx-noproxy.conf
Cette définition de filtre correspondra aux tentatives d'utilisation de votre serveur en tant que proxy :
/etc/fail2ban/filter.d/nginx-noproxy.conf
[Definition] failregex = ^<HOST> -.*GET http.* ignoreregex =
Enregistrez et fermez le fichier lorsque vous avez terminé.
Activer vos prisons Nginx
Pour mettre en œuvre vos modifications de configuration, vous devrez redémarrer le service fail2ban
. Vous pouvez le faire en tapant :
sudo service fail2ban restart
Le service devrait redémarrer, mettant en œuvre les différentes politiques d'interdiction que vous avez configurées.
Obtenir des informations sur les prisons activées
Vous pouvez voir toutes vos prisons activées en utilisant la commande fail2ban-client
:
sudo fail2ban-client status
Vous devriez voir une liste de toutes les prisons que vous avez activées :
OutputStatus |- Number of jail: 6 `- Jail list: nginx-noproxy, nginx-noscript, nginx-nohome, nginx-http-auth, nginx-badbots, ssh
Vous pouvez regarder iptables
pour voir que fail2ban
a modifié vos règles de pare-feu pour créer un cadre pour interdire les clients. Même sans règles de pare-feu précédentes, vous auriez maintenant un cadre activé qui permet fail2ban
d'interdire sélectivement les clients en les ajoutant à des chaînes spécialement conçues :
sudo iptables -S
Output-P INPUT ACCEPT -P FORWARD ACCEPT -P OUTPUT ACCEPT -N fail2ban-nginx-badbots -N fail2ban-nginx-http-auth -N fail2ban-nginx-nohome -N fail2ban-nginx-noproxy -N fail2ban-nginx-noscript -N fail2ban-ssh -A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-nginx-noproxy -A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-nginx-nohome -A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-nginx-badbots -A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-nginx-noscript -A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-nginx-http-auth -A INPUT -p tcp -m multiport --dports 22 -j fail2ban-ssh -A fail2ban-nginx-badbots -j RETURN -A fail2ban-nginx-http-auth -j RETURN -A fail2ban-nginx-nohome -j RETURN -A fail2ban-nginx-noproxy -j RETURN -A fail2ban-nginx-noscript -j RETURN -A fail2ban-ssh -j RETURN
Si vous voulez voir les détails des interdictions appliquées par n'importe quelle prison, il est probablement plus facile d'utiliser à nouveau le fail2ban-client
:
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
Test des politiques Fail2Ban
Il est important de tester vos stratégies fail2ban
pour vous assurer qu'elles bloquent le trafic comme prévu. Par exemple, pour l'invite d'authentification Nginx, vous pouvez donner plusieurs fois des informations d'identification incorrectes. Après avoir dépassé la limite, vous devriez être banni et incapable d'accéder au site. Si vous configurez des notifications par e-mail, vous devriez voir des messages concernant l'interdiction dans le compte de messagerie que vous avez fourni.
Si vous regardez le statut avec la commande 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 | |- File list: /var/log/nginx/error.log | |- Currently failed: 0 | `- Total failed: 12 `- action |- Currently banned: 1 | `- IP list: 111.111.111.111 `- Total banned: 1
Lorsque vous êtes convaincu que vos règles fonctionnent, vous pouvez débloquer manuellement votre adresse IP avec le fail2ban-client
en tapant :
sudo fail2ban-client set nginx-http-auth unbanip 111.111.111.111
Vous devriez maintenant pouvoir tenter une nouvelle authentification.
Conclusion
La configuration de fail2ban
pour protéger votre serveur Nginx est assez simple dans le cas le plus simple. Cependant, 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 dans le fichier /etc/fail2ban/jail.local
, et les fichiers dont il dépend dans les répertoires /etc/fail2ban/filter.d
et /etc/fail2ban/action.d
, vous pouvez trouver de nombreux éléments à modifier et changer à mesure que vos besoins évoluent. Apprendre les bases de la protection de votre serveur avec fail2ban
peut vous fournir une grande sécurité avec un minimum d'effort.
Si vous souhaitez en savoir plus sur fail2ban
, consultez les liens suivants :