{"id":3185,"date":"2018-04-14T19:33:30","date_gmt":"2018-04-14T17:33:30","guid":{"rendered":"https:\/\/www.fanjoe.be\/?p=3185"},"modified":"2018-05-28T20:14:03","modified_gmt":"2018-05-28T18:14:03","slug":"fail2ban-bannir-des-ip-signalees-par-abuseipdb","status":"publish","type":"post","link":"https:\/\/www.fanjoe.be\/?p=3185","title":{"rendered":"Fail2Ban : Bannir des IP signal\u00e9es par AbuseIPDB"},"content":{"rendered":"<h1>Introduction<\/h1>\n<p>Malgr\u00e9 l&rsquo;utilisation de <a href=\"https:\/\/fr.wikipedia.org\/wiki\/Fail2ban\" target=\"_blank\" rel=\"noopener\">Fail2Ban<\/a> et de listes d&rsquo;IP \u00e0 bannir, mon Raspberry Pi subit encore des ralentissements d\u00fb\u00a0 \u00e0 des connexions ind\u00e9sirables qui utilisent beaucoup de ressources, principalement PHP.<\/p>\n<hr \/>\n<p>Voici d&rsquo;autres articles de mon blog qui traitent du m\u00eame sujet :<\/p>\n<ul>\n<li><a href=\"https:\/\/www.fanjoe.be\/?p=1003\" target=\"_blank\" rel=\"noopener\">Raspberry Pi : Configurer IPtables<\/a><\/li>\n<li><a href=\"https:\/\/www.fanjoe.be\/?p=1009\" target=\"_blank\" rel=\"noopener\">Raspberry Pi : Configurer Fail2Ban<\/a><\/li>\n<li><a href=\"https:\/\/www.fanjoe.be\/?p=3207\" target=\"_blank\" rel=\"noopener\">IPtables : Bannir une liste d&rsquo;IP extraite de BlockList.de<\/a><\/li>\n<li><a href=\"https:\/\/www.fanjoe.be\/?p=3233\" rel=\"bookmark\">IPtables + IPset : Bannir des grandes listes d\u2019IP extraites de plusieurs sites<\/a><\/li>\n<\/ul>\n<hr \/>\n<p>J&rsquo;ai donc d\u00e9cid\u00e9 de v\u00e9rifier r\u00e9guli\u00e8rement l&rsquo;IP des utilisateurs connect\u00e9s sur le port 443 et de la comparer \u00e0 une base de donn\u00e9es en ligne.<!--more--><\/p>\n<h1>AbuseIPDB<\/h1>\n<h2>Pr\u00e9sentation<\/h2>\n<p>Il existe diff\u00e9rentes bases de donn\u00e9es regroupant ce genre d&rsquo;IP qui ont pr\u00e9sent\u00e9 un comportement \u00ab\u00a0abusif\u00a0\u00bb par le pass\u00e9.<\/p>\n<p><a href=\"https:\/\/www.fanjoe.be\/wp-content\/uploads\/2018\/04\/BanAbuseIP-01.png\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-medium wp-image-3188\" src=\"https:\/\/www.fanjoe.be\/wp-content\/uploads\/2018\/04\/BanAbuseIP-01-300x67.png\" alt=\"\" width=\"300\" height=\"67\" srcset=\"https:\/\/www.fanjoe.be\/wp-content\/uploads\/2018\/04\/BanAbuseIP-01-300x67.png 300w, https:\/\/www.fanjoe.be\/wp-content\/uploads\/2018\/04\/BanAbuseIP-01-175x39.png 175w, https:\/\/www.fanjoe.be\/wp-content\/uploads\/2018\/04\/BanAbuseIP-01.png 432w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>J&rsquo;ai choisi d&rsquo;utiliser <a href=\"https:\/\/www.abuseipdb.com\/\" target=\"_blank\" rel=\"noopener\">AbuseIPDB.com<\/a> car le service offre une API simple \u00e0 configurer dans un script.<\/p>\n<h2>Inscription<\/h2>\n<p>Pour utiliser l&rsquo;API, il faut s&rsquo;inscrire sur le site, puis, se rendre dans la section \u00ab\u00a0API Key\u00a0\u00bb pour copier la clef.<\/p>\n<p><a href=\"https:\/\/www.fanjoe.be\/wp-content\/uploads\/2018\/04\/BanAbuseIP-02.png\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-large wp-image-3189\" src=\"https:\/\/www.fanjoe.be\/wp-content\/uploads\/2018\/04\/BanAbuseIP-02-620x389.png\" alt=\"\" width=\"620\" height=\"389\" srcset=\"https:\/\/www.fanjoe.be\/wp-content\/uploads\/2018\/04\/BanAbuseIP-02-620x389.png 620w, https:\/\/www.fanjoe.be\/wp-content\/uploads\/2018\/04\/BanAbuseIP-02-175x110.png 175w, https:\/\/www.fanjoe.be\/wp-content\/uploads\/2018\/04\/BanAbuseIP-02-300x188.png 300w, https:\/\/www.fanjoe.be\/wp-content\/uploads\/2018\/04\/BanAbuseIP-02.png 1146w\" sizes=\"(max-width: 620px) 100vw, 620px\" \/><\/a><\/p>\n<h1>Fail2Ban<\/h1>\n<h2>Jail<\/h2>\n<p>Pour configurer Fail2Ban, nous allons \u00e9diter le fichier <code>\/etc\/fail2ban\/jail.conf<\/code> :<\/p>\n<pre>$ sudo nano \/etc\/fail2ban\/jail.conf<\/pre>\n<p>Dans la partie <code># JAILS<\/code>, nous allons ajouter ces lignes :<\/p>\n<pre>[banabuseip]\r\n\r\nenabled = true\r\nfilter = banabuseip\r\naction = iptables-multiport[name=BanAbuseIP, port=\"80,443,110,995,25,465,143,585,993,587,21,22\", protocol=tcp,udp]\r\nlogpath = \/var\/log\/banabuseip.log\r\nmaxretry = 1\r\nbantime = 86400\r\n# 86400 = 1 jour<\/pre>\n<p>D\u00e8s qu&rsquo;une IP sera ajout\u00e9e, elle sera bannie durant 24h pour les ports et les protocoles indiqu\u00e9s.<\/p>\n<h2>Filtre<\/h2>\n<p>Nous allons cr\u00e9er un filtre dans <code>\/etc\/fail2ban\/filter.d\/banabuseip.conf<\/code> :<\/p>\n<pre>$ sudo nano \/etc\/fail2ban\/filter.d\/banabuseip.conf<\/pre>\n<p>Nous ajoutons ces lignes au fichier :<\/p>\n<pre>#\r\n# Filtre BanAbuseIP\r\n#\r\n[Definition]\r\nfailregex = \r\nignoreregex =<\/pre>\n<h2>Logs<\/h2>\n<p>Nous allons ensuite cr\u00e9er un fichier de logs vide n\u00e9cessaire au bon fonctionnement de Fail2Ban :<\/p>\n<pre>$ sudo touch \/var\/log\/banabuseip.log<\/pre>\n<h1>Le script<\/h1>\n<p>Maintenant que tout est en place, il ne nous reste plus qu&rsquo;\u00e0 cr\u00e9er le script bash :<\/p>\n<pre>$ sudo nano \/home\/pi\/scripts\/BanAbuseIP.bash<\/pre>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\r\n#!\/bin\/bash\r\n\r\n# V\u00e9rifie que l'on est en Root\r\nif [[ $EUID -ne 0 ]];\r\nthen\r\n    echo &quot;Ce script doit \u00eatre ex\u00e9cut\u00e9 avec les privil\u00e8ges administrateur&quot;\r\n    exit 1\r\nfi\r\n\r\nAbuseIPDB_API_key=IciLaClefAbuseIPDB\r\nWhite_IP1=&quot;192.168&quot; # IP du r\u00e9seau local\r\nWhite_IP2=&quot;104.31&quot; # IP de CloudFlare qui h\u00e9berge AbuseIPDB : https:\/\/www.lookip.net\/ip\/104.31.74.222\r\n\r\nmy_array=( $(netstat -tn 2&gt;\/dev\/null | grep :443 | awk '{print $5}' | cut -d: -f1 | sort | uniq | sort -nr | head) )\r\n\r\nfor ip in ${my_array[@]};\r\ndo\r\n    echo $ip\r\n\u00a0\u00a0\u00a0 if [[ $ip == $White_IP1* ]] || [[ $ip == $White_IP2* ]] # IP locale et CloudFlare blanchies\r\n\u00a0\u00a0\u00a0 then\r\n\u00a0\u00a0\u00a0     echo &quot;$(tput setaf 3)L'adresse a \u00e9t\u00e9 d\u00e9dect\u00e9e comme imblocable.$(tput setaf 7)&quot;\r\n\u00a0\u00a0\u00a0 else\r\n\u00a0\u00a0\u00a0     curl_result=$(timeout -s SIGINT 3s curl -s &quot;https:\/\/www.abuseipdb.com\/check\/$ip\/json?key=$AbuseIPDB_API_key&quot;)\r\n        if [ &quot;$curl_result&quot; == &quot;[]&quot; ] ;\r\n        then\r\n            echo &quot;$(tput setaf 2)Cette IP n'a pas \u00e9t\u00e9 report\u00e9e par AbuseIPDB.$(tput setaf 7)&quot;\r\n        else\r\n            wget_result=$(timeout -s SIGINT 3s wget -q -O - https:\/\/www.abuseipdb.com\/check\/$ip)\r\n            conf_abuse=$(echo $wget_result | grep -o -P '(?&lt;=Confidence of Abuse is &lt;b&gt;).*(?=%&lt;\/b&gt;:)')\r\n            if [ $conf_abuse -le 30 ]\r\n            then\r\n                echo &quot;$(tput setaf 3)L'adresse a \u00e9t\u00e9 report\u00e9e par AbuseIPDB \u00e0 seulement $conf_abuse%.$(tput setaf 7)&quot;\r\n            else\r\n                echo &quot;$(tput setaf 1)Cette IP a \u00e9t\u00e9 bloqu\u00e9e car report\u00e9e par AbuseIPDB \u00e0 $conf_abuse%.$(tput setaf 7)&quot;\r\n                fail2ban-client set banabuseip banip $ip &gt; \/dev\/null\r\n            fi\r\n        fi\r\n    fi\r\n    echo\r\ndone\r\n<\/pre>\n<p>Le script va stocker toutes les IP connect\u00e9es au port 443 dans un tableau.<\/p>\n<p>Il va ensuite comparer chaque IP du tableau avec la base de donn\u00e9es AbuseIPDB gr\u00e2ce \u00e0 la commande <code>curl<\/code>.<\/p>\n<p style=\"padding-left: 30px;\"><code>timeout -s SIGINT 3s<\/code> va emp\u00eacher le script de se bloquer si la commande ne r\u00e9pond pas :<br \/>\nEx. Si la connexion internet est coup\u00e9e.<\/p>\n<ul>\n<li>On v\u00e9rifie si l&rsquo;adresse est locale <code>192.168.xxx.xxx<\/code> ou est celle d&rsquo;AbuseIPDB cah\u00e9e derri\u00e8re CloudFlare <code>104.31.xxx.xxx<\/code>\n<ul>\n<li>Si c&rsquo;est le cas, on le dit en <span style=\"color: #ff6600;\">orange<\/span>.<\/li>\n<li>Si ce n&rsquo;est pas le cas, on v\u00e9rifie si le r\u00e9sultat est vide <code>[]<\/code>.\n<ul>\n<li>Si c&rsquo;est le cas, c\u2019est que l\u2019IP est OK et on l\u2019inscrit en <span style=\"color: #00ff00;\">vert<\/span>.<\/li>\n<li>Si ce n&rsquo;est pas le cas on charge la page web d&rsquo;AbuseIPDB et on extrait le pourcentage de confiance dans les r\u00e9sultats remont\u00e9s.\n<ul>\n<li>Si le r\u00e9sultat est &lt; 30% on l&rsquo;indique en <span style=\"color: #ff9900;\">orange<\/span>.<\/li>\n<li>S&rsquo;il est &gt; 30% on bannit l\u2019IP et on l\u2019inscrit en <span style=\"color: #ff0000;\">rouge<\/span>.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h2>Autre solution<\/h2>\n<p>Si on ne veut pas utiliser Fail2Ban, il est possible d&rsquo;utiliser directement <code>IPTables<\/code>.<\/p>\n<p>On remplace alors la ligne :<\/p>\n<pre>fail2ban-client set banabuseip banip $ip &gt; \/dev\/null<\/pre>\n<p>Par celle-ci :<\/p>\n<pre>iptables -I INPUT -s $ip -j DROP &gt; \/dev\/nul<\/pre>\n<h2>Rendre ex\u00e9cutable<\/h2>\n<p>Pour rendre le script ex\u00e9cutable :<\/p>\n<pre>$ chmod u+x \/home\/pi\/scripts\/BanAbuseIP.bash<\/pre>\n<h1>Cron<\/h1>\n<p>On va automatiser l&rsquo;ex\u00e9cution du script avec <code>cron<\/code> :<\/p>\n<pre>$ sudo crontab -e<\/pre>\n<p>Et on ajoute ces lignes :<\/p>\n<pre># Banit les IP rep\u00e9r\u00e9es par AbuseIPDB\r\n# R\u00e9p\u00e9tition toutes les 3 minutes\r\n*\/3 * * * * sudo \/home\/pi\/scripts\/BanAbuseIP.bash &gt; \/dev\/null 2&gt;&amp;1<\/pre>\n<p>Le script sera ex\u00e9cut\u00e9 toutes les 3 minutes.<br \/>\nModifiez la p\u00e9riode en fonction du nombre de requ\u00eates qui seront effectu\u00e9es par jour.<br \/>\nAbuseIPDB en permet maximum 3000 par jour.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introduction <\/p>\n<p>Malgr\u00e9 l&rsquo;utilisation de <a href=\"https:\/\/fr.wikipedia.org\/wiki\/Fail2ban\" target=\"_blank\" rel=\"noopener\">Fail2Ban<\/a> et de listes d&rsquo;IP \u00e0 bannir, mon Raspberry Pi subit encore des&#8230;<\/p>\n","protected":false},"author":1,"featured_media":3205,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_newsletter_tier_id":0,"jetpack_publicize_message":"","jetpack_is_tweetstorm":false,"jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","enabled":false}}},"categories":[10,3,173,12],"tags":[321,244,110,92,139,90],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/www.fanjoe.be\/wp-content\/uploads\/2018\/04\/BanAbuseIP-00.png","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.fanjoe.be\/index.php?rest_route=\/wp\/v2\/posts\/3185"}],"collection":[{"href":"https:\/\/www.fanjoe.be\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.fanjoe.be\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.fanjoe.be\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.fanjoe.be\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3185"}],"version-history":[{"count":0,"href":"https:\/\/www.fanjoe.be\/index.php?rest_route=\/wp\/v2\/posts\/3185\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.fanjoe.be\/index.php?rest_route=\/wp\/v2\/media\/3205"}],"wp:attachment":[{"href":"https:\/\/www.fanjoe.be\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3185"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.fanjoe.be\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3185"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.fanjoe.be\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3185"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}