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
[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.
La version présente dans Debian jessie est la v0.8.13.
[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.
## Installation
@ -51,7 +49,7 @@ Fichiers de configuration :
└── 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.
@ -264,35 +262,25 @@ logpath = /var/log/mail.log
## 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.
Les deux attaques les plus courantes sur les services HTTP sont les DDOS et les attaques en "brute force".
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.
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` :
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.
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.
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 :
~~~
[Definition]
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}
[ddos-http-apache]
[dos-http]
enabled = true
port = http,https
filter = ddos-http
logpath = /var/log/apache2/access.log
maxretry = 300
findtime = 300
~~~
~~~{.ini}
[ddos-http-nginx]
enabled = true
port = http,https
filter = ddos-http
logpath = /var/log/nginx/access.log
filter = dos-http
logpath = access.log
maxretry = 300
findtime = 300
~~~
@ -301,11 +289,9 @@ findtime = 300
#### 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.
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`:
On ajoute un filtre dans `/etc/fail2ban/filter.d/apache-wp.conf` :
~~~
[Definition]
@ -313,7 +299,7 @@ failregex = <HOST> -.*"POST.*/wp-login.php HTTP.* 200
<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}
[apache-wp]
@ -321,17 +307,16 @@ enabled = true
port = http,https
filter = apache-wp
logpath = /var/log/apache2/access.log
maxretry = 5
findtime = 60
maxretry = 10
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
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.
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`:
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` :
~~~{.php}
<?php
@ -341,14 +326,14 @@ function 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]
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}
[apache-wp]
@ -358,18 +343,18 @@ filter = apache-wp
logpath = /var/log/apache2/access.log
/home/user/log/access.log
maxretry = 5
findtime = 60
findtime = 300
~~~
#### 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
#
# Author: Charles Lecklider
@ -405,7 +390,7 @@ failregex = ^%(__prefix_line)sAuthentication attempt for unknown user .* from <H
ignoreregex =
~~~
~~~{.ini}
~~~
# Fail2Ban configuration file soft
#
# Author: Charles Lecklider
@ -439,93 +424,100 @@ failregex = ^%(__prefix_line)sAuthentication failure for .* from <HOST>$
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}
[wordpress-hard]
enabled = true
filter = wordpress-hard
logpath = /var/log/auth.log
maxretry = 1
port = http,https
enabled = true
port = http,https
port = http,https
filter = wordpress-hard
logpath = /var/log/auth.log
maxretry = 1
findtime = 300
[wordpress-soft]
enabled = true
filter = wordpress-soft
logpath = /var/log/auth.log
maxretry = 5
port = http,https
enabled = true
port = http,https
filter = wordpress-soft
logpath = /var/log/auth.log
maxretry = 5
findtime = 300
~~~
#### 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',
'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]
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}
[owncloud]
enabled = true
filter = owncloud
port = http,https
logpath = /var/log/owncloud.log
maxrety = 5
findtime = 600
enabled = true
port = http,https
filter = owncloud
logpath = owncloud.log
maxrety = 5
findtime = 300
~~~
#### 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]
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}
[apache-joomla]
enabled = true
port = http,https
filter = apache-joomla
logpath = /var/log/apache2/access.log
maxretry = 5
findtime = 60
enabled = true
port = http,https
filter = apache-joomla
logpath = /var/log/apache2/access.log
maxretry = 10
findtime = 300
~~~
#### 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]
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}
[apache-prestashop]
enabled = true
port = http,https
filter = apache-prestashop
logpath = /var/log/apache2/access.log
maxretry = 10
findtime = 60
enabled = true
port = http,https
filter = apache-prestashop
logpath = /var/log/apache2/access.log
maxretry = 10
findtime = 300
~~~
## FAQ