Prevenire lo spoofing con DKIM

Lo spoofing del mittente è l’atto di fingere di essere in controllo dell’indirizzo mail di qualcun altro. Questo è un problema comune con il phishing. Spesso gli scammer (truffatori) mandano mail con qualcosa@paypal.com come mittente sperando che il destinatario ci creda. In fatti a SMTP non interessa quale mittente venga usato. Molti fornitori di servizi mail forzano l’utente a mandare mail usando solo il proprio indirizzo mail. Ma altri no. E a spammer e scammer ovviamente non interessa affatto.

Così è stato concepito un nuovo metodo che aggiunge una firma criptografica all’intestazione della mail, cosicché il destinatario possa verificare l’autenticità del mittente e l’integrità della mail. La firma è creata usando una chiave privata che solo il mittente ha. Può poi essere verificata dal destinatario scaricando la corrispondente chiave pubblica dalla zona DNS del dominio del mittente e controllando la firma. Funziona in modo molto simile alla firma PGP o S/MIME – solo a livello dominio. Il vostro server di posta può firmare tutte le mail automaticamente. Il metodo usato oggigiorno è chiamato DKIM (Domain Keys Identified Mail).


Esempio senza DKIM

Facciamo un esempio. Ho appena mandato una mail da gmail al mio account mail personale sul mio server di posta. Siccome Google usa la firma DKIM, nella mail ci sono queste intestazioni aggiunte dai server di posta di Google:

DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20161025;
 h=mime-version:from:date:message-id:subject:to;
 bh=/FpkZfBuKR0WWcH2fFcr9M4qgX4Z4+/0dX4dpqycK28=;
 b=fZ4Efy1TuXAl1ho2twkEuNiVP8k5GRKqlol/f/dTawaxciAv1bwinkbuTCpK4T3SoL
 ZFhdh/p82MYiIt75V5eGFtSMQfocVIKfsusggj3ZKlwUNvSbB/jd4fn3SKwGjLSyKMT0
 agJFblxF+ydGzRKYzJNPfFYhdQY3YZcMEria87SpqgVgqECCMRvuT10w7KQGIx7AsvDy
 F2coh2TnX400sRidMVF1S/9QhD85dE3xSie3ZdTfWBsP00Y7xWbos7MlSl1MnsVvXPtQ
 7bnNBVdcn1tP9x8IeNKp6qEYoLYzEeLZVp8eLB0F0AoWIgRb348FaIvMF9jYvO/h/cQ+
 YP5Q==

Ho bisogno della chiave DKIM pubblica di Google per verificare questa firma. E’ salvata nella loro zona DNS come record TXT “20161025._domainkey.google.com”. “20161025” è il selettore della chiave menzionato nella firma come “S=20161025“. Potete usare qualsiasi numero per le chiavi a patto che creiate le firme con la rispettiva chiave. La parte “_domainkey” è il sottodominio standard per le chiavi DKIM. Prendiamo questo record TXT:

dig +short 20161025._domainkey.google.com txt
“k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwXNZF1j8sJPDleRjf9SPBNem0ik58kF1ilC1nUgKAttl9v7FX9hXJXPmLNhVtSKVZ8yruaeOZLeIxtgtk1s81zzIE5Mj0AiGn2wlFt4kYfqlDfYe95YLQHjynu4i7vj1Tj” “ksf62btcCbL+3XhbK+oD5PlqYhXHWuzoKoEp5L4lCihgkONvU/oy7NNeE6quqfF/y0YSLwF2WVA2Kd8L6R0Ar2dYT/3wZCFknI7xhvPqh9HNcIWBELGPwtXcsHbX1wvBlCgNQAUcdJrf2YWzAwqmZ564/1ipL1IMk1nafPJk75ktumVNz6ORuIn3jbZWp9rRpnaeI9cu/8KfSKH2EY9QIDAQAB”

Questa è la chiave pubblica che posso usare per verificare la firma. Un controllo automatico può essere fatto usando lo strumento “opendkim-testmsg” come descritto più avanti. Posso passargli l’intera mail inclusi intestazioni e corpo. Se non ritorna un messaggio di errore allora la firma è corretta.

Suona bene? Ok, allora implementiamolo anche nel nostro dominio mail.

Creare una coppia di chiavi

Come spiegato sopra abbiamo bisogno di una chiave privata per il server di posta e una pubblica da aggiungere nella zona DNS. rspamd può creare chiavi DKIM. Installiamo “dig” che permette di fare query ai record DNS. Funziona come “nslookup” ma è più versatile.

