Configurare un filtro DMARC in Spamassassin

17 gennaio 2026 by Roberto Puzzanghera 0 commenti

DMARC (Domain-based Message Authentication, Reporting, and Conformance) è un metodo standard per l'autenticazione delle email, che aiuta gli amministratori della posta a impedire che hacker e altri malintenzionati eseguano lo spoofing dell'organizzazione e del dominio Lo spoofing è un tipo di attacco che falsifica l'indirizzo nell'intestazione Da: di un messaggio email. Un messaggio contraffatto mediante lo spoofing sembra provenire dall'organizzazione o dal dominio la cui identità è stata rubata.

DMARC ti permette anche di richiedere rapporti dai server email che ricevono i messaggi dalla tua organizzazione o dal tuo dominio. I rapporti contengono informazioni utili per identificare possibili problemi di autenticazione e attività dannose nei messaggi inviati dal tuo dominio.

Changelog

  • 17 gennaio 2026
    - aggiunto unhow per dmarc-srg (analizzatore di report DMARC)

Configurazione

E' possibile usare Spamassassin per applicare un filtro DMARC per mezzo del plugin AskDNS. E' sufficiente aggiungere quanto segue a 80-dmarc.cf:

cat > /etc/mail/spamassassin/80-dmarc.cf << EOF
# DMARC
ifplugin Mail::SpamAssassin::Plugin::AskDNS
askdns __DMARC_POLICY_NONE   _dmarc._AUTHORDOMAIN_ TXT /^v=DMARC1;.*\bp=none;/
askdns __DMARC_POLICY_QUAR   _dmarc._AUTHORDOMAIN_ TXT /^v=DMARC1;.*\bp=quarantine;/
askdns __DMARC_POLICY_REJECT _dmarc._AUTHORDOMAIN_ TXT /^v=DMARC1;.*\bp=reject;/

meta DMARC_REJECT !(DKIM_VALID || SPF_PASS || SPF_HELO_PASS) && __DMARC_POLICY_REJECT
score DMARC_REJECT 5
meta DMARC_QUAR   !(DKIM_VALID || SPF_PASS || SPF_HELO_PASS) && __DMARC_POLICY_QUAR
score DMARC_QUAR 2.5
meta DMARC_NONE   !(DKIM_VALID || SPF_PASS || SPF_HELO_PASS) && __DMARC_POLICY_NONE
score DMARC_NONE 0.1
endif # Mail::SpamAssassin::Plugin::AskDNS
EOF

In questo modo un DMARC reject (p=reject nel record DNS) causerà un punteggio aggiuntivo di +5 nello spam score, DMARC quarantine (p=quarantine) un +2.5 aggiuntivo mentre p=none determinerà un +0.1.

Ecco come potrebbe poi essere impostato il proprio record DMARC nella zona bind:

_dmarc.yourdomain.tld. IN TXT "v=DMARC1;p=reject;sp=none;pct=100;rua=mailto:postmaster@yourdomain.tld"

Naturalmente ciò richiede che SPF e DKIM siano già settati e funzionanti come spiegato in precedenza.

Se si decide di impostare un analogo record DNS nella propria "DMZ view", è importante che si siano definite le proprie reti locali in spamassassin, ad esempio:

internal_networks 10.0.0/24

altrimenti i messaggi di sistema o anche alcuni messaggi generati da applicazioni web (per esempio) potrebbero essere rigettatio se non sono stati preventivamente firmati.

Installazione di un analizzatore di report DMARC

dmarc-srg è un parser php, visulalizzatore è generatore di report per i report DMARC in arrivo. Funziona recuperando via IMAP i report in formato XML da una specifica casella e memorizzando i dati in un database MySQL/MariaDB. Si può anche caricare a mano dei reports.

Requisiti

  • MariaDB o MySQL
  • PHP 8.1 o superiore
  • php-mbstring, php-mysql, php-xml, php-zip, e php-json
  • ImapEngine (funziona via composer)

Installazione

I dati DMARC vengono salvati su database MySQL. Loggarsi come root al server MariaDB/MySQL usando la shell (mysql -u root -p) e creare il database e una nuova utenza chiamata dmarc per il nuovo database:

CREATE database dmarc;
GRANT all on dmarc.* to dmarc@localhost identified by 'new_user_password';

Portarsi nella directory dove sta la radice dei documenti di apache (per esempio /var/www/htdocs) e scaricare il pacchetto. Al momento in cui scrivo il progetto si trova in uno stato di pre rilascio, quindi è conveniente scaricare il main branch da github:

git clone https://github.com/liuch/dmarc-srg.git
chown -R apache:apache dmarc-srg

Impostare un dominio virtuale su apache, ad esempio:

