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.
Ce script requiert
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
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.
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)