From 66a5a0cdccd464930a232c87f91e1b0805f255a5 Mon Sep 17 00:00:00 2001 From: Chimrod Date: Tue, 16 Apr 2013 21:27:30 +0200 Subject: initial commit --- content/Informatique/fail2ban.rst | 162 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 162 insertions(+) create mode 100755 content/Informatique/fail2ban.rst (limited to 'content/Informatique/fail2ban.rst') diff --git a/content/Informatique/fail2ban.rst b/content/Informatique/fail2ban.rst new file mode 100755 index 0000000..993c704 --- /dev/null +++ b/content/Informatique/fail2ban.rst @@ -0,0 +1,162 @@ +.. -*- mode: rst -*- +.. -*- coding: utf-8 -*- + +Une gestion avancée de fail2ban +------------------------------- + +:date: 2008/09/15 +:tags: Libre, Hébergement + +Beaucoup d'articles sont déjà parus sur l'utilisation de fail2ban pour +protéger son ordinateur. Je vais parler ici d'une utilisation avancée de +fail2ban, couplé avec le pare-feu iptables dans le but de faire plein de +joli de choses avec ceux qui tentent d'accéder à nos Pcs ! + +Pour rappel, fail2ban permet de bloquer certaines IPs en fonction de ce +que les logs renvoient comme messages. Il est possible de déterminer les +ports sur lesquels les IPs seront bloquées et la durée du blocage. En ce +qui concerne les filtres qui déclencheront ou non le blocage, cela se +base sur des regex, et on peut déterminer le nombre de tentatives avant +qu'un blocage ne soit appliqué. + +Dans l'esprit du projet, fail2ban empêche les attaques par force brute, +mais nous allons voir qu'il est tout à fait possible de l'utiliser dans +d'autres fins. + +Créer de nouvelles règles de filtrage +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Dans un premier temps, nous allons mettre en place une nouvelle règle de +blocage pour, par exemple, bloquer les IPs en fonction des codes +d'erreurs d'apache. + +Mettre en place une nouvelle règle se fait de manière très simple, il +suffit de créer un fichier contenant la regex à appliquer, et de mettre +une référence vers ce fichier dans la configuration de fail2ban. + +Dans notre cas, pour bloquer les IPs ayant générés une erreur 403 ou une +erreur 401 dans apache, notre regex se présentera ainsi : + +:: + + failregex = :80 .* ".*" 403 = :80 .* ".*" 401 + +(Celle-ci est bien sûr à adapter en fonction de la manière dont vous +affichez vos logs de connexions. ) + +Dans le fichier de configuration de fail2ban ( /etc/fail2ban/jail.conf +), nous allons demander la lecture de ce fichier en indiquant quelques +paramètres supplémentaires : + +:: + + [apache-block] + enabled = true #Oui on active + port = http #On ne bloque que le port 80 + filter = apache-block # le nom du fichier que l'on a créé juste avant + action = %(action_)s + logpath = /tmp/log/apache*/*access.log + maxretry = 1 #Nombre de tentatives + banaction = iptables-redirect # L'action à appliquer sur l'IP + bantime = 3600 # Le temps pendant lequel l'ip sera bannie. + + +Créer de nouvelles actions +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Une fois que fail2ban aura lancé une procédure de blocage sur une +connexion, il va lancer un script contenant les actions à réaliser sur +cette IP. D'habitude ce script contient une règle iptables qui bloque +l'adresse, et une autre règle qui supprime ce blocage. + +Nous allons maintenant jouer avec iptables pour réaliser quelques +effets intéressant avec nos IPs à bannir : + +Relancer la durée du blocage : + +Par défaut, fail2ban retire le blocage sur l'IP une fois que la durée +spécifiée est écoulée. Je trouve ceci limité car cela n'empêche pas +l'attaquant de continuer ses attaques et se retrouver prêt à refaire une +attaque dès que cette durée est écoulée. De plus, cela peut donner une +information sur la durée pendant laquelle nous filtrons son adresse. + +iptables propose un module, modrecent, permettant de bloquer une IP +pendant une durée déterminée, et de réinitialiser cette durée si jamais +une nouvelle connexions venait à être réalisée durant cette période. + +Pour ceci nous allons devoir une règle iptables, en dehors de fail2ban, +qui consistera à bloquer une IP pendant telle période : + +Dans fail2ban, nous allons créer un nouveau fichier action, qui se +présentera comme suit : + +:: + + #On crée une nouvelle table + actionstart = iptables -N fail2ban- + #On bloque les connexions 2 fois sur 3 + iptables -A fail2ban- -m statistic --mode random --probability .33 -j REJECT --reject-with icmp-host unreachable + iptables -A fail2ban- -j DROP + #On insère une nouvelle règle qui met à jour le compteur à chaques nouvelles tentatives tant que le délai n'est pas écoulé + iptables -I INPUT -p -m multiport --dports -m recent --update --seconds 360000 --name fail2ban-- -j fail2ban- + + #Pour bannir une IP, il suffit de l'écrire dans le fichier de configuration de mod-recent + actionban = echo > /proc/net/ipt_recent/fail2ban- + +Mettre un message d'alerte : + +On peut décider d'annoncer à notre utilisateur bloqué que nous avons +banni son IP. Cela peut être utile si nous avons mis en place des règles +de filtrage très strictes et qu'un utilisateur peut se retrouver bloqué +sans avoir tenté la moindre intrusion ( mieux vaut être trop prudent que +pas assez ) + +Pour cela, nous allons avoir besoin d'un service qui consistera à +afficher le texte sur demande. Hors de question de demander ça à apache +ou autre serveur web, nous allons mettre en place notre propre serveur +web, qui présentera une page statique, toujours identique. + +socat et tout désigné pour cela. Dans notre exemple nous allons le +faire tourner en tant que serveur, sur un port ouvert, et avec des +droits limités. Notre règle iptables consistera juste à rediriger les +connexions entrantes sur le port 80 vers le port où l'on fait tourner +socat. + +:: + + sudo -u nobody socat tcp4-listen:6666,reuseaddr,fork exec:"cat /etc/apache2/banned.html" & + +et la règle iptables à mettre en place : + +:: + + #On crée la règle sur la table de préroutage : + actionstart = iptables -t nat -N fail2ban- + iptables -t nat -A fail2ban- -j RETURN + iptables -t nat -I PREROUTING -p -m multiport --dports -j fail2ban- + + iptables -N fail2ban- + iptables -A fail2ban- -j RETURN + iptables -I INPUT -p -m multiport --dports -j fail2ban- + +et pour lancer l'action, là encore, on simule une perte de paquet pour +ralentir le temps d'affichage de la page + +:: + + actionban = iptables -t nat -I fail2ban- 1 -s -p tcp -m multiport --dports -m statistic --mode nth --every 3 -j REDIRECT --to-port 6666 + iptables -I fail2ban- 1 -s -j DROP + +Les règles d'unban et de stop se font en symetrique de ban et start, en +supprimant des règles crées. + +Voilà, cela permet de mettre en place une sécurité personnalisée et +adaptée, qui sort déjà des outils et configuration standards ( ce qui +est toujours une bonne chose en matière de sécurité ). Les exemples que +j'ai donné ne sont que des suggestions, et il possible de faire beaucoup +d'autres choses avec un peu d'imaginations. Je vous renvoie au manuel +d'iptables qui présente la liste de tous les modules existants, et de +regarder un peu les paramètres disponibles parmi les fichiers de +configuration de fail2ban. Mon seul regret est qu'à ce jour, ce +programme ne gère pas encore les Ip en v6, mais ça n'est - pour +l'instant - pas encore critique.. -- cgit v1.2.3