Comment protéger un serveur Nginx avec Fail2Ban sur Ubuntu 14.04

introduction

Lorsque vous utilisez un serveur Web, il est important de mettre en œuvre des mesures de sécurité pour protéger votre site et vos utilisateurs. La protection de vos sites Web et de vos applications à l'aide de stratégies de pare-feu et la restriction de l'accès à certaines zones grâce à l'authentification par mot de passe constituent 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 les tentatives de force brute d'utilisateurs malveillants et de robots.

La configuration defail2ban peut aider à atténuer ce problème. Lorsque les utilisateurs échouent à plusieurs reprises à s'authentifier auprès d'un service (ou à s'engager dans une autre activité suspecte),fail2ban peut émettre des interdictions temporaires sur l'adresse IP incriminée en modifiant dynamiquement la stratégie de pare-feu en cours d'exécution. Chaque «prison» defail2ban fonctionne en vérifiant les journaux écrits par un service pour les modèles qui indiquent des tentatives infructueuses. Configurerfail2ban pour surveiller les journaux Nginx est assez facile en utilisant certains des filtres de configuration inclus et certains que nous allons créer nous-mêmes.

Dans ce guide, nous montrerons comment installerfail2ban et le configurer pour surveiller vos journaux Nginx pour les tentatives d'intrusion. Nous allons utiliser 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ègessudo afin d'émettre des commandes administratives. Pour savoir comment configurer un utilisateur avec les privilègessudo, suivez nosinitial server setup guide for Ubuntu 14.04.

Installation de Nginx et configuration de l'authentification par mot de passe

Si vous souhaitez protéger votre serveur Nginx avecfail2ban, 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 utilisantapt.

Mettez à jour l'index de package local et installez-le en tapant:

sudo apt-get update
sudo apt-get install nginx

Le servicefail2ban 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 suivrethis guide pour configurer la protection par mot de passe pour 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 installerfail2ban (nous incluons une autre récupération de référentiel ici 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 ayant échoué. Nous devons activer certaines règles qui le configureront pour vérifier dans nos journaux Nginx des modèles indiquant une activité malveillante.

Ajuster les paramètres généraux dans Fail2Ban

Pour commencer, nous devons ajuster le fichier de configuration quefail2ban 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 évitera que nos modifications ne soient écrasées si une mise à jour du package fournit un nouveau fichier par défaut:

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

Ouvrez le fichier récemment copié afin que nous puissions configurer notre surveillance de journal Nginx:

sudo nano /etc/fail2ban/jail.local

Changer les valeurs par défaut

Nous devrions commencer par évaluer les valeurs par défaut définies dans le fichier pour voir si elles correspondent à 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 jails spécifiques.

L'un des premiers éléments à examiner est la liste des clients qui ne sont pas soumis aux politiquesfail2ban. Ceci est défini par la directiveignoreip. Il est parfois utile d’ajouter votre propre adresse IP ou réseau à la liste des exceptions pour éviter de vous verrouiller. Cela pose moins de problèmes avec les connexions au serveur Web, même si vous pouvez conserver un 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 souhaiterez peut-être ajuster est lebantime, 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, ce paramètre 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 l'étendue des lignes de journal utilisées pour déterminer un client fautif. Lefindtime spécifie une durée en secondes et la directivemaxretry indique le nombre de tentatives à tolérer dans ce délai. Si un client fait plus demaxretry tentatives dans le laps de temps défini parfindtime, 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 courrier (facultatif)

Vous pouvez activer les notifications par courrier électronique si vous souhaitez recevoir un courrier électronique chaque fois qu'une interdiction a lieu. Pour ce faire, vous devez d'abord configurer un MTA sur votre serveur afin qu'il puisse envoyer un courrier électronique. Pour savoir comment utiliser Postfix pour cette tâche, suivezthis guide.

Une fois votre MTA configuré, vous devrez ajuster certains paramètres supplémentaires dans la section[DEFAULT] du fichier/etc/fail2ban/jail.local. Commencez par définir la directivemta. Si vous configurez Postfix, comme le montre le didacticiel ci-dessus, remplacez cette valeur par «mail»:

/etc/fail2ban/jail.local

[DEFAULT]

. . .
mta = mail

Vous devez sélectionner l'adresse électronique à laquelle seront envoyées les notifications. Modifiez la directivedestemail avec cette valeur. La directivesendername peut être utilisée pour modifier le champ «Sender» dans les e-mails de notification:

/etc/fail2ban/jail.local

[DEFAULT]

. . .
destemail = [email protected]
sendername = Fail2BanAlerts

Dans le langage defail2ban, une «action» est la procédure suivie lorsqu'un client échoue trop souvent à l'authentification. L'action par défaut (appeléeaction_) 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é le courrier.

Vous pouvez utiliser l'actionaction_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'actionaction_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 defail2ban, nous pouvons nous concentrer sur l'activation de certains jails 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 prison de[ssh] est activée.

Pour activer la surveillance des journaux pour les tentatives de connexion Nginx, nous activerons la prison de[nginx-http-auth]. Modifiez la directiveenabled dans cette section afin qu'elle affiche «true»:

/etc/fail2ban/jail.local

[nginx-http-auth]

enabled  = true
filter   = nginx-http-auth
port     = http,https
logpath  = /var/log/nginx/error.log
. . .

C'est la seule prison spécifique à Nginx incluse dans le packagefail2ban d'Ubuntu. Cependant, nous pouvons créer nos propres jails pour ajouter des fonctionnalités supplémentaires. L'inspiration et certains des détails d'implémentation de ces prisons supplémentaires sont venus dehere ethere.

Nous pouvons créer une prison[nginx-noscript] pour bannir les clients qui recherchent des scripts sur le site Web à exécuter et à exploiter. Si vous n'utilisez pas PHP ou tout autre langage conjointement avec votre serveur Web, vous pouvez ajouter cette prison pour interdire 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 bot 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 en tant que proxy ouvert. Nous pouvons ajouter une prison[nginx-noproxy] pour répondre à ces demandes:

/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é les modifications nécessaires, enregistrez et fermez le fichier. Nous devons maintenant ajouter les filtres pour les jails que nous avons créés.

Ajout des filtres pour des prisons Nginx supplémentaires

Nous avons mis à jour le fichier/etc/fail2ban/jail.local avec quelques 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 jails que nous avons créés. Ces fichiers de filtres spécifieront les modèles à rechercher dans les journaux Nginx.

Commencez par passer au répertoire des filtres:

cd /etc/fail2ban/filter.d

Nous souhaitons en fait commencer par ajuster le filtre d'authentification Nginx pré-fourni pour qu'il corresponde à un modèle de journal de connexion en échec supplémentaire. Ouvrez le fichier pour le modifier:

sudo nano nginx-http-auth.conf

Sous la spécificationfailregex, ajoutez un modèle supplémentaire. Cela correspondra aux lignes où l'utilisateur n'a entré aucun nom d'utilisateur ou 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: , server: \S+, request: "\S+ \S+ HTTP/\d+\.\d+", host: "\S+"\s*$
            ^ \[error\] \d+#\d+: \*\d+ no user/password was provided for basic authentication, client: , 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 fichierapache-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 jail:

sudo cp apache-badbots.conf nginx-badbots.conf

Ensuite, nous allons créer un filtre pour notre prison[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 = ^ -.*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 = ^ -.*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 = ^ -.*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 servicefail2ban. Vous pouvez le faire en tapant:

sudo service fail2ban restart

Le service doit redémarrer, en implémentant les différentes stratégies d’interdiction que vous avez configurées.

Obtenir des informations sur les jails activés

Vous pouvez voir tous vos jails activés en utilisant la commandefail2ban-client:

sudo fail2ban-client status

Vous devriez voir une liste de toutes les jails 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 consulteriptables pour voir quefail2ban a modifié vos règles de pare-feu pour créer un cadre pour bannir les clients. Même sans règles de pare-feu précédentes, vous auriez maintenant un framework 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 une prison, il est probablement plus facile d'utiliser à nouveau lesfail2ban-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 stratégies Fail2Ban

Il est important de tester vos stratégiesfail2ban pour vous assurer qu'elles bloquent le trafic comme prévu. Par exemple, pour l'invite d'authentification Nginx, vous pouvez fournir plusieurs fois des informations d'identification incorrectes. Après avoir dépassé cette limite, vous devriez être banni et ne plus avoir accès au site. Si vous configurez des notifications par courrier électronique, vous devriez voir les messages concernant l'interdiction dans le compte de messagerie que vous avez fourni.

Si vous regardez l'état avec la commandefail2ban-client, vous verrez que votre adresse IP est 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 annuler manuellement votre adresse IP avec lesfail2ban-client en tapant:

sudo fail2ban-client set nginx-http-auth unbanip 111.111.111.111

Vous devriez maintenant pouvoir tenter à nouveau l'authentification.

Conclusion

La configuration defail2ban 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 à modifier au fur et à mesure que votre les besoins évoluent. Apprendre les bases de la protection de votre serveur avecfail2ban peut vous fournir une grande sécurité avec un minimum d'effort.

Si vous souhaitez en savoir plus surfail2ban, consultez les liens suivants: