Recherche de site Web

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


Introduction

Lors de l'exploitation d'un serveur web, il est important de mettre en œuvre des mesures de sécurité pour protéger votre site et vos 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 malveillants et de robots.

Configurer fail2ban peut aider à atténuer ce problème. Lorsque des utilisateurs échouent à plusieurs reprises à s'authentifier auprès d'un service (ou s'engagent dans d'autres activités suspectes), fail2ban peut imposer des interdictions temporaires sur l'adresse IP en infraction en modifiant dynamiquement la politique du pare-feu en cours. Chaque fail2ban “prison” fonctionne en vérifiant les journaux écrits par un service pour des modèles qui indiquent des tentatives échouées. Configurer fail2ban pour surveiller les journaux Apache est facile à l'aide des filtres de configuration inclus.

Dans ce guide, nous allons démontrer comment installer fail2ban et le configurer pour surveiller vos journaux Apache à 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 des privilèges sudo afin de pouvoir donner des commandes administratives. Pour savoir comment créer un utilisateur avec des privilèges sudo, consultez notre guide de configuration initiale du serveur pour Ubuntu 14.04.

Installation d'Apache et configuration de l'authentification par mot de passe

Si vous êtes intéressé à protéger votre serveur Apache avec fail2ban, vous avez peut-être déjà un serveur configuré et en fonctionnement. Sinon, vous pouvez installer Apache à partir des dépôts par défaut d'Ubuntu en utilisant apt.

Mettez à jour l'index des paquets local et installez en tapant :

  1. sudo apt-get update
  2. sudo apt-get install apache2

Le service fail2ban est utile pour protéger les points d'entrée de connexion. Pour que cela soit utile pour une installation Apache, une authentification par mot de passe doit être mise en œuvre pour au moins un sous-ensemble du contenu sur le serveur. Vous pouvez suivre ce guide pour configurer la protection par mot de passe pour votre serveur Apache.

Installer Fail2Ban

Une fois que votre serveur Apache est en cours d'exécution et que l'authentification par mot de passe est activée, vous pouvez procéder à l'installation de fail2ban (nous incluons un autre rechargement de dépôt ici au cas où vous auriez déjà configuré Apache dans les étapes précédentes):

  1. sudo apt-get update
  2. sudo apt-get install fail2ban

Cela installera le logiciel. Par défaut, fail2ban est configuré pour ne bannir que les tentatives de connexion SSH échouées. Nous devons activer certaines règles qui vont le configurer pour vérifier nos journaux Apache à la recherche de motifs indiquant une activité malveillante.

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

Pour commencer, nous devons ajuster le fichier de configuration que fail2ban utilise pour déterminer quels journaux d'applications surveiller et quelles actions entreprendre lorsque des entrées problématiques sont trouvées. Le fichier /etc/fail2ban/jail.conf fourni est la principale ressource disponible 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 paquet fournit un nouveau fichier par défaut :

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

Ouvrez le fichier nouvellement copié afin que nous puissions configurer notre surveillance des journaux Apache :

  1. sudo nano /etc/fail2ban/jail.local

Changer les paramètres 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. Celles-ci se trouveront sous la section [DEFAULT] dans le fichier. Ces éléments établissent 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. Cela est défini par la directive ignoreip. Il est parfois judicieux d'ajouter votre propre adresse IP ou réseau à la liste des exceptions pour éviter de vous verrouiller à l'extérieur. Cependant, cela pose moins de problèmes avec les connexions au serveur Web si vous êtes en mesure de maintenir un accès 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 :

[DEFAULT]

. . .
ignoreip = 127.0.0.1/8 your_home_IP

Un autre élément que vous pourriez vouloir ajuster est le bantime, qui contrôle combien de secondes un membre en infraction est banni. Il est idéal de définir cela sur une durée suffisamment longue pour être perturbante pour les efforts d'un acteur malveillant, tout en étant suffisamment courte pour permettre aux utilisateurs légitimes de rectifier leurs erreurs. Par défaut, cela est fixé à 600 secondes (10 minutes). Augmentez ou réduisez cette valeur selon vos besoins :

[DEFAULT]

. . .
bantime = 3600

Les deux éléments suivants déterminent la portée des lignes de journal utilisées pour déterminer un client fautif. Le findtime spécifie une durée en secondes et la directive maxretry indique le nombre de tentatives à tolérer dans ce temps. Si un client effectue plus de maxretry tentatives dans le temps défini par findtime, il sera banni :

[DEFAULT]

. . .
findtime = 3600   # These lines combine to ban clients that fail
maxretry = 6      # to authenticate 6 times within a half hour.

Configurer les notifications par mail (facultatif)

Vous pouvez activer les notifications par e-mail si vous souhaitez recevoir des courriels 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 avez configuré Postfix, comme le démontre le tutoriel ci-dessus, changez cette valeur en « mail » :

