Traitement et visualisation des rapports dmarc (Debian 11)
Traitement et visualisation de vos rapports dmarc. Tuto fonctionnel et tester à partir de Debian 11 (Nom de code "bullseye")
Introduction
DMARC est un protocole ouvert d'authentification du courrier électronique qui assure la protection du canal de courrier électronique au niveau du domaine. L'authentification DMARC détecte et empêche les techniques d'usurpation de courrier électronique. Le spoofing est un type d'attaque via laquelle l'adresse du champ De d'un e-mail est falsifiée. Un message de spoofing semble provenir de l'organisation ou du domaine usurpé.
DMARC s'appuie sur deux normes existances SPF ET DKIM.
Cerise sur le gâteau DMARC permet de recevoir régulièrement des rapports de la part des serveurs de messagerie qui reçoivent des messages de votre ou vos domaines et/ou organisations. Mais ces rapports ne sont pas faciles à traiter ou visualiser (Fichier XML Compressé envoyé en pièce jointe)
Si vous avez donc précisé une adresse mail dans votre enregistrement DMARC vous allez recevoir quotidiennement des emails de rapport. Ces rapports s'ils ne sont pas traités sont difficiles à lire...
En voici un exemple...
<?xml version="1.0" encoding="UTF-8" ?> <feedback> <report_metadata> <org_name>google.com</org_name> <email>noreply-dmarc-support@google.com</email> <extra_contact_info>https://support.google.com/a/answer/2466580</extra_contact_info> <report_id>5273193057315324027</report_id> <date_range> <begin>1666742400</begin> <end>1666828799</end> </date_range> </report_metadata> <policy_published> <domain>forum-debian.fr</domain> <adkim>r</adkim> <aspf>s</aspf> <p>reject</p> <sp>reject</sp> <pct>75</pct> </policy_published> <record> <row> <source_ip>2a01:4f9:2a:29f::2</source_ip> <count>1</count> <policy_evaluated> <disposition>none</disposition> <dkim>pass</dkim> <spf>pass</spf> </policy_evaluated> </row> <identifiers> <header_from>forum-debian.fr</header_from> </identifiers> <auth_results> <dkim> <domain>forum-debian.fr</domain> <result>pass</result> <selector>default</selector> </dkim> <spf> <domain>forum-debian.fr</domain> <result>pass</result> </spf> </auth_results> </record> <record> <row> <source_ip>95.216.2.96</source_ip> <count>1</count> <policy_evaluated> <disposition>none</disposition> <dkim>pass</dkim> <spf>pass</spf> </policy_evaluated> </row> <identifiers> <header_from>forum-debian.fr</header_from> </identifiers> <auth_results> <dkim> <domain>forum-debian.fr</domain> <result>pass</result> <selector>default</selector> </dkim> <spf> <domain>forum-debian.fr</domain> <result>pass</result> </spf> </auth_results> </record> </feedback>
Prérequis
Une debian à jour (Bullseye ou Bookworm)
# apt update && apt upgrade -y
Un serveur Web (Apache/Nginx/Lighttpd), PHP et Mysql (Posgres fait aussi l'affaire mais ce ne sera pas traité ici)
Installation
Dmarc Parser
Le "Parser" est chargé de traiter les rapports et d'injecter les informations obtenues dans une base de donnée. J'ai choisi de traiter directement le répertoire d'une boite IMAP (Dovecot). Deux fois par jour le script vérifie s'il n'y a pas de nouveaux rapports, et les traitent si nécessaire.
Prérequis
# apt update
# apt install git
# apt install libfile-mimeinfo-perl libmail-imapclient-perl libmime-tools-perl libxml-simple-perl libio-socket-inet6-perl libio-socket-ip-perl libperlio-gzip-perl libmail-mbox-messageparser-perl unzip
# apt install libdbd-mysql-perl
ou si vous avez choisi PostgreSQL
# apt install libdbd-mysql-perl
Le script PERL a besoin des modules suivants pour fonctionner:
# cpan install Mail::IMAPClient
# cpan install Mail::Mbox::MessageParser
# cpan install XML::Simple module
# cpan install PerlIO::gzip module
S'il en manque vous obtiendrez ce genre d'erreur:
# ./dmarcts-report-parser.pl
Can't locate Mail/IMAPClient.pm in @INC (you may need to install the Mail::IMAPClient module) (@INC contains: /etc/perl /usr/local/lib/x86_64-linux-gnu/perl/5.32.1 /usr/local/share/perl/5.32.1 /usr/lib/x86_64-linux-gnu/perl5/5.32 /usr/share/perl5 /usr/lib/x86_64-linux-gnu/perl-base /usr/lib/x86_64-linux-gnu/perl/5.32 /usr/share/perl/5.32 /usr/local/lib/site_perl) at ./dmarcts-report-parser.pl line 63. BEGIN failed--compilation aborted at ./dmarcts-report-parser.pl line 63.}}
Clonage du dépôt
# cd /usr/local/bin
# git clone https://github.com/techsneeze/dmarcts-report-parser.git
Création de la base de données
Tout sera fait en 2 lignes de commandes (Création base et importation tables)
# wget https://www.taugh.com/rddmarc/mkdmarc
Vous prendrez grand soin de modifier les deux dernières lignes du fichier que vous venez de téléchargé (A minima modifiez le mot de passe...)
# nano mkdmarc
... GRANT all on dmarc.* to dmarc identified by 'xxx'; GRANT all on dmarc.* to dmarc@localhost identified by 'xxx';
Vous créez ensuite la base et importez les tables:
# mysqladmin -u root -p create dmarc
# mysql -u root -p dmarc < mkdmarc
Vous allez ensuite préparer le fichier de configuration:
# cp dmarcts-report-parser/dmarcts-report-parser.conf.sample dmarcts-report-parser/dmarcts-report-parser.conf
Je vais mettre en évidence les variables primordiales)
# nano dmarcts-report-parser/dmarcts-report-parser.conf
... $dbname = 'dmarc'; $dbuser = 'dmarc'; $dbpass = 'xxx'; $dbhost = 'localhost'; # Set the hostname if we can't connect to the local socket. $dbport = '3306'; ... $imapserver = 'imap.domaine.tld'; $imapuser = 'user@domaine.tld'; $imappass = 'yyy'; $imapport = '143'; ... $imapreadfolder = 'INBOX.Dmarc'; ... $imapmovefolder = 'INBOX.Dmarc.Processed'; ... $imapmovefoldererr = 'INBOX.Dmarc.notProcessed';
Bien entendu les noms des boites mails doivent exister.
Ici j'ai utilisé le dossier Dmarc (Que j'ai créé dans la boite de réception) et les sous-dossiers Processed et notProcessed
Mon dossier Dmarc reçoit (grâce à un filtre Sieve créé dans Dovecot) tous les fichiers de rapports DMARC.
Le script devrait se lancer sans erreur. Il vous donne par défaut les paramètres possibles à passer
# cd /usr/local/bin/dmarcts-report-parser
# ./dmarcts-report-parser.pl
Usage: ./dmarcts-report-parser.pl [OPTIONS] [PATH] This script needs a configuration file called <dmarcts-report-parser.conf> in the current working directory, which defines a database server with credentials and (if used) an IMAP server with credentials. Additionaly, one of the following source options must be provided: -i : Read reports from messages on IMAP server as defined in the config file. -m : Read reports from mbox file(s) provided in PATH. -e : Read reports from MIME email file(s) provided in PATH. -x : Read reports from xml file(s) provided in PATH. -z : Read reports from zip file(s) provided in PATH. The following optional options are allowed: -d : Print debug info. -r : Replace existing reports rather than skipping them. --delete : Delete processed message files (the XML is stored in the database for later reference). --info : Print out number of XML files or emails processed. dmarcts-report-parser.pl: Please provide a source option (-i, -x, -m, -e or -z).
Vous pouvez maintenant le lancer pour tester (-i pour vérifier la boite IMPA et -d pour avoir un debug => intéressant en cas de premier lancement ou d'erreur)
# cd /usr/local/bin/dmarcts-report-parser ./dmarcts-report-parser.pl -i -d
Dmarc Viewer
Vient maintenant le partie la plus amusante (et le plus facile)
Clonez le dépôt dans un dossier accessible par votre serveur Web
# cd /var/www/html
# git clone https://github.com/techsneeze/dmarcts-report-viewer.git
Vous pouvez bien entendu changer le nom du dossier pour avoir quelque chose de plus sympa
# mv dmarcts-report-viewer/ dmarc
# chown -R www-data:www-data /var/www/html/dmarc/
On passe à la configuration (Pas grand chose à faire à part compléter les identifiants de connexion à la base dmarc
# cd dmarc
# cp dmarcts-report-viewer-config.php.sample dmarcts-report-viewer-config.php
# nano dmarcts-report-viewer-config.php
<?php // #################################################################### // ### configuration ################################################## // #################################################################### // Supported types: mysql, pgsql. If unset, defaults to mysql //$dbtype="mysql"; $dbhost="localhost"; $dbname="dmarc"; $dbuser="dmarc"; $dbpass="xxx"; $dbport="3306"; ?>
Et ensuite ouvrez tout simplement le "viewer" dans votre navigateur
https://domaine.tld/dmarc/dmarcts-report-viewer.php
Vous pouvez modifier la configuration avec un fichier php (Qu'il faut évidemment penser à protéger avec un mot de passe par exemple):
https://domaine.tld/dmarc/dmarcts-report-viewer-options.php
Références
Merci à Techsneeze pour le code et les explications.
https://www.techsneeze.com/dmarc-report/ https://github.com/techsneeze/dmarcts-report-viewer
https://github.com/techsneeze/dmarcts-report-parser https://www.techsneeze.com/how-parse-dmarc-reports-imap/
Lol (discussion) 30 octobre 2022 à 08:08 (CET)lol