<VirtualHost *:443> 
 Include ${SSL_STUFF} 

 ServerName  dmarc.domain.tld 

 CustomLog ${LOGDIR}/dmarc.log combined 
 ErrorLog  ${LOGDIR}/dmarc_error.log 

 DocumentRoot ${HTDOCS}/dmarc-srg/public 
 <Directory   ${HTDOCS}/dmarc-srg/public> 
    Require all granted 
    AllowOverride All 
 </Directory> 
</VirtualHost>

Notare che l'unica  directory esposta al web è dmarc-srg/public.

Creare il file di configurazione:

cd dmarc-srg
cp config/conf.sample.php config/conf.php
chmod 640 config/conf.php

Modificare conf.php e inserire una password globale per proteggere l'accesso dal web:

$admin = [ 
   // Set this value to null or remove this parameter to disable authentication 
   // Note: The authentication always fails with an empty string password. Change it if you want to use the web> 
   'password' => 'secret_pwd' 
];

Aggiungere le credenziale MySQL/MariaDB:

// Settings for accessing the database where reports will be saved 
$database = [ 
   'host'         => 'localhost', // You can use a domain name here 
   'type'         => 'mysql', 
   'name'         => 'dmarc', 
   'user'         => 'dmarc', 
   'password'     => 'secret_pwd', 

   'table_prefix' => '' 
];

Ora impostare la mailbox dove vengono ricevuti i report DMARC. E' quella che abbiamo già inserito nel DNS, dmarc@domain.tld nel seguente esempio:

v=DMARC1;p=reject;sp=none;pct=100;rua=mailto:dmarc@domain.tld

Copiare dunque le seguenti impostazioni:

/** 
* It is only required if you want to get reports from a mailbox automatically. 
* In order to collect reports from several mailboxes, you should put each 
* mailbox settings in an array. 
*/ 
$mailboxes = [ 
   // Just for displaying in the web-admin and utilities. Not necessary. 
   'name'            => 'dmarc@domain.tld', 
   // Host of the email server. You can specify a port separated by a colon. 
   'host'            => 'localhost:143', 
   // Connection encryption method. The valid values are: 
   // 'none'     - without encryption (strongly not recommend). 
   // 'ssl'      - SSL/TLS on a separate port, for IMAP it is usually port 993. Default value. 
   // 'starttls' - STARTTLS method, usually on the standard IMAP port 143. 
   'encryption'      => 'none', 
   // Set true if you want to connect to the IMAP server without certificate validation 
   //'novalidate-cert' => false, 
   // Mailbox user name.
    'username'        => 'dmarc@domain.tld', 
   // Mailbox password or OAuth token when the authentication method is 'oauth'. 
   'password'        => 'secret_pwd', 
   // Authentication method. The valid values are: 
   // 'plain' - authentication with username and password. Default value. 
   // 'oauth' - OAuth authentication. Pass the token as the password. 
   //           Only available with the imap-engine library (see the fetcher->library setting). 
   'authentication'  => 'plain', 
   // Mailbox name
   'mailbox'         => 'INBOX', 
   // IMAP authentication methods to be excluded. 
   // For example: 'auth_exclude' => [ 'GSSAPI', 'NTLM' ] 
   'auth_exclude'    => [] 
];

Si potrebbe anche spostare i report in arrivo in una apposita cartella 'dmarc' per mezzo di una regola sieve, in questo caso è necessario settare

   'mailbox'         => 'dmarc',

come nome della mailbox.

Installare tutti i prerequisiti via composer (se non si è già installato composer, dare una occhiata qui, dove ho spiegato brevemente come installarlo).

mkdir vendor
chown -R apache:apache vendor
sudo -u apache composer update

Ora navigare alla pagina https://dmarc.domain.tld (o dove si è pubblicato il tutto) e il database sarà inizializzato al primo accesso:

Nel menu laterale cliccare su Administration->Admin Panel per avere la conferma che la connessione al database funziona:

Cliccare su Settings->Domains e aggiungere tutti i domini per i quali ci sia aspetta di ricevere dei report.

Cliccare su Total Sources e testare l'accesso alla casella dmarc@domain.tld via IMAP:

Se si ottiene un messaggio su sfondo verde tutto è installato a dovere.

Infine impostare un cronjob per importare i report DMARC nel database durante la notte. Il programma utils/fetch_reports.php deve essere lanciato apache:

# dmarc 
0 1 * * *  apache /usr/bin/php /var/www/htdocs/dmarc-srg/utils/fetch_reports.php >> /var/log/cron 2>&1

Notare che solo le email non lette veranno importate, pertanto, se mai si dovesse aprirne una e lasciarla in uno stato di meggaggio letto esso non verrà importato nel database di dmarc-srg.

Aggiungi un commento

qmail notes

Pay me a coffee:

PayPal - The safer, easier way to pay online.

LXC scripts
Other contents
Guide per gli utenti
Ultimi commenti
Articoli recenti

RSS feeds