✉ Email deliverability

Report aggregati DMARC: come leggerli e cosa cercare

Struttura dei report DMARC rua in XML, come interpretare record, risultati e allineamento, e come distinguere fonti legittime da tentativi di spoofing.

Pubblicare un record DMARC con il tag rua= è come accendere una telecamera sul proprio dominio. Ogni giorno i grandi provider di posta inviano all'indirizzo indicato un riepilogo di tutti i messaggi che hanno ricevuto con il tuo dominio nel From: da quali server sono partiti, quanti erano, se hanno superato SPF e DKIM. Il problema è che questi report arrivano in XML compresso e, aperti la prima volta, sembrano illeggibili. Imparare a leggerli è il passaggio che separa un DMARC decorativo da uno che protegge davvero.

Come si attivano

Basta indicare nel record DMARC un indirizzo di destinazione:

_dmarc.example.com.  TXT  "v=DMARC1; p=none; rua=mailto:dmarc-report@example.com"

Se l'indirizzo appartiene a un dominio diverso da quello monitorato, il dominio ricevente deve pubblicare un record di autorizzazione, altrimenti i provider non inviano i report. È un meccanismo pensato per impedire che qualcuno inondi di report una casella altrui.

Conviene usare una casella dedicata: anche un dominio piccolo riceve decine di report al giorno, e una casella personale diventa rapidamente ingestibile.

La struttura di un report

Ogni report è un file XML, di solito compresso in zip o gzip, diviso in tre parti.

Metadati

Indicano chi ha generato il report (org_name), l'identificativo del report e l'intervallo temporale coperto, espresso in timestamp Unix. In genere l'intervallo è di 24 ore.

Policy pubblicata

Riporta la policy che il destinatario ha letto nel tuo DNS al momento della valutazione: p, sp, adkim, aspf. Serve a verificare che il record sia stato interpretato come pensavi.

Record

È la parte importante. Ogni elemento record raggruppa i messaggi provenienti da uno stesso indirizzo IP con gli stessi risultati. Un esempio semplificato:

<record>
  <row>
    <source_ip>192.0.2.25</source_ip>
    <count>312</count>
    <policy_evaluated>
      <disposition>none</disposition>
      <dkim>pass</dkim>
      <spf>fail</spf>
    </policy_evaluated>
  </row>
  <identifiers>
    <header_from>example.com</header_from>
  </identifiers>
  <auth_results>
    <dkim><domain>example.com</domain><result>pass</result></dkim>
    <spf><domain>bounce.example.net</domain><result>pass</result></spf>
  </auth_results>
</record>

Leggere un record senza confondersi

Il punto che genera più errori è la differenza tra policy_evaluated e auth_results.

  • auth_results riporta i risultati grezzi di SPF e DKIM, con il dominio su cui sono stati valutati.
  • policy_evaluated riporta il risultato ai fini DMARC, cioè tenendo conto dell'allineamento.

Nell'esempio, SPF in auth_results è pass, ma sul dominio bounce.example.net, che non corrisponde al From. Per DMARC quindi SPF risulta fail. DKIM invece passa ed è allineato, perché la firma è di example.com. Il messaggio supera DMARC grazie a DKIM. La disposition indica cosa ha fatto il destinatario: none, quarantine o reject.

Classificare le fonti

L'obiettivo pratico è costruire un elenco di tutte le sorgenti che inviano con il tuo dominio e classificarle in tre gruppi.

Gruppo Come riconoscerlo Azione
Legittime e configurate DKIM o SPF allineati in pass nessuna
Legittime ma non configurate IP di un tuo fornitore, DMARC fail configurare DKIM o il dominio di bounce
Illegittime IP sconosciuti, spesso volumi variabili lasciare che la policy le blocchi

Per identificare un IP si parte dal record PTR e dal proprietario del blocco di indirizzi. Un IP che appartiene al fornitore della tua piattaforma di newsletter è quasi certamente legittimo; uno che risolve verso una connessione residenziale in un altro continente, con poche decine di messaggi tutti falliti, molto probabilmente no.

Attenzione a un caso frequente: gli inoltri. Quando un destinatario inoltra automaticamente la posta a un'altra casella, il messaggio arriva da un server che non è tuo. SPF fallisce, ma DKIM spesso resta valido. Questi record compaiono come IP di provider noti con DKIM in pass e SPF in fail: non sono attacchi.

Strumenti per non leggere XML a mano

Leggere i file uno per uno funziona per capire il formato, non per lavorare. Esistono servizi commerciali che raccolgono e visualizzano i report, e strumenti open source che li analizzano e li caricano in un database o in una dashboard. Nel mio lavoro preferisco una soluzione che conservi i dati grezzi: quando si investiga un'anomalia serve tornare al singolo record.

Esistono anche i report forensi (ruf=), che contengono dettagli sui singoli messaggi falliti. Molti grandi provider non li inviano per motivi di riservatezza, quindi non conviene contarci.

Una routine di controllo

  1. Ogni settimana, verificare che i volumi delle fonti note siano coerenti con l'attività reale.
  2. Cercare nuove fonti con DMARC fail e volumi significativi: spesso è un reparto che ha attivato un servizio senza avvisare.
  3. Controllare che nessuna fonte legittima dipenda solo da SPF.
  4. Prima di irrigidire la policy, assicurarsi che le fonti legittime non allineate siano zero o trascurabili.

In sintesi

  • I report aggregati arrivano in XML, uno per provider e per giorno, all'indirizzo indicato in rua=.
  • auth_results mostra i risultati grezzi, policy_evaluated quelli che contano per DMARC.
  • L'obiettivo è classificare ogni sorgente come legittima configurata, legittima da sistemare o illegittima.
  • Gli inoltri producono SPF fail con DKIM pass e non vanno scambiati per attacchi.
  • Uno strumento di aggregazione è indispensabile oltre i primi giorni di monitoraggio.
MM
Marco Marzaduri

Marco Marzaduri si occupa di cybersecurity, informatica forense e sviluppo web. Laureato in informatica, unisce il rigore dell'analisi tecnica all'attenzione per le persone che usano la tecnologia.

Leggi anche