apt install dnsutils

rspamd ha un modulo integrato per la firma DKIM attivo di default. Se mettiamo il file della chiave in /var/lib/rspamd/dkim/ usando uno specifico schema di nomi, verrà rilevato automaticamente. Creiamo questa cartella per salvarci le chiavi:

mkdir /var/lib/rspamd/dkim
chown _rspamd:_rspamd /var/lib/rspamd/dkim

Creiamo la coppia di chiavi:

rspamadm dkim_keygen -d example.org -s 2018022301

Il selettore (-s) che ho scelto è 2018022301 perché è il giorno che l’ho creata. La prima (01) chiave del 2018-02-23. Non è importante comunque – potete chiamarla come volete. Se siete pigri o non ve ne frega nulla potete anche usare “dkim” come selettore e più tardi risparmiarvi la fatica di creare le mappature DKIM che definiscono quale chiave deve essere usata per ogni dominio. “dkim” è il selettore predefinito se non usate mappature. Tuttavia in seguito sarete nei guai se dovrete sostituire la chiave senza invalidare le mail spedite prima. Quindi vi consiglio di usare le mappature come spiegato poco più sotto. E’ una soluzione più flessibile ed è abbastanza facile da implementare.

L’output sarà più o meno questo:

-----BEGIN PRIVATE KEY-----
MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBALF6ce6mRgs+YUxs
mNX11AgIpSXbEf9p7FJFTAK7DtMn12R12og37q3LDhUqGdbxHT9SVvOVIUuZWAxT
S5STBO1WrIMeG1JTstX9KRViZSy3h1NQXWv7w++ECbu+hsxgp3C9Gw6rbsAG1lzw
/ihTZdceqprotTyziw3GzXaEtb2zAgMBAAECgYEAltFCuFa79xoPfO5cApZglGMk
VEMRzEaq+E7DBR8Ivg+BTnGIP3Godi+zy/B2/NzwybqjAWOdY6zv0amG9L7q04sM
BnhM06S+DFbmetEV0CKGg+yGQ3QRIxm5ZeFj7OOcssPxzyTrzI3MU2vhDkOrKycE
kaiWu4PI2TwvBF7PtGECQQDaq4rJfd8IITtL84qqt6DxWNb45cuay8oWnq2kjU0k
nkcLhpvCdO5a037AUnBmpQzQWxsE1OMhl54oV6QY8EhPAkEAz8a2q2wshFuiSBjV
BU3kXELdjqxEoti+zBuuT8QldCUntHbG1Vyo8A6ObVOnbbGEJmmRqjajjBV3Imvj
+NW3XQJATiqR8xLmnh5a9vx47iu0AXITbmeej5gXhlx0j+Te1Z8qoEke9rUb2yXN
ImyVt2t6mCRpFSIQixqKs7sYcr256wJBALFbSDZPojhhF8c/Gybp9FIk6YaN2hC/
vy3vOv3vyqC3zoqnENazv6kaY81CqRpjexBm8OZAuZ4r/IOvYOvZUikCQQCtWZtZ
8oYlVB2R4OMF5CMrjEkMNW9J5wZwPj7NHdbXLTtzDoI+oCrjus9foffe3T5ADFQ6
x6ZDbufbaRujG8/B
-----END PRIVATE KEY-----
2018022301._domainkey IN TXT ( "v=DKIM1; k=rsa; "
 "p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCxenHupkYLPmF … QAB" ) ;

La prima parte è la chiave privata, comprese le linee “…BEGIN…” e “…END…”. Questa chiave deve essere tenuta segreta e sarà usata solo dal server di posta per firmare le mail in uscita.

La seconda parte è il record DNS da aggiungere alla zona DNS. Cominciamo con questo.

Aggiungere il record DNS

Prima di cominciare a firmare le mail dobbiamo essere sicuri che la chiave pubblica sia correttamente presente nella nostra zona DNS per il dominio da cui mandiamo le mail. Altrimenti il destinatario non potrà verificare la firma e potrebbe erroneamente assumere che la mail è stata forgiata.

Guardiamo il file 2018022301.txt. Sarà più o meno così:

2018022301._domainkey IN TXT ( “v=DKIM1; h=sha256; k=rsa; “p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCxenHupkYLPmFMbJjV9dQICKUl2xH/aexSRUwCuw7TJ9dkddqIN+6tyw4VKhnW8R0/UlbzlSFLmVgMU0uUkwTtVqyDHhtSU7LV/SkVYmUst4dTUF1r+8PvhAm7vobMYKdwvRsOq27ABtZc8P4oU2XXHqqa6LU8s4sNxs12hLW9swIDAQAB” ) ;

