Creare un record DKIM per verificare l’autenticità del contenuto della mail ed inviare una email senza rischio spam
DKIM (Domain Keys Identified Mail)
Dopo aver visto come configurare un record SPF per autenticare il mittente, occupiamoci adesso di DKIM, cioè di un metodo utilizzato per verificare l’integrità e l’autenticità del contenuto della mail.
DKIM, in poche parole, certifica il contenuto della mail. Yahoo, Gmail e altri servizi di posta utilizzano email firmate con DKIM.
DKIM è una firma criptata che viene aggiunta all’intestazione ("header") del messaggio da parte del mail server che invia la email (ad esempio Postfix), ed utilizza a questo scopo:
- una chiave privata, associata al dominio, salvata sul mail server che invia la email
- una chiave pubblica salvata in un record TXT del DNS del dominio
In estrema sintesi vediamo come funziona DKIM:
- Il messaggio in uscita viene controllato dal mail server dedicato all'invio, ad esempio POSTFIX, e se il dominio mittente, presente nell’header "From", è presente nella configurazione di DKIM, verrà aggiunto al messaggio un nuovo Header chiamato "DKIM-SIgnature" utilizzando la chiave privata: è la firma apposta alla mail.
Questo è un esempio codice aggiunto da DKIM nell'header della nostra email.
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=miosito.it; s=default; t=1525422742; bh=xXtulKcDtfvlKnswskIHrI4/8SNaNFckGCK1fCGLL3E=; h=Date:From:To:Subject; b=QHhpSTr76HK6BRf1I65ghSIyOJc9vuzQfAY6Ka9ULK2kiEOVAfz3TBL5X8HkeJK3z HrgSzSbROEPHEPGuGnzU+LkmDegBGz86yGJzVumGuUkDwL5f/Pq9yszuo0DNn33eWr fcW9Dg3lkR8zI8L9115/vyL0k8iq/uym+5W5doUYnv2VjnViBNMFok8/m5i94iez6K FSnaUpZFARTDgJiRhKlZObCW1RczqUDQyxshfYPS4R1rDiigbx43AYefC36mXuyDSx iy6DVfFIMviHAoZ2Q4nOzTFKhUdOHDt6zuk2Pz2hwSGRd38BGkHUWXYor05sImfuwt mZrDSXkKJGjmw==
La firma vera e propria è la stringa contenuta nel parametro "b" (QHhpSTr76HK6BRf .....)
-
Cosa contiene questa firma?
Questa firma viene generata utilizzando alcune parti del messaggio. Gli elementi presi in considerazione dalla firma sono quelli indicati dal parametro "h". Nel nostro esempio, come potete vedere, sono la data di invio "date", il mittente "from", il destinatario "to", e l'oggetto "subject". La scelta degli elementi viene effettuata nella configurazione di DKIM (oppure si lasciano quelli previsti di default).
Questi elementi vengono quindi criptati usando la chiave privata, e così viene così generata la firma, cioè la stringa contenuta nel parametro "b". - Da questo momento in poi il contenuto del messaggio non potrà più essere modificato. In caso contrario l'header DKIM non corrisponderebbe più.
- Il server che riceve il messaggio effettua una query DNS, recupera la chiave pubblica, decripta la firma, e verifica che gli elementi decriptati ("date", "from", "to", "subject") corrispondano con quelli presenti nella email.
- In questo modo è possibile verificare l’autenticità della mail, il dominio di invio, e l'integrità del contenuto della mail.
DKIM è piuttosto complicato da configurare, ci sono molti passaggi da seguire, che adesso vediamo assieme, e richiede qualche competenza nella gestione del mail server Postfix, che utilizzeremo come server di invio mail.
Nella nostra configurazione utilizziamo Centos come server, e Postfix come server mail. Il dominio della mail che vogliamo firmate è ad esempio "miosito.it"
1: installa il pacchetto OPENDKIM
# yum install opendkim
2: Aggiungi l'utente postfix al gruppo opendkim
# gpasswd -a postfix opendkim
3: Modifica il file di configurazione "opendkim.conf"
# vi /etc/opendkim.conf
Le parti principali da editare sono queste (se commentate, decommentare queste istruzioni)
Canonicalization relaxed/simple
Mode sv
UserID opendkim:opendkim
Socket inet:8891@localhost
KeyFile /etc/opendkim/keys/default.private
KeyTable /etc/opendkim/KeyTable
SigningTable refile:/etc/opendkim/SigningTable
ExternalIgnoreList refile:/etc/opendkim/TrustedHosts
InternalHosts refile:/etc/opendkim/TrustedHosts
4: Modifica il file "KeyTable"
In questo file viene indicato a OpenDKIM dove sono le chiavi, cioè il percorso ("path") alla chiave privata presente nel server
# vi /etc/opendkim/KeyTable
Al suo interno modifica "example.com" con il tuo dominio, ad esempio "miosito.it" (e togli il commento)
default._domainkey.miosito.it miosito.it:default:/etc/opendkim/keys/default.private
5: Modifica il file "SigningTable"
In questo file definiamo a quali mittenti verrà apposta la firma alla mail e quali selettore usare
# vi /etc/opendkim/SigningTable
Nel nostro caso applichiamo la firma a tutti i mittenti del dominio "miosito.it", utilizzando la wildcart asterisco "*", ed utilizziamo il selettore "default"
*@miosito.it default._domainkey.miosito.it
Nota: è possibile usare la wildcard * solo se nel file di configurazione opendkim.conf l'opzione SigningTable utilizza il prefisso "refile:" prima del filename (come nella nostra configurazione).
6: Modifica il file "TrustedHosts"
In questo file deinifiamo gli IP e i domini da considerare attendibili e a cui apporre la firma alle mail
# vi /etc/opendkim/TrustedHosts
Utilizziamo la wildcard * per considerare attendibili anche tutti i sottodomini di miosito.it, oltre che il dominio miosito.it
127.0.0.1
::1
*.miosito.it
7: Genera la coppia di chiavi pubblica e privata
Per generare le chiavi è utilizzare lo strumento opendkim-genkey che consente un maggior controllo sulla sua creazione
# opendkim-genkey -b 2048 -d miosito.it -D /etc/opendkim/keys -s default -v
Con questo comando:
- con l'opzione "-b" generiamo una chiave a 2048 bits
- con "-d" specifichiamo il dominio a cui fanno riferimento le chiavi generate
- con "-D" specifichiamola directory dove salvare le chiavi
- con "-s" inchiamo il selettore, cioè una parola univoca che viene associata ad entrambe le chiavi, pubblica e privata, inclusa in tutte le firme e pubblicata nei record DNS. Per semplicità usiamo la parola "default", ma potete scegliere anche un'altra parola a vostro piacimento.
Nella directory "/etc/opendkim/keys/" verranno generati i seguenti file:
- default.private: è la chiave privata per il dominio. Nel file "KeyTable" va indicato il percorso a questo file.
- default.txt: è la chiave pubblica che tra poco pubblicheremo nel record DNS (TXT) nel dominio
Aassegna alla chiave primaria a "opendkim", sia come proprietario sia come gruppo,
# chown opendkim:opendkim /etc/opendkim/keys/default.private
Per tua conoscenza, esiste un altro strumento di creazione delle chiavi, opendkim-default-keygen, ma preferiamo usare il precedente
# opendkim-default-keygen
8: Modifica il file di Postfix "main.cf"
Adesso dobbiamo "agganciare" Postfix ad OpenDkim: per questo motivo modifichiamo il file di configurazione di postfix
# vi /etc/postfix/main.cf
Aggiungiamo al fondo queste righe
# Add the DKIM milter
milter_default_action = accept
milter_protocol = 2
smtpd_milters = inet:localhost:8891
non_smtpd_milters = inet:localhost:8891
9: Riavvia Postfix e avvia OpenDkim
# systemctl start opendkim;
# systemctl enable opendkim;
# systemctl restart postfix;
# systemctl enable postfix;
10: Aggiungi la chiave pubblica al record DNS del dominio
Apri il file contenente la chiave pubblica
# cat /etc/opendkim/keys/default.txt
Al suo interno troverai una stringa simile a questa
default._domainkey IN TXT ( "v=DKIM1; k=rsa; "
"p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCpOGs1+yeLL3/pKAJLApLriPyyhDIox+QmTCQWcbGpMeGvwoe3kz8Ake6HHscxW9RZi6LDr8lLL/F8f+yPwTUMAkGzWyiwcbUI1ZxSM9rwIKCBOfcSMyd1NjjwQCQRikHvj14aTA2qFHdQhYz+tJpXqMiq4AB5iIMw0jlYaPQRawIDAQAB" ) ; ----- DKIM key default for miosito.it
Opera in questo modo:
- Copia la stringa contenuta all'interno della parentesi, nel nostro esempio "v=DKIM1; k=rsa; ...."
- Accedi al pannello di gestione DNS del dominio (miosito.it)
- Crea un record di tipo TXT: nel campo nome (o host) indica "default._domainkey" e come valore incolla la stringa copiata.
11: verifica creazione record DNS
Dopo la creazione del nuovo record TXT attendi qualche minuto e poi verifica che il record sia stato correttamente configurato utilizzando il comando "opendkim-testkey"
# opendkim-testkey -d miosito.it -s default -vvv
Se la verifica ha avuto successo vedrai questo messaggio
key OK
Puoi anche utilizzare il comando dig per verificare la corretta creazione del record TXT
# dig +short default._domainkey.miosito.it TXT
In alternativa estistono vari tool online come mxtoolbox.com
12: invia email di prova
A questo punto proviamo a mandarci una mail, ad un indirizzo del dominio che abbiamo configurato su DKIM, ad esempio "info@miosito.it"
echo "test email" | sendmail info@miosito.it
Se DKIM è correttamente configurato Postfix, nei suoi log ("var/log/maillog") sarà presente questa riga
May 4 10:32:22 wa1 opendkim[1209]: 32EE04119408: DKIM-Signature field added (s=default, d=miosito.it)
Apriamo il sorgente della mail ricevuta e troveremo negli header la firma DKIM
DKIM-Filter: OpenDKIM Filter v2.11.0 wa1.wa67.it 32EE04119408
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=miosito.it; s=default;
t=1525422742; bh=xXtulKcDtfvlKnswskIHrI4/8SNaNFckGCK1fCGLL3E=;
h=Date:From:To:Subject:From;
b=QHhpSTr76HK6BRf1I65ghSIyOJc9vuzQfAY6Ka9ULK2kiEOVAfz3TBL5X8HkeJK3z
HrgSzSbROEPHEPGuGnzU+LkmDegBGz86yGJzVumGuUkDwL5f/Pq9yszuo0DNn33eWr
fcW9Dg3lkR8zI8L9115/vyL0k8iq/uym+5W5doUYnv2VjnViBNMFok8/m5i94iez6K
FSnaUpZFARTDgJiRhKlZObCW1RczqUDQyxshfYPS4R1rDiigbx43AYefC36mXuyDSx
iy6DVfFIMviHAoZ2Q4nOzTFKhUdOHDt6zuk2Pz2hwSGRd38BGkHUWXYor05sImfuwt
mZrDSXkKJGjmw==
Possiamo individuare questi elementi
- v: è la versione di DKIM
- a: è l'algoritmo usato per la criptazione della firma
- h: sono gli elementi della email sulla base dei quali verrà creata la firma
- d: il dominio per il quale abbiamo configurato DKIM
- s: il selettore scelto
- b: la firma crittografata
Se il controllo DKIM è superato troverai nell'header l'indicazione "dkim=pass"
Il problema di DKIM, come abbiamo capito, è la sua difficile implementazione, e per questo non è adottata da tutti, ma anche per questo la sua assenza non indica necessariamente che l'e-mail sia fraudolenta. In poche parole possiamo dire che se c'è è meglio!
Potrebbe interessarti
- Come leggere un report DMARC aggregato.
- Come implementare la crittografia TLS su Postfix
- Cosa sono il record PTR ed il reverse DNS, e come vengono utilizzati dai server di posta per verificare l'autenticità del mittente.
- Creiamo un record DMARC per definire le azioni da eseguire nel caso in cui i controlli SFP e DKIM falliscano.
- Configurare il record SPF per rafforzare la reputazione del mittente ed inviare una newsletter a prova di spam