[DEFAULT]

. . .
mta = mail

Vous devez sélectionner l'adresse email qui recevra les notifications. Modifiez la directive destemail avec cette valeur. La directive sendername peut être utilisée pour modifier le champ « Expéditeur » dans les emails de notification :

[DEFAULT]

. . .
destemail = youraccount@email.com
sendername = Fail2BanAlerts

Dans le langage de fail2ban, une “action” est la procédure suivie lorsqu'un client échoue à s'authentifier trop de fois. L'action par défaut (appelée action_) consiste simplement à interdire l'adresse IP du port en question. Cependant, il existe deux autres actions préfabriquées qui peuvent être utilisées si vous avez configuré le mail.

Vous pouvez utiliser l'action action_mw pour interdire le client et envoyer une notification par email à votre compte configuré avec un rapport “whois” sur l'adresse offensante. Vous pourriez également utiliser l'action action_mwl, qui fait la même chose, mais inclut également les lignes de journal offensantes qui ont déclenché l'interdiction :

[DEFAULT]

. . .
action = %(action_mwl)s

Configurer Fail2Ban pour surveiller les journaux Apache

Maintenant que vous avez mis en place quelques-uns des paramètres généraux de fail2ban, nous pouvons nous concentrer sur l'activation des prisons spécifiques à Apache qui surveilleront les journaux de notre serveur web pour des comportements 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 [ssh] est activée.

Pour activer la surveillance des journaux pour les tentatives de connexion Apache, nous allons activer la prison [apache]. Modifiez la directive enabled dans cette section pour qu'elle indique “true” :

[apache]

enabled  = true
port     = http,https
filter   = apache-auth
logpath  = /var/log/apache*/*error.log
maxretry = 6
. . .

Si votre serveur Apache écrit dans l'emplacement de journal par défaut (/var/log/apache/error.log), la prison est déjà configurée pour regarder au bon endroit. Si vous journalisez dans un autre emplacement, modifiez le logpath si nécessaire. N'hésitez pas à ajuster la directive maxretry ou à ajouter une valeur findtime pour cette prison si vous souhaitez imposer des restrictions différentes pour cette prison spécifique:

[apache]

enabled  = true
port     = http,https
filter   = apache-auth
logpath  = /var/log/apache/custom_log_location.log
maxretry = 3
findtime = 600
. . .

La prison ci-dessus s'occupera de bloquer les échecs d'authentification de base. Il existe également d'autres prisons pré-configurées qui valent la peine d'être activées (la prison [apache-multiport] est une prison héritée qui n'est pas nécessaire).

La prison [apache-noscript] est utilisée pour interdire les clients qui recherchent des scripts sur le site web afin de les exécuter et d'en tirer parti. Si vous n'utilisez pas PHP ou un autre langage en conjonction avec votre serveur web, vous pouvez activer cette prison pour interdire ceux qui demandent ce type de ressources :

[apache-noscript]

enabled  = true
. . .

La prison [apache-overflows] est utilisée pour bloquer les clients qui tentent de demander des URL exceptionnellement longues et suspectes. Ce sont souvent des signes de tentatives d'exploiter Apache en essayant de déclencher un dépassement de tampon. Vous pouvez activer cette prison si vous souhaitez prévenir ces types d'attaques :

[apache-overflows]

enabled  = true
. . .

Des vérifications supplémentaires peuvent être effectuées en copiant et collant l'entrée [apache-overflows] et en la modifiant légèrement. Par exemple, vous pouvez copier et coller cette section et modifier le nom de la prison et le filtre pour apache-badbots afin d'arrêter certains motifs de requête de bots malveillants connus:

[apache-overflows]

enabled  = true
port     = http,https
filter   = apache-overflows
logpath  = /var/log/apache*/*error.log
maxretry = 2

[apache-badbots]

enabled  = true
port     = http,https
filter   = apache-badbots
logpath  = /var/log/apache*/*error.log
maxretry = 2

Si vous n'utilisez pas Apache pour fournir l'accès au contenu web dans les répertoires personnels des utilisateurs, vous pouvez copier et coller à nouveau et changer les noms de prison et de filtre en apache-nohome :

[apache-overflows]

enabled  = true
port     = http,https
filter   = apache-overflows
logpath  = /var/log/apache*/*error.log
maxretry = 2

[apache-badbots]

enabled  = true
port     = http,https
filter   = apache-badbots
logpath  = /var/log/apache*/*error.log
maxretry = 2

[apache-nohome]

enabled  = true
port     = http,https
filter   = apache-nohome
logpath  = /var/log/apache*/*error.log
maxretry = 2

