Analyse des mails de rapport DMARC

Dans le cadre de la mise en place de DMARC[1] sur un serveur mail donné, les prestataires externes s'appuyant sur la vérification des champs DMARC pour filtrer les emails entrant sont tenus de vous envoyer un email récapitulatif des actions entreprises chaque jour où ils ont reçu des mails du serveur en question à minuit.

J'ai découvert un petit script permettant de vérifier l'état de ces remontées d'information.

[1] DMARC (HTTPS) [en]

Installation

Ce script requiert

[1] offlineimap (HTTP) [en]

[2] mpack (HTTP) [en]

[3] ce script go (HTTPS) [en]

Configuration

Utiliser la configuration suivante pour offlineimap (ça va récupérer tous les mails de la boîte observée, mais on s'occupera de /fine-tuner/ ça plus tard), à enregistrer dans le ficher `$HOME/.offlineimaprc' (préferez un autre fichier si vous utilisez déjà offlineimap et ne voulez pas déranger votre configuration personnelle).

[Account MonCompte]
localrepository = L ocal_MonCompte
remoterepository = MonCompte

[Repository Local_MonCompte]
type = Maildir
sep = /
localfolders = ~/Mail/MonCompte

[Repository MonCompte]
type = IMAP
remotehost = imap.moncompte.tld
ssl = yes
cert_fingerprint = lalalalalala
remoteport = 993
remoteuser = moi@moncompte.tld
remotepass = lololololo

Puis, créer un dossier de travail qu'on va appeler intelligemment `dmarc' :

$ mkdir -p dmarc/mails

S'assurer que le script `main.go' téléchargé juste avant sur github est bien dans le dossier dmarc que l'on vient de créer. Dans le cadre de la surveillance en mode test, il peut être intéressant de connaître plus précisément les IPs ayant généré des erreurs. Pour cela, ajouter les lignes suivantes à la fin du fichier `main.go' :

--- upstream_main.go    2016-04-04 15:16:25.552078344 +0200
+++ main.go    2016-04-04 15:13:18.452071510 +0200
@@ -98,6 +98,21 @@
     const DATEFMT = "2006-01-02 03:04:05"
     printfLock.Lock()
     defer printfLock.Unlock()
     fmt.Printf("%s,%s,%s,%s,%d,%d,%d\n", fb.DateBegin().UTC().Format(DATEFMT), fb.DateEnd().UTC().Format(DATEFMT),
         fb.Organization, fb.Domain, dispos_none, dispos_quarantine, dispos_reject)
+
+  for _, rec := range fb.Records {
+    fmt.Printf("filedetails,,,%s,%s,%s,%s,%s\n",
+      rec.SourceIP,
+      rec.HeaderFrom,
+      rec.Disposition,
+      rec.EvalSPF,
+      rec.EvalDKIM)
+    }
 }

Ajouter à côté le script suivant dans un fichier nommé `dmarc/parse_dmarc.sh' :

#!/usr/bin/env bash

for file in $(ls -1 mails); do
    go run main.go mails/${file} &> /dev/null
    if [ "$?" = 1 ]; then
        echo "Error in file ${file}"
    fi
done

Utilisation

Dans un premier temps on va extraire tous les pièces jointes des mails contenus dans le dossier DMARC de la boîte à surveiller.

$ cd ~/dmarc/mails
$ munpack ~/Mail/MonCompte/INBOX/DMARC/cur/*

Puis, on fait un peu de nettoyage

$ rm part*
$ rm *.desc
$ unzip *.zip
$ rm *.zip
$ ls -1 | grep gz
toto.xml.gz
tata.xml.gz
$ gzip -d toto.xml.gz tata.xml.gz
$ ...

Bref, il faut s'assurer qu'on n'a plus que des fichiers XML dans ce dossier. Ceci fait, yapuka appeler une première fois le script `parse_dmarc.sh' qui va nous afficher tous les fichiers xml pour lesquels on va avoir des problèmes.

$ ./parse_dmarc.sh
Error with file aol_totottatatiansetnset.xml
Error with file fastmail_ututunasetinetsa.xml

Pour chacun des fichiers listé, les ouvrir et tenter de les ré-enregistrer en utf8. Emacs sait faire ça très bien. Attention, certaine fois l'entête même du fichier xml préciser qu'il s'agit d'un encodage autre (`encoding="windows-1252"') Dans ce cas, penser à modifier cet entête pour y faire figurer `utf-8'.

Enfin, lancer le script go

$ go run main.go mails/* > dmarc.csv

Vous avez désormais un super fichier CSV à ouvrir dans le tableur de votre choix.

Filtrage

Dans le cadre d'une analyse pré-filtrage de DMARC, vous pouvez utiliser les deux commandes ci-dessous pour obtenir la liste des IPs qui échoue la vérification SPF ou DKIM :

$ grep filedetails dmarc.csv | cut -d, -f4,5,7 | grep fail | sort | uniq > fail_spf.csv
$ grep filedetails dmarc.csv | cut -d, -f4,5,8 | grep fail | sort | uniq > fail_dkim.csv

Ces échecs s'explique par le fait que des gens ont paramétrés leur client mail pour utiliser le serveur SMTP de leur FAI pour envoyer des mails depuis une adresse moncompte.tld.

--

📅 lundi 4 avril 2016 à 21:34

📝 Étienne Pflieger with GNU/Emacs 29.4 (Org mode 9.7.11)

🏷️ Bidouille

🏷️ configuration

🏷️ email

🏷️ offlineimap

🏷️ script

🏷️ tutoriel

📜 Back to gemlog

🏡 Back to home

🚀 Propelled by fronde