relecture wording

This commit is contained in:
Gregory Colpart 2017-05-23 19:01:01 +02:00
parent db8fd53624
commit 67a4a900a6

View file

@ -8,9 +8,7 @@ title: Howto Fail2Ban
# Howto Fail2Ban # Howto Fail2Ban
[Fail2Ban](https://www.fail2ban.org) est un service (en Python), qui scanne les logs applicatifs à la recherche d'un pattern particulier (généralement des échecs de connexions) et bannit les adresses IP responsables via le firewall. [Fail2Ban](https://www.fail2ban.org) est un outil qui scanne en permanence des journaux pour détecter des anomalies répétitives et bannir les adresses IP coupables via [IPTables](HowtoIPTables). Nous l'utilisons souvent pour bannir les adresses IP responsables d'erreurs d'authentification répétées sur des services publics comme SMTP, POP, IMAP ou FTP. On peut également être amené à l'utiliser pour SSH mais c'est plus rare car il est évidemment préférable de ne pas ouvrir son serveur SSH de façon publique.
La version présente dans Debian jessie est la v0.8.13.
## Installation ## Installation
@ -51,7 +49,7 @@ Fichiers de configuration :
└── jail.d └── jail.d
~~~ ~~~
Fail2ban repose sur des règles de filtrage définies dans `/etc/fail2ban/filter.d/` et des actions dans `/etc/fail2ban/action.d/`. Fail2Ban repose sur des règles de filtrage définies dans `/etc/fail2ban/filter.d/` et des actions dans `/etc/fail2ban/action.d/`.
On définit ensuite des **jails**, combinaisons d'une règle de filtrage et d'une ou plusieurs actions. On définit ensuite des **jails**, combinaisons d'une règle de filtrage et d'une ou plusieurs actions.
@ -264,35 +262,25 @@ logpath = /var/log/mail.log
## Apache / Nginx ## Apache / Nginx
Il est possible d'utiliser `fail2ban` sur des sites web pour ajouter une couche de protection contre les attaques, ou alors pour répondre à une attaque en cours. Grâce aux journaux *access_log* générés par Apache / Nginx, on peut utiliser Fail2Ban comme protection sur certaines URLs ou l'ensemble des requêtes.
Les deux attaques les plus courantes sur les services HTTP sont les DDOS et les attaques en "brute force". Cela peut être des règles activées en permanence ou des règles spécifiques pour répondre à une attaque DOS ou « brute force » en cours.
Pour les attaques de type DDOS, la chose la plus efficace à faire est d'écrire des règles pour le serveur web (Apache, Nginx, etc.)
Comme `fail2ban` a besoin d'être configuré au cas par cas, il faut utiliser des configurations différentes pour chaque plateforme web. Voici un exemple avec un filtre `/etc/fail2ban/filter.d/dos-http.conf` qui va contrôler l'ensemble des requêtes avec la méthode HTTP GET :
En général, on tente d'être le plus précis possible en configurant `fail2ban` pour regarder les logs d'authentification. Cela permet d'éviter les faux positifs et d'être efficace en cas d'attaque.
On peut protéger Apache des attaques DDOS simples avec les configurations suivantes. Il faut tout d'abord s'assurer qu'Apache enregistre des logs d'accès. On ajoute ensuite un filtre à `fail2ban` dans `/etc/fail2ban/filter.d/ddos-http.conf` :
~~~ ~~~
[Definition]
failregex = ^ -.*GET failregex = ^ -.*GET
~~~ ~~~
Finalement, on modifie `/etc/fail2ban/jail.local` pour ajouter une des deux règles suivantes. Avec cette règle, une personne qui accède plus de 300 fois à une page web sur notre serveur web en 5 minutes va être bannie pendant la période de temps par défaut: puis on définit une jail du type :
~~~{.ini} ~~~{.ini}
[ddos-http-apache] [dos-http]
enabled = true enabled = true
port = http,https port = http,https
filter = ddos-http filter = dos-http
logpath = /var/log/apache2/access.log logpath = access.log
maxretry = 300
findtime = 300
~~~
~~~{.ini}
[ddos-http-nginx]
enabled = true
port = http,https
filter = ddos-http
logpath = /var/log/nginx/access.log
maxretry = 300 maxretry = 300
findtime = 300 findtime = 300
~~~ ~~~
@ -301,11 +289,9 @@ findtime = 300
#### Wordpress sans plugin #### Wordpress sans plugin
Il existe plusieurs options pour configurer `fail2ban` pour Wordpress. Cela découle du fait qu'il n'y a pas de moyen par défaut de logger les authentifications erronées sous Wordpress, et que la page d'authentification ne renvoie pas d'erreur HTTP particulière non plus. ["Une proposition à cet effet"](https://core.trac.wordpress.org/ticket/25446) a cependant été faite et risque éventuellement d'être implémentée. L'option la plus simple pour utiliser Fail2Ban avec Wordpress consiste à détecter un trop grand nombre de tentatives de login dans les journaux *access_log*.
Cette option est la plus simple des trois car elle ne nécessite pas de modifier l'installation Wordpress. Elle a cependant le désavantage d'être très générale et peu créer des faux positifs. C'est celle qui est actuellement utilisée par Évolix. On ajoute un filtre dans `/etc/fail2ban/filter.d/apache-wp.conf` :
Il faut tout d'abord s'assurer que notre serveur web enregistre des logs d'accès. On ajoute ensuite un filtre à `fail2ban` dans `/etc/fail2ban/filter.d/apache-wp.conf`:
~~~ ~~~
[Definition] [Definition]
@ -313,7 +299,7 @@ failregex = <HOST> -.*"POST.*/wp-login.php HTTP.* 200
<HOST> -.*"POST.*/xmlrpc.php.* <HOST> -.*"POST.*/xmlrpc.php.*
~~~ ~~~
Finalement, on modifie `/etc/fail2ban/jail.local` pour ajouter une règle. Avec cette règle, une personne qui accède plus de 5 fois à la page `/wp-login.php` ou à `/xmlrpc.php` dans une période d'une minute va être bannie pendant la période de temps par défaut: puis on définit une jail du type :
~~~{.ini} ~~~{.ini}
[apache-wp] [apache-wp]
@ -321,17 +307,16 @@ enabled = true
port = http,https port = http,https
filter = apache-wp filter = apache-wp
logpath = /var/log/apache2/access.log logpath = /var/log/apache2/access.log
maxretry = 5 maxretry = 10
findtime = 60 findtime = 300
~~~ ~~~
Cette méthode a le défaut de ne pas distinguer les tentatives réussies et échouées, car la page d'authentification ne renvoie pas d'erreur HTTP particulière ( ["Une proposition à cet effet"](https://core.trac.wordpress.org/ticket/25446) a été faite, à suivre). Pour utiliser une méthode plus avancée (permettant notamment d'avoir un _maxretry_ plus strict) voir ci-dessous.
#### Wordpress avec plugin simple #### Wordpress avec plugin simple
Une seconde option est d'utiliser un plugin Wordpress très simple pour envoyer une erreur HTTP 401 en cas d'erreur d'authentification. Cette méthode est plus fine et créé moins de faux positifs, mais nécessite de toucher à l'installation Wordpress. Une deuxième option est d'utiliser un plugin Wordpress pour envoyer une erreur HTTP 401 en cas d'erreur d'authentification. Cette méthode est plus fine mais nécessite de toucher à l'installation Wordpress : il faut installer le plugin dans [wp-content/mu-plugins](https://codex.wordpress.org/Must_Use_Plugins), un dossier spécial qui ne sera pas vu à travers l'interface d'administration web. Il suffit de créer `wp-content/mu-plugins/401-on-login-fail.php` :
Elle est cependant peu invasive car elle fait installe le plugin dans [wp-content/mu-plugins](https://codex.wordpress.org/Must_Use_Plugins), un dossier spécial pour les plugins de ce genre. Typiquement, les mu-plugins ne sont pas vu à travers l'interface d'administration web.
Il faut tout d'abord s'assurer que notre serveur web enregistre des logs d'accès. Par la suite, on installe le plugin dans `wp-content/mu-plugins/401-on-login-fail.php`:
~~~{.php} ~~~{.php}
<?php <?php
@ -341,14 +326,14 @@ function my_login_failed_401() {
add_action( 'wp_login_failed', 'my_login_failed_401' ); add_action( 'wp_login_failed', 'my_login_failed_401' );
~~~ ~~~
On ajoute ensuite un filtre à `fail2ban` dans `/etc/fail2ban/filter.d/apache-wp.conf`: On ajoute ensuite un filtre dans `/etc/fail2ban/filter.d/apache-wp.conf`:
~~~ ~~~{.ini}
[Definition] [Definition]
failregex = <HOST>.*POST.*(wp-login\.php|xmlrpc\.php).* 401 failregex = <HOST>.*POST.*(wp-login\.php|xmlrpc\.php).* 401
~~~ ~~~
Finalement, on modifie `/etc/fail2ban/jail.local` pour ajouter une règle. Avec cette règle, une personne qui accède plus de 5 fois à la page `/wp-login.php` ou à `/xmlrpc.php` dans une période d'une minute va être bannie pendant la période de temps par défaut: puis on définit une jail du type :
~~~{.ini} ~~~{.ini}
[apache-wp] [apache-wp]
@ -358,18 +343,18 @@ filter = apache-wp
logpath = /var/log/apache2/access.log logpath = /var/log/apache2/access.log
/home/user/log/access.log /home/user/log/access.log
maxretry = 5 maxretry = 5
findtime = 60 findtime = 300
~~~ ~~~
#### Wordpress avec plugin Fail2Ban #### Wordpress avec plugin Fail2Ban
La dernière solution utilise le [le plugin Wordpress fail2ban](https://wordpress.org/plugins/wp-fail2ban/) pour enregistrer les authentification dans un fichier de log. `fail2ban` vérifie par la suite ce fichier pour bannir les gens effectuant des attaques. La dernière solution utilise le [plugin Wordpress fail2ban](https://wordpress.org/plugins/wp-fail2ban/) pour enregistrer les authentification dans un fichier de log. Elle nécessite l'installation et la mise à jour régulière du plugin.
Parce qu'elle nécessite l'installation et la mise à jour régulière d'un plugin, elle ne devrait être utilisée que par les personnes administrant le site web en question. Le plugin est disponible sur <https://wordpress.org/plugins/wp-fail2ban/>.
On commence tout d'abord par [installer le plugin](https://wordpress.org/plugins/wp-fail2ban/). Une fois que cela est fait, on ajoute les deux filtres suivants, respectivement dans `etc/fail2ban/filter.d/wordpress-hard` et `etc/fail2ban/filter.d/wordpress-soft`: On ajoute ensuite deux filtres dans `/etc/fail2ban/filter.d/wordpress-hard` et `/etc/fail2ban/filter.d/wordpress-soft` :
~~~{.ini} ~~~
# Fail2Ban configuration file hard # Fail2Ban configuration file hard
# #
# Author: Charles Lecklider # Author: Charles Lecklider
@ -405,7 +390,7 @@ failregex = ^%(__prefix_line)sAuthentication attempt for unknown user .* from <H
ignoreregex = ignoreregex =
~~~ ~~~
~~~{.ini} ~~~
# Fail2Ban configuration file soft # Fail2Ban configuration file soft
# #
# Author: Charles Lecklider # Author: Charles Lecklider
@ -439,93 +424,100 @@ failregex = ^%(__prefix_line)sAuthentication failure for .* from <HOST>$
ignoreregex = ignoreregex =
~~~ ~~~
Finalement, on modifie `/etc/fail2ban/jail.local` pour ajouter les règles suivantes. Avec cette règle, une personne qui tente de se connecter avec un compte inexistant ou qui n'arrive pas à se connecter 5 fois sera bannie pendant la période de temps par défaut: puis on définit deux jails du type :
~~~{.ini} ~~~{.ini}
[wordpress-hard] [wordpress-hard]
enabled = true enabled = true
filter = wordpress-hard port = http,https
logpath = /var/log/auth.log port = http,https
maxretry = 1 filter = wordpress-hard
port = http,https logpath = /var/log/auth.log
maxretry = 1
findtime = 300
[wordpress-soft] [wordpress-soft]
enabled = true enabled = true
filter = wordpress-soft port = http,https
logpath = /var/log/auth.log filter = wordpress-soft
maxretry = 5 logpath = /var/log/auth.log
port = http,https maxretry = 5
findtime = 300
~~~ ~~~
#### ownCloud #### ownCloud
Pour faire fonctionne ownCloud avec fail2ban, il faut tout d'abord modifier le `config.php` pour enregistrer les informations d'authentification: Pour faire fonctionner ownCloud avec Fail2Ban, il faut tout d'abord modifier le fichier `config.php` pour enregistrer les informations d'authentification :
~~~ ~~~
'loglevel' => '2', 'loglevel' => '2',
'log_authfailip' => true, 'log_authfailip' => true,
'logfile' => '/var/log/owncloud.log', 'logfile' => 'owncloud.log',
~~~ ~~~
On ajoute ensuite un filtre à `fail2ban` dans `/etc/fail2ban/filter.d/owncloud.conf`: On ajoute un filtre dans `/etc/fail2ban/filter.d/owncloud.conf` :
~~~ ~~~
[Definition] [Definition]
failregex={"app":"core","message":"Login failed: user '.*' , wrong password, IP:<HOST>","level":2,"time":".*"} failregex={"app":"core","message":"Login failed: user '.*' , wrong password, IP:<HOST>","level":2,"time":".*"}
~~~ ~~~
Finalement, on modifie `/etc/fail2ban/jail.local` pour ajouter une règle. Avec cette règle, une personne qui n'arrive pas à se connecter 5 fois dans une période de 10 minutes sera bannie pendant la période de temps par défaut: puis on définit une jail du type :
~~~{.ini} ~~~{.ini}
[owncloud] [owncloud]
enabled = true enabled = true
filter = owncloud port = http,https
port = http,https filter = owncloud
logpath = /var/log/owncloud.log logpath = owncloud.log
maxrety = 5 maxrety = 5
findtime = 600 findtime = 300
~~~ ~~~
#### Joomla #### Joomla
Il faut tout d'abord s'assurer que notre serveur web enregistre des logs d'accès. On ajoute ensuite un filtre à `fail2ban` dans `/etc/fail2ban/filter.d/apache-joomla.conf`: On va simplement détecter un trop grand nombre de tentatives de login dans les journaux *access_log*.
~~~{.ini} On ajoute un filtre dans `/etc/fail2ban/filter.d/apache-joomla.conf` :
~~~
[Definition] [Definition]
failregex = <HOST> -.*"POST.*/administrator/index.php.* failregex = <HOST> -.*"POST.*/administrator/index.php.*
~~~ ~~~
Finalement, on modifie `/etc/fail2ban/jail.local` pour ajouter une règle. Avec cette règle, une personne qui accède plus de 5 fois à la page `/administrator/index.php` dans une période d'une minute va être bannie pendant la période de temps par défaut: puis on définit une jail du type :
~~~{.ini} ~~~{.ini}
[apache-joomla] [apache-joomla]
enabled = true enabled = true
port = http,https port = http,https
filter = apache-joomla filter = apache-joomla
logpath = /var/log/apache2/access.log logpath = /var/log/apache2/access.log
maxretry = 5 maxretry = 10
findtime = 60 findtime = 300
~~~ ~~~
#### Prestashop #### Prestashop
Il faut tout d'abord s'assurer que notre serveur web enregistre des logs d'accès. On ajoute ensuite un filtre à `fail2ban` dans `/etc/fail2ban/filter.d/apache-prestashop.conf`: On va simplement détecter un trop grand nombre de tentatives de login dans les journaux *access_log*.
~~~{.ini} On ajoute un filtre dans `/etc/fail2ban/filter.d/apache-prestashop.conf` :
~~~
[Definition] [Definition]
failregex = <HOST> -.*"POST.*/login.* failregex = <HOST> -.*"POST.*/login.*
~~~ ~~~
Finalement, on modifie `/etc/fail2ban/jail.local` pour ajouter une règle. Avec cette règle, une personne qui accède plus de 10 fois à la page de connexion pour un compte utilisateur dans une période d'une minute va être bannie pendant la période de temps par défaut: puis on définit une jail du type :
~~~{.ini} ~~~{.ini}
[apache-prestashop] [apache-prestashop]
enabled = true enabled = true
port = http,https port = http,https
filter = apache-prestashop filter = apache-prestashop
logpath = /var/log/apache2/access.log logpath = /var/log/apache2/access.log
maxretry = 10 maxretry = 10
findtime = 60 findtime = 300
~~~ ~~~
## FAQ ## FAQ