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

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).

1:  $ cat ~/.offlineimaprc
2:  [Account MonCompte]
3:  localrepository = Local_MonCompte
4:  remoterepository = MonCompte
5:  
6:  [Repository Local_MonCompte]
7:  type = Maildir
8:  sep = /
9:  localfolders = ~/Mail/MonCompte
10: 
11: [Repository MonCompte]
12: type = IMAP
13: remotehost = imap.moncompte.tld
14: ssl = yes
15: cert_fingerprint = lalalalalala
16: remoteport = 993
17: remoteuser = moi@moncompte.tld
18: 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

1:  $ diff -u upstream_main.go main.go
2:  --- upstream_main.go    2016-04-04 15:16:25.552078344 +0200
3:  +++ main.go    2016-04-04 15:13:18.452071510 +0200
4:  @@ -98,6 +98,21 @@
5:       const DATEFMT = "2006-01-02 03:04:05"
6:       printfLock.Lock()
7:       defer printfLock.Unlock()
8:       fmt.Printf("%s,%s,%s,%s,%d,%d,%d\n", fb.DateBegin().UTC().Format(DATEFMT), fb.DateEnd().UTC().Format(DATEFMT),
9:           fb.Organization, fb.Domain, dispos_none, dispos_quarantine, dispos_reject)
10: +
11: +  for _, rec := range fb.Records {
12: +    fmt.Printf("filedetails,,,%s,%s,%s,%s,%s\n",
13: +      rec.SourceIP,
14: +      rec.HeaderFrom,
15: +      rec.Disposition,
16: +      rec.EvalSPF,
17: +      rec.EvalDKIM)
18: +    }
19:  }

Ajouter à côté le script suivant :

1:  $ cat ~/dmarc/parse_dmarc.sh
2:  #!/usr/bin/env bash
3:  
4:  for file in $(ls -1 mails); do
5:      go run main.go mails/${file} &>/dev/null
6:      if [ "$?" = 1 ]; then
7:          echo "Error in file ${file}"
8:      fi
9:  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 peut 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'ils 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.