{"id":374,"date":"2023-07-11T13:19:47","date_gmt":"2023-07-11T13:19:47","guid":{"rendered":"https:\/\/blog.nibelheim.fr\/?p=374"},"modified":"2023-07-11T13:19:47","modified_gmt":"2023-07-11T13:19:47","slug":"configurer-fail2ban-sur-raspbian","status":"publish","type":"post","link":"https:\/\/blog.nibelheim.fr\/?p=374","title":{"rendered":"Configurer Fail2Ban sur Raspbian"},"content":{"rendered":"\n<p>Sans vous en rendre n\u00e9cessairement compte, vous pouvez \u00eatre sujet \u00e0 des tas de tentatives de login parasite sur votre Raspberry Pi, surtout si vous lui faites tourner un serveur Web, visible donc depuis l&#8217;ext\u00e9rieur.<br>De nombreux bots sont \u00e0 l&#8217;aff\u00fbt et vont tenter de rentrer chez vous en sondant constamment vos ports vuln\u00e9rables et rentrer, au hasard, des login et mots de passe jusqu&#8217;\u00e0 ce que &#8220;\u00e7a passe&#8221;.<\/p>\n\n\n\n<p>Bien que les box internet soient normalement destin\u00e9es \u00e0 ne laisser passer que le trafic sur les ports pr\u00e9cis (le port forwarding), je me retrouve dans un cas plut\u00f4t incompr\u00e9hensible o\u00f9 mon Raspberry Pi re\u00e7oit des demandes de login sur des ports qui ne sont pas forward\u00e9s, et qui ne devraient donc jamais \u00eatre visibles&#8230; Sauf que si. La preuve dans \/var\/log\/auth.log :<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1205\" height=\"661\" src=\"https:\/\/blog.nibelheim.fr\/wp-content\/uploads\/2023\/07\/image.png\" alt=\"\" class=\"wp-image-375\"\/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p>Fail2Ban est un programme qui permet de bannir des adresses IP en fonction de r\u00e8gles que l&#8217;on aura \u00e9tablies.<br>Voici un exemple de r\u00e8gles que nous allons tenter d&#8217;appliquer : <strong>&#8220;apr\u00e8s 3 tentatives de login sur un port qui n&#8217;est pas dans ma liste, bannis l&#8217;adresse IP&#8221;<\/strong>.<\/p>\n\n\n\n<p>En avant.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt update &amp;&amp; sudo apt full-upgrade -y<br>sudo apt install fail2ban<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Cr\u00e9ation de la r\u00e8gle et du filtre<\/h2>\n\n\n\n<p>Ceci \u00e9tant fait, nous allons cr\u00e9er la r\u00e8gle (appel\u00e9e &#8220;jail&#8221;) en elle-m\u00eame :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo nano \/etc\/fail2ban\/jail.d\/myjail_wrongport.local<\/code><\/pre>\n\n\n\n<p>Puis copiez le contenu suivant :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;custom-port]<br>enabled = true<br>filter = myban_wrongports<br>action = iptables-allports<br>logpath = \/var\/log\/fail2ban.log<br>maxretry = 3<br>findtime = 3600<br>bantime = -1<\/code><\/pre>\n\n\n\n<p>Ceci indique \u00e0 Fail2Ban que : <em>&#8220;la r\u00e8gle custom-port est activ\u00e9e, requiert le filtre (pas encore cr\u00e9\u00e9) myban_wrongports, si ce filtre est d\u00e9clench\u00e9 3 fois sur un temps de 3600 secondes, bannis l&#8217;IP pour toujours (-1 \u00e0 bantime)&#8221;<\/em>.<\/p>\n\n\n\n<p>Maintenant, nous allons cr\u00e9er le filtre en question :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo nano \/etc\/fail2ban\/filter.f\/myban_wrongports.conf<\/code><\/pre>\n\n\n\n<p>Et copiez-y le contenu :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;Definition]<br>failregex = ^ -.*\\b(80|443)\\b<br>ignoreregex =<\/code><\/pre>\n\n\n\n<p>Dans l&#8217;expression regex ci-dessus, entre parenth\u00e8ses se trouve la liste des ports en-dehors desquels un ban est d\u00e9clench\u00e9. Ci-dessus, <strong>seuls 80 et 443 sont autoris\u00e9s,<\/strong> mais vous pouvez a<strong>jouter les ports de votre choix entre symboles OU (|)<\/strong>, soit AltGr-6 .<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Gestion de la persistance des bannissements<\/h2>\n\n\n\n<p>Ceci \u00e9tant fait, il faut maintenant g\u00e9rer les persistance des bannissements, car si jamais vous red\u00e9marrez Fail2Ban, ou votre machine tout court, celui-ci oubliera tout.<br>A noter que F2B utilise d\u00e9j\u00e0 une database locale, mais son usage ne sera pas d\u00e9taill\u00e9 ici (nous allons utiliser une m\u00e9thode assez sale&#8230; Mais qui marche). <a href=\"https:\/\/arno0x0x.wordpress.com\/2015\/12\/30\/fail2ban-permanent-persistent-bans\/\" data-type=\"URL\" data-id=\"https:\/\/arno0x0x.wordpress.com\/2015\/12\/30\/fail2ban-permanent-persistent-bans\/\" target=\"_blank\" rel=\"noreferrer noopener\">Merci \u00e0 cet article<\/a> pour la source!<\/p>\n\n\n\n<p>sudo nano \/etc\/fail2ban\/action.d\/iptables-multiport.conf<\/p>\n\n\n\n<p>Et \u00e9ditez tr\u00e8s pr\u00e9cis\u00e9ment comme d\u00e9crit dans ce super article les lignes en gras :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><code>&#91;Definition]<\/code><code># Option:\u00a0 actionstart<\/code><code># Notes.:\u00a0 command executed once at the start of Fail2Ban.<\/code><code># Values:\u00a0 CMD<\/code><code>#<\/code>\n<code>actionstart = iptables -N fail2ban-&lt;name><\/code><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0iptables -A fail2ban-&lt;name> -j RETURN<\/code><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0iptables -I &lt;chain> -p &lt;protocol> -m multiport --dports &lt;port> -j fail2ban-&lt;name><\/code><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><strong><code>\u00a0\u00a0cat \/etc\/fail2ban\/persistent.bans | awk '\/^fail2ban-&lt;name>\/ {print $2}' \\<\/code><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0| while read IP; do iptables -I fail2ban-&lt;name> 1 -s $IP -j &lt;blocktype>; done<\/code><\/strong><code># Option:\u00a0 actionstop<\/code><code># Notes.:\u00a0 command executed once at the end of Fail2Ban<\/code><code># Values:\u00a0 CMD<\/code><code>#<\/code>\n<code>actionstop = iptables -D &lt;chain> -p &lt;protocol> -m multiport --dports &lt;port> -j fail2ban-&lt;name><\/code><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0iptables -F fail2ban-&lt;name><\/code><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0iptables -X fail2ban-&lt;name><\/code><code># Option:\u00a0 actioncheck<\/code><code># Notes.:\u00a0 command executed once before each actionban command<\/code><code># Values:\u00a0 CMD<\/code><code>#<\/code>\n<code>actioncheck = iptables -n -L &lt;chain> | grep -q 'fail2ban-&lt;name>&#91; \\t]'<\/code><code># Option:\u00a0 actionban<\/code><code># Notes.:\u00a0 command executed when banning an IP. Take care that the<\/code><code>#\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 command is executed with Fail2Ban user rights.<\/code><code># Tags:\u00a0\u00a0\u00a0 See jail.conf(5) man page<\/code>\n<code># Values:\u00a0 CMD<\/code><code>#<\/code>\n<code>actionban = iptables -I fail2ban-&lt;name> 1 -s &lt;ip> -j &lt;blocktype><\/code>\n<code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<strong>\u00a0echo \"fail2ban-&lt;name> &lt;ip>\" >> \/etc\/fail2ban\/persistent.bans<\/strong><\/code><\/code><\/pre>\n\n\n\n<p>Puis, ne pas oublier de red\u00e9marrer fail2ban :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo service fail2ban restart<\/code><\/pre>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Sans vous en rendre n\u00e9cessairement compte, vous pouvez \u00eatre sujet \u00e0 des tas de tentatives de login parasite sur votre Raspberry Pi, surtout si vous lui faites tourner un serveur Web, visible donc depuis l&#8217;ext\u00e9rieur.De nombreux bots sont \u00e0 l&#8217;aff\u00fbt et vont tenter de rentrer chez vous en sondant constamment [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5,8],"tags":[21,25],"class_list":["post-374","post","type-post","status-publish","format-standard","hentry","category-linux","category-raspberry-pi","tag-network","tag-raspberry"],"_links":{"self":[{"href":"https:\/\/blog.nibelheim.fr\/index.php?rest_route=\/wp\/v2\/posts\/374","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.nibelheim.fr\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.nibelheim.fr\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.nibelheim.fr\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.nibelheim.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=374"}],"version-history":[{"count":4,"href":"https:\/\/blog.nibelheim.fr\/index.php?rest_route=\/wp\/v2\/posts\/374\/revisions"}],"predecessor-version":[{"id":379,"href":"https:\/\/blog.nibelheim.fr\/index.php?rest_route=\/wp\/v2\/posts\/374\/revisions\/379"}],"wp:attachment":[{"href":"https:\/\/blog.nibelheim.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=374"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.nibelheim.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=374"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.nibelheim.fr\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=374"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}