notes-techniques/notes/serveur/fail2ban-postfix-sasl.md

122 lines
8.4 KiB
Markdown

# Sécuriser Postfix avec fail2ban
Cédrix - 2024-07-24
## 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.
## 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);
}
```
## 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.