Analyse des mails de rapport DMARC
Dans le cadre de la mise en place de DMARC 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.
Installation
Ce script requiert
- offlineimap (dispo en paquet debian ou AUR)
- mpack (idem)
- ce script go
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.