Enfin, si vous utilisez Apache avec PHP, vous voudrez peut-être activer la prison [php-url-fopen], qui bloque les tentatives d'utiliser certains comportements de PHP à des fins malveillantes. Vous devrez probablement changer la directive logpath pour pointer vers l'emplacement correct du journal d'accès (sur Ubuntu, l'emplacement par défaut est /var/log/apache2/access.log). Vous pouvez utiliser un modèle similaire à celui qui correspond au journal des erreurs dans les autres prisons :

[php-url-fopen]

enabled = true
port    = http,https
filter  = php-url-fopen
logpath = /var/log/apache*/*access.log

Lorsque vous avez terminé d'apporter les modifications nécessaires, enregistrez et fermez le fichier.

Mettre en œuvre vos Apache Jails

Pour appliquer vos modifications de configuration, vous devrez redémarrer le service fail2ban. Vous pouvez le faire en tapant :

  1. sudo service fail2ban restart

Le service doit redémarrer, en appliquant 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 :

  1. sudo fail2ban-client status

Vous devriez voir une liste de toutes les prisons que vous avez activées :

Status
|- Number of jail:      7
`- Jail list:           php-url-fopen, apache-overflows, apache-noscript, ssh, apache-badbots, apache-nohome, apache

Vous pouvez voir que fail2ban a modifié les règles de votre pare-feu pour créer un cadre permettant d'interdire des clients. Même sans règles de pare-feu préalables, vous auriez maintenant un cadre activé qui permet à fail2ban d'interdire sélectivement des clients en les ajoutant à des chaînes conçues à cet effet :

  1. sudo iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-N fail2ban-apache
-N fail2ban-apache-badbots
-N fail2ban-apache-nohome
-N fail2ban-apache-noscript
-N fail2ban-apache-overflows
-N fail2ban-php-url-fopen
-N fail2ban-ssh
-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-apache-nohome
-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-apache-badbots
-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-php-url-fopen
-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-apache-overflows
-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-apache-noscript
-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-apache
-A INPUT -p tcp -m multiport --dports 22 -j fail2ban-ssh
-A fail2ban-apache -j RETURN
-A fail2ban-apache-badbots -j RETURN
-A fail2ban-apache-nohome -j RETURN
-A fail2ban-apache-noscript -j RETURN
-A fail2ban-apache-overflows -j RETURN
-A fail2ban-php-url-fopen -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 le fail2ban-client:

  1. sudo fail2ban-client status apache
Status for the jail: apache
|- filter
|  |- File list:        /var/log/apache2/error.log 
|  |- Currently failed: 0
|  `- Total failed:     0
`- action
   |- Currently banned: 0
   |  `- IP list:
   `- Total banned:     0

Tester les politiques de Fail2Ban

Il est important de tester vos politiques fail2ban pour s'assurer qu'elles bloquent le trafic comme prévu. Par exemple, pour l'invite d'authentification Apache, vous pouvez entrer des informations d'identification incorrectes plusieurs fois. Après avoir dépassé la limite, vous devriez être banni et incapable d'accéder au site. Si vous avez configuré des notifications par e-mail, vous devriez voir des messages concernant le bannissement dans le compte de messagerie que vous avez fourni.

Si vous regardez l'état avec la commande fail2ban-client, vous verrez votre adresse IP être bannie du site :

  1. sudo fail2ban-client status apache
Status for the jail: apache
|- filter
|  |- File list:        /var/log/apache2/error.log 
|  |- Currently failed: 0
|  `- Total failed:     12
`- action
   |- Currently banned: 1
   |  `- IP list:       111.111.111.111
   `- Total banned:     1

Lorsque vous êtes satisfait que vos règles fonctionnent, vous pouvez manuellement débannir votre adresse IP avec le fail2ban-client en tapant :

  1. sudo fail2ban-client set apache unbanip 111.111.111.111

Vous devriez maintenant être en mesure de tenter à nouveau l'authentification.

Conclusion

Configurer fail2ban pour protéger votre serveur Apache est assez simple dans le cas le plus élémentaire. Cependant, fail2ban offre une grande flexibilité pour élaborer des politiques qui répondront à vos besoins spécifiques en matière de sécurité. En examinant les variables et les motifs dans le fichier /etc/fail2ban/jail.local, ainsi que 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 à ajuster et à modifier au fur et à mesure que vos besoins évoluent. Apprendre les bases de la protection de votre serveur avec fail2ban peut vous apporter une grande sécurité avec un effort minimal.

Pour en savoir plus sur fail2ban, consultez certains de ces liens :

  • Comment Fail2Ban fonctionne pour protéger les services sur un serveur Linux
  • Comment protéger SSH avec Fail2Ban sur Ubuntu 14.04
  • Comment protéger un serveur Nginx avec Fail2Ban sur Ubuntu 14.04