GNU/Linux >> Tutoriels Linux >  >> Cent OS

Bloquez les mauvais bots avec Fail2ban

Fail2ban est un outil de sécurité polyvalent. Bien qu'il soit principalement utilisé pour empêcher les attaques par force brute contre SSH, il peut également être utilisé pour protéger d'autres services.

Il existe des robots qui analysent Internet et envoient des milliers de requêtes aux serveurs Web dans l'espoir de trouver des vulnérabilités. Cet article concerne le blocage de ces bots avec Fail2ban.

Nous supposons que vous utilisez Apache comme serveur Web. Cependant, ces instructions peuvent facilement être personnalisées pour nginx ou tout autre serveur Web.

Cependant, vous devez garder à l'esprit que Fail2ban n'est pas un pare-feu d'application Web (WAF) et ne peut pas bloquer les requêtes malveillantes si elles passent. En effet, fail2ban agit en surveillant les journaux; Par conséquent, au moins une tentative malveillante doit être enregistrée avant que Fail2ban puisse prendre des mesures.

Qu'est-ce qu'un mauvais bot de toute façon ?

Dans cet article, nous nous concentrerons sur le blocage des bots qui effectuent l'une des actions suivantes :

  • Recherche sur le site Web un proxy ouvert
  • Envoie une requête GET avec des paramètres qui. contenir des charges utiles d'injection SQL
  • Envoie une requête GET avec des paramètres qui. contenir des charges utiles de névrose

Bien sûr, vous pouvez également bloquer d'autres types d'attaques. Cependant, nous nous limitons aux trois cas mentionnés ci-dessus pour cet article.

Installer Fail2ban

Fail2ban est disponible dans le dépôt de la plupart des distributions.

Pour l'installer sur Debian / Ubuntu exécutez :

sudo apt-get update
sudo apt-get install fail2ban

Sous CentOS, vous devez d'abord utiliser le référentiel EPEL ; Ensuite, vous devez l'activer et le démarrer.

sudo yum -y install epel-release
sudo yum -y install fail2ban
sudo systemctl enable fail2ban
sudo systemctl start fail2ban

Principes de base de Fail2ban

Au cœur du mécanisme de travail de Fail2ban se trouvent un certain nombre de prisons. En termes simples, une prison demande à Fail2ban de consulter un certain nombre de journaux et de leur appliquer un filtre à chaque fois que le journal change. Si le nombre de correspondances pour le filtre est égal au nombre maximum de correspondances autorisées par la prison, une action spécifiée dans la prison est entreprise.

Vous devez donc définir deux choses :un filtre et une prison. La prison est configurée pour consulter les journaux d'Apache à la recherche de requêtes malveillantes.

Définir les filtres

Un filtre est simplement une collection d'expressions régulières Python qui sont comparées à un journal. Ici, nous aurions à définir des filtres pour les critères décrits ci-dessus.

Mais regardons d'abord une entrée dans les journaux d'Apache :

66.249.79.189 - - [17/Jan/2017:14:10:41 +0000] "GET /robots.txt HTTP/1.1" 200 3494 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +https:
//www.google.com/bot.html)"

Notez que l'en-tête de requête GET /robots.txt HTTP/1.1 est entre guillemets doubles. Si vous concevez vous-même de telles règles, vous devez veiller à ce que seul l'en-tête de la requête corresponde. Sinon, vous risquez de bloquer les utilisateurs légitimes.

Les charges utiles d'injection SQL contiennent généralement des chaînes de la forme union select(...) ou select concat (...) . Vous pouvez donc essayer de faire correspondre ce modèle avec l'expression régulière suivante :



