notebook/IT/fail2ban.md
2021-04-20 21:01:21 +02:00

331 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Fail2Ban
1. [Les réglages](#Les-reglages)
2. [Fail2Ban cli](#Fail2Ban-cli)
## [](#Les-reglages "Les réglages")Les réglages
Le fichier de configuration global `/etc/fail2ban/fail2ban.conf` ne contient pas grand chose à modifier. Vous pourrez paramétrer lendroit où Fail2Ban doit enregistrer ses logs, la verbosité de ces derniers et modifier les réglages du socket unix. En ce qui me concerne, je ne touche à rien.
`/etc/fail2ban/jail.conf` contient les _jails_ par défaut. Comme il est indiqué en haut du fichier, ce dernier nest pas à modifier directement. On activera les _jails_ dans `/etc/fail2ban/jail.d/defaults-debian.conf` (Debian & Ubuntu), le nom du fichier est certainement différent sur dautres distribs mais vous avez le chemin du répertoire. Vous devriez donc vous y retrouver sans problème.
Dans sa configuration la plus simple, on se contente dactiver les _jails_ proposées par défaut. Voici par exemple une configuration minimaliste mais fonctionnelle.
```ini
[DEFAULT]
destemail = mon-email@mail.fr
sender = root@domaine.fr
[sshd]
enabled = true
[sshd-ddos]
enabled = true
[recidive]
enabled = true
```
On peut néanmoins y ajouer encore quelques détails. De plus sachez que pour chaque _jail_ ainsi que pour `[DEFAULT]`, vous pouvez préciser `ignoreip`, qui permet, comme son nom lindique, de ne pas considérer certaines ip ou blocs dip. Pratique pour ne pas se retrouver à la porte de son propre serveur.
```ini
[DEFAULT]
destemail = mon-email@mail.fr
sender = root@domaine.fr
ignoreip = 127.0.0.1/8
[sshd]
enabled = true
[apache]
enabled = true
```
Vous voyez par exemple que jai ici aussi ajouté `apache`. Si vous avez un serveur Apache, cela peut savérer utile. Pensez bien à parcourir le `jail.conf` ainsi que les filtres prédéfinis dans `filter.d` afin de voir ce qui existe par défaut et activez ou non des _jails_ selon vos besoins.
Ce nest pas tout, dautres options courantes sont à connaître :
*`port` permet de préciser les ports à bloquer,
*`logpath` indique le fichier de log à analyser,
*`maxretry` le nombre doccurences dans le fichier de log avant que laction ne soit déclenchée,
*`findtime` permet de spécifier le laps de temps pendant lequel on considère les occurences (au dela de findtime, on repart à zéro),
*`bantime` définit le temps que lip restera bloquée via Fail2Ban.
```ini
[…]
[sshd]
enabled = true
maxretry = 10
findtime = 120
bantime = 1200
```
Si vous parcourez `/etc/fail2ban/jail.conf`, vous pourrez voir les autres options qui sappliquent par défaut si vous ne les redéfinissez pas.
Enfin, vous pouvez également définir `backend`. Il sagit de la méthode de _surveillance_ des logs. Quatre méthodes sont proposées :
*`pyinotify` : un module Python permettant de monitorer les modifications sur un fichier.
*`gamin` : même usage que le précédent, mais il sagit dun module du projet Gnome.
*`polling` : le fichier est simplement vérifier à intervales régulièrs afin de vérifier sil y a eu des écritures.
*`systemd` : ici, Fail2Ban se greffe sur SystemD afin dêtre alerté de nouveaux logs.
*`auto` : mode automatique, qui va tenter toutes les solutions sus-mentionnées, dans cet ordre.
On peut donc dans la plupart des cas laisser `auto`. Sachez quil est toutefois possible de définir le `backend` au cas par cas au niveau de chaque jail.
### [](#Ajout-de-nouveaux-filtres "Ajout de nouveaux filtres")Ajout de nouveaux filtres
Ce qui est génial avec Fail2Ban, cest quil est possible dajouter autant de _jails_ que lon veut. Si vous savez utiliser les [REGEX](https://buzut.net/la-puissance-des-regex/), vous savez écrire une _jail_ !
Nous commençons par créer un filtre afin de détecter les tentatives de connexion infructueuses. Dans un tel cas, notre applicatif devrait renvoyer une erreur 401. Voici un exemple de log que nous allons matcher :
```log
80.214.431.42 - - [14/Oct/2018:21:27:32 +0200] "POST /users/login HTTP/2.0" 401 30 "https://app.buzeo.me/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:63.0) Gecko/20100101 Firefox/63.0" "-"
```
Voici à quoi ressemble notre filtre (`/etc/fail2ban/filter.d/nginx-unauthorized`).
```ini
[Definition]
failregex = - - \[.*\] ".*" 401
ignoreregex =
```
Cest aussi simple que ça ! `<HOST>`, vous laurez deviné, permet à Fail2Ban de matcher une ip ou un nom dhôte et de capturer cette adresse afin de la bloquer dans `iptables`. Le reste est assez classique. La `failregex` peut contenir plusieurs lignes, dans ce cas, chacune sera matchée de manière indépendante. Quant à l`ignoreregex` son nom est assez explicite et elle permet de ne pas tenir compte dun pattern donné.
Modifions maintenant notre configuration dans `/etc/fail2ban/jail.d/defaults-debian.conf` pour activer notre nouveau filtre.
```ini
[…]
[nginx-unauthorized]
enabled = true
filter = nginx-unauthorized
port = 80,443
logpath = /var/log/nginx/access.log
maxretry = 5
findtime = 120
bantime = 300
```
## [](#Fail2Ban-cli "Fail2Ban cli")Fail2Ban cli
Fail2Ban possède plusieurs clients fort pratiques. `fail2ban-regex` permet de valider vos filtres et `fail2ban-client` permet de gérer tous les autres aspects du logiciel, de la vérification du contenu dune jail au redémarrage de loutil. Commençons par un rapide aperçu de loutil regex.
```bash
fail2ban-regex <fichier-de-log | string-représentant-une-ligne-de-log> <chemin-du-filtre | string-regex> [<chemin-du-filtre | string-ignoregex]
fail2ban-regex /var/log/nginx/access.log /etc/fail2ban/filter.d/nginx-unauthorized.conf
```
Ce nest pas un bug, si vous voulez tester une `ignoreregex` depuis un fichier de filtre, il faut renseigner le chemin deux fois. Fort utile, le `fail2ban-regex` nen est pas moins très simple dusage.
Passons maintenant au “centre de commandement” de Fail2ban : `fail2ban-client`. Ce dernier outil permet de vérifier létat de Fail2Ban comme les _jails_ activées, le nombres dip bloquées etc. Voyons les fonctions les plus utiles.
Tout dabord, il est bon de préciser que cet outil peut avantageusement sutiliser en mode interactif, pour lancer le mode interactif, on invoque la commande avec loption `-i`.
### [](#Commandes-de-base "Commandes de base")Commandes de base
Les commandes de bases sont `start`, `reload`, `stop`, `status`, `ping`, `help`. Si la plupart dentre elles se passent dexplications, attardons nous sur
`start`
Lance le serveur et les jails.
`reload`
recharge la configuration.
`reload <JAIL>`
recharge la configuration d'une jail uniquement.
`stop`
Arrête le serveur.
`status`
Retourne le statut du serveur : nombre de jails, filtres, nombres de fails…
`ping`
Permet simplement de s'assurer que le serveur répond.
`help`
Retourne l'ensemble des commandes possibles.
Voici par exemple le retour de la commande `status`, nous nutilisons pas ici le mode interactif.
```bash
fail2ban-client status
Status
|- Number of jail: 4
`- Jail list: ssh-ddos, nginx-errors, recidive, ssh
```
### [](#Le-logging "Le logging")Le logging
Le logging est le cœur même de Fail2Ban, car sans logs, loutil ne pourrait pas fonctionner. Loutil génère lui-même ses logs, explorables via la cli. Voyons donc quelles sont les options offertes par cette dernière.
`set loglevel`
Définit le niveau de logging.
`get loglevel`
Retourne le niveau de logging.
`set logtarget`
Définit la cible des logs (`STDOUT`, `STDERR`, `SYSLOG` ou chemin vers un fichier).
`get logtarget`
Retourne le chemin du fichier de log (ou autre si ce n'est pas un fichier).
`flushlogs`
Vide le fichier de logs (si disponible). Cette fonction est dédié à la rotation.
### [](#Base-de-donnees "Base de données")Base de données
Fail2Ban possède une base de données interne SQLite. Cette dernière permet de persister des informations entre redémarrages, notamment les ips à bloquer et de recréer les règles iptables au démarrage.
`set dbfile`
Définir la localisation de la base de données.
`get dbfile`
Retourne le chemin de la base de données.
`set dbpurgeage`
Définit la durée de rétention des informations dans la base de données.
`get dbpurgeage`
Récupère le nombre de secondes de rétentions des informations en base de données de la configuration actuelle.
### [](#Controle-et-information-concernant-les-jails "Contrôle et information concernant les jails")Contrôle et information concernant les jails
Le contrôle des prison est le nerf de la guerre dans Fail2Ban. Découvrons quelles sont les actions à notre disposition. Ci dessus les principales actions de contrôle.
`add <JAIL> <BACKEND>`
Active une jail et définit son backend (on mettra \`auto\` la plupart du temps).
`start <JAIL>`
Démarre une jail arrêtée.
`stop <JAIL>`
Arrête et désactive une jail.
`status <JAIL>`
Retourne les détails d'une jail en particulier.
Voici par exemple le statut dune jail.
```bash
fail2ban-client status ssh
Status for the jail: ssh
|- filter
| |- File list: /var/log/auth.log
| |- Currently failed: 0
| `- Total failed: 4499
`- Actions
|- Currently banned: 1
|- Total banned: 274
`- IP list: 176.140.156.45
```
Voyons maintenant plus en détails comment obtenir des informations détaillées concernant des jails en particulier.
`get <JAIL> logpath`
Retourne le chemin du fichier de log analysé par cette jail.
`get <JAIL> logencoding`
Récupère l'encodage du fichier de log utilisé par cette jail.
`get <JAIL> journalmatch`
Récupére les entrées du fichier de log matchées par cette jail.
`get <JAIL> ignoreip`
Affiche les ips ignorées.
`get <JAIL> ignorecommand`
Affiche les entrée du \`ignorecommand\` de cette jail.
`get <JAIL> failregex`
Affiche la \`failregex\` de cette jail.
`get <JAIL> ignoreregex`
Affiche l'\`ignoreregex\` de cette jail.
`get <JAIL> findtime`
Retourne le délai pris de prise en comtpe de tantatives pour cette jail.
`get <JAIL> bantime`
Retourne la durée de banissement pour cette jail.
`get <JAIL> maxretry`
Retourne le nombre d'erreurs tolérées avant banissement.
`get <JAIL> maxlines`
Retourne le nombre maximum de lignes analysées.
`get <JAIL> actions`
Affiche l'ensemble des actions liées à cette jail.
Enfin, il est également possible daltérer les paramètres des jails directement via la ligne de commande. Bien quon utilise en général directement les fichiers de configuration pour cela, ces commandes peuvent savérer particulièrement utiles afin de bannir ou dé-bannir manuellement des adresses.
```bash
fail2ban-client set <JAIL> banip <IP>
fail2ban-client set <JAIL> unbanip <IP>
```
Il ne sagit pas dune liste exhaustive des possibilités offertes pas la ligne de commande Fail2Ban. De nombreux paramètres habituellement configurés via les fichiers de configuration sont également paramétrables via la CLI. Pour connaître toutes les possibilités, il suffit dutiliser la commande `help`.
Sachez cependant que Fail2Ban a encore dautres tours dans son sac. En cas de match, il peut accomplir nimporte quel comportement (envoyer un email, rediriger vers une autre ip…). Pour en savoir plus je vous invite à lire la partie concernant les [actions de cet article](https://www.it-connect.fr/filtres-et-actions-personnalises-dans-fail2ban/#IV_Creation_dune_action_personnalisee) et [celui-ci en anglais](https://www.digitalocean.com/community/tutorials/how-fail2ban-works-to-protect-services-on-a-linux-server#examining-the-action-file).