Se gestite il vostro server DNS dovreste essere in grado di copiare tutto questo file e metterlo nella vostra zona DNS. Tuttavia se il vostro fornitore internet vi offre solo un’interfaccia web per gestire i vostri domini, allora create un nuovo record TXT con il nome host di “2018022301._domainkey” e metteteci questa stringa dentro i doppi apici come valore. Nel mio esempio:

2018022301._domainkey ➠p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCxenHupkYLPmFMbJjV9dQICKUl2xH/aexSRUwCuw7TJ9dkddqIN+6tyw4VKhnW8R0/UlbzlSFLmVgMU0uUkwTtVqyDHhtSU7LV/SkVYmUst4dTUF1r+8PvhAm7vobMYKdwvRsOq27ABtZc8P4oU2XXHqqa6LU8s4sNxs12hLW9swIDAQAB

In base al vostro ISP potrebbe volerci un po’ prima che il nuovo record sia visibile su internet. Potete usare dig per verificarlo:

dig +trace 2018022301._domainkey.example.org txt

Se ottenete la voce TXT come segue allora siete pronti per abilitare la firma DKIM in rspamd per questo dominio:

TXT “p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCxenHupkYLPmFMbJjV9dQICKUl2xH/aexSRUwCuw7TJ9dkddqIN+6tyw4VKhnW8R0/UlbzlSFLmVgMU0uUkwTtVqyDHhtSU7LV/SkVYmUst4dTUF1r+8PvhAm7vobMYKdwvRsOq27ABtZc8P4oU2XXHqqa6LU8s4sNxs12hLW9swIDAQAB” “” from server foo.bar in 24 ms.

Abilitare le mappature DKIM in rspamd

Come spiegato sopra è consigliabile usare le mappature DKIM. Niente di che. Solo un semplice file che definisce quale selettore vogliamo usare per un certo dominio. rspamd assume che il selettore sia sempre “dkim” se non diversamente specificato in una mappatura. Se usate “dkim” potreste avere dei problemi se poi volete sostituire la vostra chiave. DNS è un sistema lento e può volerci un giorno a propagare una nuova chiave DKIM pubblica. Le mail firmate con una nuova chiave possono essere rifiutate mentre il record DNS non è ancora conosciuto ovunque nel mondo.

Usare mappature è semplice. Prima di tutto dobbiamo cambiare l’opzione selector_map del modulo dkim_signing. Per farlo creiamo un nuovo file in /etc/rspamd/local.d/dkim_signing.conf e mettiamoci solo queste due linee:

path = "/var/lib/rspamd/dkim/$domain.$selector.key";
selector_map = "/etc/rspamd/dkim_selectors.map";

La configurazione è abbastanza ovvia. rspamd cercherà la mappatura dominio-chiave nel file dkim_selectors.map. Creiamo questo file con questa linea:

example.org 2018022301

Questo è tutto, veramente. rspamd adesso sa che quando vede una mail in uscita da anyone@example.org, prenderà la chiave DKIM privata da /var/lib/rspamd/dkim/example.org.2018022301.key e la userà per firmare la mail.

Ricarichiamo la configurazione:

service rspamd reload

Questo metodo funziona bene se avete pochi domini che virtualmente non cambiano mai. Se invece servite domini casuali di clienti, dovreste considerare di mettere le chiavi in un database Redis come descritto nella documentazione. Non c’è ancora un modo per gestire le chiavi DKIM in un database MySQL.

Aggiungere la chiave del dominio a rspamd

Prendiamo la chiave privata creata in precedenza (il testo compreso tra “…BEGIN PRIVATE KEYS…” e “…END PRIVATE KEY…”) e mettiamola dentro un file in un posto dove rspamd la cercherà:

/var/lib/rspamd/dkim/example.org.2018022301.key

Il nome di questo file deve essere DOMINIO + punto + SELETTORE + “.key” come sopra. Se sbagliate a nominare il file otterrete un errore nel vostro rspamd.log tipo

lua_dkim_sign_handler: cannot load dkim key /var/lib/rspamd/dkim/example.org.dkim.key

Assicuriamoci che solo _rspamd possa leggerlo:

chown _rspamd /var/lib/rspamd/dkim/*
chmod u=r,go= /var/lib/rspamd/dkim/*

rspamd troverà automaticamente i file, non c’è bisogno di riavviarlo.

Spedire una mail di test

Se avete un altro account email in un altro posto potete mandare una mail di test lì tramite il vostro server di posta. Se guardate la mail ricevuta, ora dovrebbe avere un header DKIM come questo:

DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=example.org;
	s=2018022301; t=1519400838;
	h=from:subject:date:message-id:to:mime-version:content-type:content-transfer-encoding;
	bh=kpYel1IlDvqXEUc0SyIpXbMte3XpQOCXHl+zTyHQvGc=;
	b=NEUyWUoeKEoKAYTY8g04o73j+wrYUcEGSq7uwpbsAGo0OzuuIBluEfG1MbGF/Tf6yxxJB4
	gTDD3sqb19EsQxv39QsAwgddAz01Osw5LKU0MjLZpxw6NA8zLllJUsrNdNQAYSII9ip4xX
	ImU7+KFOEF+gmxR5aseUt5H6JT/aOmhPE9xsSyg9wLf0Bikyy5Cgh+Ay7AHQLMZogbTi9W
	dAPpZZcZs0pTwhcard6SaesypJ+xZNna+BA+C1vXrGDc+9stYZVi+Zufh6zlZo1E/sQSRL
	jowB1mjv1vjINRY30aq0rh4dT8RHe38/PKFf8vQHOSOKvjIKv984UeOTIFIUHw==

Per verificare la firma installiamo il pacchetto opendkim-tools, copiamo l’intera mail di test (intestazioni e corpo compresi), lanciamo opendkim-testmsg nella shell e copiamo la mail (si esce con CTRL-D).
Se non avete output allora la firma è verificata correttamente. Ma se ottenete qualcosa tipo “opendkim-testmsg: dkim_eom(): Unable to verify” allora controllate bene il vostro record DNS.
Potete anche usare il servizio dkimvalidator.com per verificare che le vostre firme funzionino bene.


 

Verifica della firma DKIM

SPF e DMARC

Aggiungere le firme DKIM è un buon primo passo. Ma potete proseguire dicendo ai server di posta destinatari di non accettare mail dal vostro dominio senza una firma valida o da server che non operate. Ci sono due idee che ci possono aiutare. Il vecchio SPF e il nuovo DMARC. Per entrambi significa creare una stringa leggibile dalla macchina in un formato predefinito e aggiungere un record TXT nella vostra zona DNS. Il server destinatario può controllare questi record e seguire il vostro consiglio (come proprietari del dominio) su come comportarsi se i criteri della mail non sono raggiunti. Potrebbe accettare comunque la mail, segnarla come spam oppure rifiutarla del tutto.

Guardiamo un tipico record SPF:

"v=spf1 ip4:157.97.194.11 mx ~all"

Cosa significa:

  1. questo è un record SPF dello standard versione 1 (al momento l’unico)
  2. accetta le mail dall’indirizzo IP 157.97.194.11
  3. in alternativa accetta le mail da qualsiasi server menzionato nel nostro record MX (i server che ricevono la posta per il vostro dominio)
  4. ogni altra mail deve essere considerata sospetta – potrebbe essere spam o peggio

Ci sono siti web come SPFwizard che aiutano a creare stringhe SPF da aggiungere al dominio DNS. Ricordate però:

  • Dovete sapere quali server mandano mail per il vostro dominio. Non dimenticate di includere servizi di newsletter e mailing list che spediscono per conto vostro.
  • Cominciate con “~all” per segnare le mail che non soddisfano i criteri come spam. Se tutto va bene cambiate in “-all” dopo un paio di settimane
  • Notate che inoltrare mail dal vostro dominio può far fallire SPF perché le mail sembrano arrivare da un indirizzo IP non autorizzato. Questo è stato un problema comune per le mailing list e sta venendo gradualmente corretto rispedendo la mail dal dominio della mailing list.

Ho menzionato che DMARC è il nuovo standard. Quindi perché usare SPF? Perché qualche fornitore email valorizza il vostro sforzo se usate anche SPF. Tecnicamente è sufficiente specificare una voce DMARC. Secondo me restringere gli indirizzi IP ammessi all’invio è pericoloso e poco flessibile. E’ molto più interessante richiedere che le mail dal vostro dominio abbiano una valida firma DKIM. un record di questo tipo è grosso modo così:

"v=DMARC1; p=reject; adkim=s"

Tuttavia per creare una voce DMARC corretta suggerisco di usare uno dei siti web che vi aiutano in questo ed illustrano le restrizioni e le funzionalità extra.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *