# Sécuriser Postfix avec fail2ban

Cédrix - 2024-07-24

#debian #postfix #fail2ban #php #bash

---

## Introduction

Le fichier [/etc/fail2ban/jail.local](_files/fail2ban/etc/fail2ban/jail.local) est un fichier de configuration pour [Fail2Ban](fail2ban.md) qui spécifie les "jails" à surveiller et les actions à entreprendre en cas de tentatives de connexion échouées ou malveillantes. Chaque jail est configurée pour surveiller un service particulier (comme SSH, Postfix, ou Pure-FTPd) en utilisant des fichiers de filtre définis dans des fichiers séparés, comme [/etc/fail2ban/filter.d/postfix-sasl.conf](_files/fail2ban/etc/fail2ban/filter.d/postfix-sasl.conf).

Pour renforcer la sécurité de nos services, nous allons configuré Fail2Ban pour surveiller et bloquer les tentatives de connexion malveillantes.

## Configurer les règles de filtrage postfix-sasl (Ban2Fail)

La configuration du fichier `/etc/fail2ban/filter.d/postfix-sasl.conf` pour Fail2Ban est utilisée pour détecter les échecs d'authentification SASL (Simple Authentication and Security Layer) dans les journaux de Postfix. Voici une explication détaillée de chaque section et ligne de ce fichier :


- **[INCLUDES]** : Cette section permet d'inclure des configurations communes avant de traiter les définitions spécifiques à ce filtre.
- **before = common.conf** : Inclut le fichier `common.conf` avant d'appliquer les définitions de ce fichier. `common.conf` contient des paramètres communs utilisés par plusieurs filtres.

- **[Definition]** : Cette section contient les définitions spécifiques au filtre.
- **_daemon = postfix/smtpd** : Définit le démon à surveiller, ici `postfix/smtpd`, qui est le processus de réception de courrier de Postfix.


- **failregex** : Cette directive définit les expressions régulières utilisées pour détecter les tentatives d'authentification échouées dans les journaux de Postfix. 

Les expressions régulières suivantes sont définies :

1. `warning: .*\[<HOST>\]: SASL LOGIN authentication failed` :
   - Cette regex correspond aux lignes de journal qui contiennent un avertissement indiquant un échec d'authentification SASL LOGIN. 
   - **<HOST>** est une variable utilisée par Fail2Ban pour capturer l'adresse IP de l'attaquant.

2. `improper command pipelining after CONNECT from .*\[<HOST>\]:` :
   - Cette regex correspond aux lignes de journal indiquant une tentative de connexion incorrecte après la commande CONNECT, souvent indicative de comportements suspects ou de tentatives de contournement des protocoles de sécurité.


- **ignoreregex** : Cette directive permet de définir des expressions régulières pour ignorer certaines lignes des journaux, même si elles correspondent à `failregex`. Dans ce cas, `ignoreregex` est vide, ce qui signifie qu'aucune ligne n'est ignorée.


## Tester les règle Fail2ban

`fail2ban-regex` offre un moyen puissant de valider, déboguer et optimiser les filtres Fail2Ban, assurant ainsi que seules les activités malveillantes sont détectées et bloquées.

L'utilisation de `fail2ban-regex` implique principalement deux éléments : le fichier de journal à analyser et le fichier de filtre contenant les expressions régulières. Voici comment vous pouvez l'utiliser :

```sh
fail2ban-regex [fichier_journal] [fichier_filtre]
```

### Exemple Pratique

Supposons que vous souhaitiez tester un filtre Fail2Ban pour les tentatives d'authentification échouées de Postfix SASL. Vous avez un fichier de journal `/var/log/mail.log` et un fichier de filtre `/etc/fail2ban/filter.d/postfix-sasl.conf`.

```sh
sudo fail2ban-regex /var/log/mail.log /etc/fail2ban/filter.d/postfix-sasl.conf
```

Cette commande analysera le fichier de journal en utilisant les expressions régulières définies dans le fichier de filtre et affichera les résultats.

La sortie de `fail2ban-regex` est divisée en plusieurs sections :