(?i)^<HOST> -.*"[^"]+(?:union[^"]+select[^"]*|select[^"]+concat[^"]*)(?:%%2[8C]|[,(])

le <HOST> La partie définit la position de l'adresse IP dans l'entrée de journal, et le (?i) indique que l'expression régulière est insensible à la casse.

le [^"] dans l'expression régulière garantit que le texte correspondant est entouré de guillemets doubles. Cela garantit que l'expression régulière ne correspond qu'à l'en-tête de la requête et à rien d'autre. le (?:%%2[8C]|[,(]) indique que le union select ou select concat une virgule suit en conséquence (, ) ou une parenthèse (( ), soit directement, soit sous leur forme codée en pourcentage.

Souvent, les bots à la recherche de proxys ouverts envoient des requêtes sous la forme :

101.33.59.9 - - [17/Jan/2017:14:10:41 +0000] "GET https://google.com/ HTTP/1.1" 400 3494 "-" "Mozilla"
101.33.59.9 - - [17/Jan/2017:14:10:44 +0000] "CONNECT yahoo.com:80" 400 3499 "-" "Mozilla"

Une expression régulière comme celle-ci peut facilement correspondre à celles-ci :

(?i)^<HOST> -.*"(?:(?:GET|POST|HEAD) https?:|CONNECT [a-z0-9.-]+:[0-9]+)

L'expression régulière (?:(?:GET|POST|HEAD) https?: correspond aux exigences du premier type, tandis que l'expression régulière CONNECT [a-z0-9.-]+:[0-9]+ répond aux exigences du second type.

Les robots qui recherchent Shellshock envoient souvent des requêtes telles que :

10.11.12.13 - - [17/Jan/2016:16:00:00 +0000] "GET /cgi-bin/printenv.cgi HTTP/1.0" 200 1 "-" "() { test;};echo "Content-type: text/plain"; echo; echo; /bin/rm -rf /var/www/"

Une expression régulière comme celle-ci correspond au modèle de Shellshock :

<HOST> -.*"()s*{[^;"]+[^}"]+}s*;

Ici, nous les vérifions () { <command>; } Motif et le s prend en compte les espaces éventuellement inclus dans la requête malveillante.

Si nous les combinons, nous pouvons maintenant écrire notre filtre :

[Definition]
failregex = <HOST> -.*"()s*{[^;"]+[^}"]+}s*;
            (?i)^<HOST> -.*"[^"]+(?:union[^"]+select[^"]*|select[^"]+concat[^"]*)(?:%%2[8C]|[,(])
            (?i)^<HOST> -.*"(?:(?:GET|POST|HEAD) https?:|CONNECT [a-z0-9.-]+:[0-9]+)
ignoreregex =

le ignoreregex vous permet d'ajouter des éléments à la liste blanche. Vous pouvez ajouter des expressions régulières ignorées comme cela a été fait pour failregex.

Enregistrez le filtre ci-dessus dans /etc/fail2ban/filter.d/badbot.local

Définir la prison

Maintenant que vous avez défini le filtre, il est temps de définir la prison. Ici, nous bloquons l'adresse IP pendant six minutes si elle envoie trois requêtes de ce type en six minutes.

Ajoutez ceci au vôtre /etc/fail2ban/jail.local Fichier :

[badbot]
enabled   = true
port      = http,https
filter    = badbot
logpath   = /var/log/apache*/*access.log
maxretry  = 3
banaction = iptables-multiport
findtime  = 360
bantime   = 360

Après avoir configuré la prison, vous devez redémarrer fail2ban pour que ces modifications prennent effet. Selon votre distribution, une de ces commandes sera nécessaire pour la redémarrer :

sudo systemctl restart fail2ban
sudo service fail2ban restart

fail2ban bloque désormais toutes les tentatives de mauvais robots qui tentent d'attaquer votre serveur Web. Vous pouvez étendre ces règles à votre autre serveur Web ou à tout autre type d'attaque que vous pourriez rencontrer.




Cent OS
  1. Sécurité Linux :protégez vos systèmes avec fail2ban

  2. Installez et configurez fail2ban sur Ubuntu 17.04 et bloquez sur tous les ports

  3. Utilisation de Fail2ban pour bloquer les mauvaises connexions ISPConfig

  4. Installer Fail2ban sur CentOS

  5. Bloquer la plage IP des pays avec GeoIP et iptables

Configurer le serveur BMC pour qu'il fonctionne avec le nouveau bloc IP public

Comment installer Fail2ban avec Firewalld sur Rocky Linux 8.4

Configurer OpenDMARC avec Postfix sur CentOS/RHEL pour bloquer l'usurpation d'e-mails

Comment installer Fail2ban avec Firewalld sur AlmaLinux 8

Comment sécuriser SSH avec Fail2Ban

Récupération plus rapide à partir d'un disque avec des secteurs défectueux