1. **Summary** : Un résumé des lignes analysées, du nombre de correspondances trouvées et des lignes ignorées.
2. **Success, Ignored, Missed** : Montre quelles lignes de journal ont été capturées avec succès par les expressions régulières, lesquelles ont été ignorées, et lesquelles ont été manquées.
3. **Matches** : Affiche les correspondances spécifiques trouvées dans les journaux.
4. **Lines** : Montre les lignes de journal exactes qui correspondent ou non aux expressions régulières.



## Automatisation de l'ajout d'adresses IP malveillantes

Comment automatiser l'ajout des adresses IP suspectes détectées dans les journaux de Postfix SASL à Fail2Ban, en utilisant un script PHP ? L'objectif est de renforcer la sécurité de votre serveur de messagerie en bloquant automatiquement les adresses IP qui tentent des connexions malveillantes et qui seraient passées à travers les mailles du filet.

Le script [ban_ip_sasl.php](_files/fail2ban/home/cedrix/ban-ip-sasl.php) est écrit en PHP et utilise Fail2Ban pour analyser les journaux de Postfix SASL, extraire les adresses IP malveillantes et les ajouter à la liste de bannissement.

### Revue de Code : Script PHP pour Automatiser le Bannissement des Adresses IP avec Fail2Ban

Ce script PHP vise à automatiser l'ajout d'adresses IP suspectes détectées dans les journaux de Postfix SASL à la liste de bannissement de Fail2Ban. Voici une revue de code détaillée, mettant en évidence les points forts, les aspects à améliorer et les suggestions pour une meilleure pratique.

#### Points Forts

1. **Automatisation Efficace** : Le script permet d'automatiser le processus de surveillance des journaux et de bannissement des IPs, réduisant ainsi la charge administrative.
2. **Utilisation des Outils Existants** : Le script utilise `fail2ban-regex` et `fail2ban-client`, tirant parti des outils Fail2Ban pour extraire et gérer les adresses IP.
3. **Gestion des Fichiers Temporaires** : La création et la suppression de fichiers temporaires permettent de traiter les données sans laisser de traces inutiles sur le système.
4. **Vérification des IPs Déjà Bannies** : Avant de bannir une adresse IP, le script vérifie si elle est déjà bannie, évitant ainsi des opérations redondantes.

#### Aspects à Améliorer

1. **Utilisation de `exec` et `shell_exec`** : L'utilisation de ces fonctions peut poser des risques de sécurité si les entrées ne sont pas correctement échappées. Bien que ce script soit destiné à un usage interne, il est crucial de minimiser les risques d'injection de commandes.
2. **Gestion des Erreurs** : Le script ne gère pas les erreurs potentielles de manière exhaustive. Par exemple, si `fail2ban-regex` ou `fail2ban-client` échoue, le script ne le détecte pas et continue son exécution.
3. **Permissions** : L'exécution de commandes avec `sudo` nécessite que le script soit exécuté avec les privilèges appropriés. Une meilleure approche pourrait être d'exécuter le script en tant qu'utilisateur root directement, ou de configurer `sudo` pour permettre des commandes spécifiques sans mot de passe.
4. **Validation des Entrées et des Sorties** : Avant d'exécuter les commandes, valider les chemins des fichiers et les entrées pour s'assurer qu'ils sont sûrs et existent.
5. **Gestion des Erreurs** : Implémentez une gestion des erreurs robustes en vérifiant les codes de retour des commandes et en ajoutant des messages d'erreur appropriés.
6. **Logging** : Ajouter des logs pour suivre les actions du script, ce qui facilite le débogage et la surveillance des opérations.
7. **Sécurisation des Commandes** : Utiliser des fonctions PHP pour échapper correctement les arguments de commande et minimiser les risques d'injection.
8. **Documentation** : Ajouter des commentaires détaillés et une documentation pour expliquer le fonctionnement du script et les prérequis nécessaires.

#### Exemple d'Amélioration pour la Gestion des Erreurs

Au lieu de :
```php
exec("sudo fail2ban-regex $logFile $filterFile --print-all-matched > $tempLog");
```

Vous pouvez utiliser :
```php
$returnVar = 0;
$output = [];
exec("sudo fail2ban-regex " . escapeshellarg($logFile) . " " . escapeshellarg($filterFile) . " --print-all-matched > " . escapeshellarg($tempLog), $output, $returnVar);
if ($returnVar !== 0) {
    echo "Erreur lors de l'exécution de fail2ban-regex.\n";
    exit(1);
}
```


Après 12 heures de fonctionnement, il y a plus de 388 adresses repertoriées.

```log
Status for the jail: postfix-sasl
|- Filter
|  |- Currently failed:	31
|  |- Total failed:	31
|  `- File list:	/var/log/mail.log
`- Actions
   |- Currently banned:	388
   |- Total banned:	388
   `- Banned IP list:	x.x.x.x x.x.x.x x.x.x.x x.x.x.x x.x.x.x
   ...

```

### Retour d'expérience

Après seulement 12 heures de fonctionnement, le script a permis de répertorier plus de 388 adresses IP suspectes. 

Ce résultat impressionnant laisse entrevoir la possibilité de développer un service en ligne qui centraliserait ces adresses IP suspectes à l'instar de [SpamHaus](https://spamhaus.org). Voici comment ce service pourrait fonctionner et les avantages qu'il apporterait :

1. **Centralisation des Données**
   - Le service recueillerait les adresses IP suspectes de différents serveurs et sources. Chaque serveur exécutant le script pourrait envoyer ses données à une base de données centralisée.

2. **Base de Données Partagée**
   - Les adresses IP recueillies seraient stockées dans une base de données accessible en ligne. Cette base de données serait régulièrement mise à jour et maintenue pour assurer la pertinence des informations.

3. **API d'Interrogation**
   - Un API (Application Programming Interface) permettrait une interaction avec les données. Cela faciliterait l'intégration avec d'autres systèmes de sécurité et permettrait une réponse rapide aux menaces potentielles.

4. **Rapports et Analyses**
   - Le service pourrait générer des rapports détaillés sur les tendances des attaques, les adresses IP les plus fréquentes, et les types d'attaques les plus courants. Ces informations seraient précieuses pour ajuster les stratégies de sécurité.

6. **Accès Sécurisé**
   - Pour garantir la sécurité et l'intégrité des données, l'accès à ce service en ligne serait restreint aux utilisateurs autorisés. Des mesures de sécurité, telles que l'authentification multi-facteurs, seraient mises en place.



## Vérifier la jail postfix-sasl (Fail2Ban)

L'utilisation de la commande `sudo fail2ban-client status postfix-sasl` est destinée à vérifier l'état du service Fail2Ban pour la jail spécifique `postfix-sasl`. Cette commande affiche des informations sur les adresses IP qui ont été bannies et les actions effectuées par Fail2Ban pour protéger le serveur de messagerie Postfix contre les tentatives de connexion SASL (Simple Authentication and Security Layer) échouées.

Voici comment cette commande fonctionne et ce que chaque partie signifie :

1. **sudo** : Exécute la commande avec des privilèges administratifs.
2. **fail2ban-client** : Interface en ligne de commande pour interagir avec le service Fail2Ban.
3. **status** : Paramètre de la commande Fail2Ban pour afficher l'état.
4. **postfix-sasl** : Nom de la jail pour laquelle l'état est demandé.

### Exemple de sortie de la commande

Lors de l'exécution de la commande, la sortie pourrait ressembler à ceci :

```
Status for the jail: postfix-sasl
|- Filter
|  |- Currently failed: 3
|  |- Total failed: 124
|  `- File list:    /var/log/mail.log
`- Actions
   |- Currently banned: 2
   |- Total banned: 5
   `- Banned IP list:   192.168.1.100 192.168.1.101
```

### Explication des résultats

- **Currently failed** : Nombre de tentatives de connexion échouées actuellement enregistrées.
- **Total failed** : Nombre total de tentatives de connexion échouées depuis la dernière réinitialisation.
- **File list** : Liste des fichiers de log surveillés pour détecter les tentatives de connexion échouées.
- **Currently banned** : Nombre d'adresses IP actuellement bannies.
- **Total banned** : Nombre total d'adresses IP bannies depuis la dernière réinitialisation.
- **Banned IP list** : Liste des adresses IP actuellement bannies.

