Installazione di DKIM/DMARC/SPF & C¶
Per gestire la posta in uscita per SPF non occorre fare altro che creare il relativo record TXT sul proprio dominio, se però si vuole verificare la validità della posta in ingresso e prendere eventuali provvedimenti, occorrerà installare (dal pacchetto omonimo) e configurare postfix-policyd-spf-python
.
Il file di configurazione è /etc/postfix-policyd-spf-python/policyd-spf.conf
, in cui inserire un contenuto del tipo:
#HELO_reject = SPF_Not_Pass #Mail_From_reject = Fail HELO_reject = False Mail_From_reject = False Authserv_Id = holland Header_Type = SPF
in cui di commentano le istruzioni che farebbero respingere la posta, si indica la macchina che esegue i controlli (indicando l'hostname con Authserv_Id
) e si indica con Header_Type
di inserire un header coi risultati di autenticazione. Le due possibilità sono AR
e SPF
, il primo sarebbe lo standard preferito da opendmarc
, ma non funziona.
Occorre poi configurare postfix per usare il programma come policy service, pertanto si dovrà prima configurarne l'avvio in master.cf
aggiungendo le righe:
# for SPF check policyd-spf unix - n n - 0 spawn user=nobody argv=/usr/bin/python /usr/bin/policyd-spf /etc/postfix-policyd-spf -python/policyd-spf.conf
e poi abilitarne l'uso in main.cf
con:
smtpd_recipient_restrictions = ... reject_unauth_destination, check_policy_service unix:private/policyd-spf, ... policyd-spf_time_limit = 3600
Per Debian Wheezy. Installare OpenDKIM:
apt-get install opendkim opendkim-tools
modificare il file di configurazione /etc/opendkim.conf
aggiungendo:
## Added configurations KeyTable /etc/opendkim/key_table SigningTable /etc/opendkim/signing_table ExternalIgnoreList /etc/opendkim/trusted_hosts InternalHosts /etc/opendkim/trusted_hosts AutoRestart Yes AutoRestartRate 10/1h Mode sv PidFile /var/run/opendkim/opendkim.pid SignatureAlgorithm rsa-sha256 Canonicalization relaxed/simple UserID opendkim:opendkim # Added to write headers AuthservID HOSTNAME
Dove l'ultima riga è essenziale se si vuole che opendkim
controllando le firme dei messaggi in arrivo costruisca un corretto header di autenticazione ad uso sia di opendmarc
che del debug dei relativi problemi, la parola chiave HOSTNAME
assegna un identificativo di chi ha eseguito il controllo automaticamente inizializzato all'hostname della macchina su cui lo si esegue.
Occorre poi creare la directory /etc/opendkim/
ed una sottodirectory per ciascun dominio che si vuole utilizzare:
mkdir /etc/opendkim mkdir /etc/opendkim/truelite.it mkdir /etc/opendkim/fountainpen.it ...
per ciascun dominio creare una chiave RSA con:
cd /etc/opendkim/truelite.it opendkim-genkey -b 2048 -s mail -d truelite.it
oppure, se non si è paranoici e ci si accontenta della sicurezza standard che nel caso, non avendo da cifrare dati ma solo da inserire un token di reputazione per la firma è senz'altro sufficiente:
opendkim-genkey -s mail -d truelite.it
che genera una chiave RSA da 1024 bit, che comunque é la dimensione raccomandata dalle specifiche di DKIM e che è anche più semplice da
gestire con il DNS. (occorre verificare se si può usare la stessa chiave per più domini)
Questo crea due file usando come nome il selettore (l'argomento dell'opzione -s
), nel caso mail.private
con la chiave privata email.txt
che contiene il record TXT da aggiungere al DNS (ma questo fa fatto solo dopo aver verificato che la firma con DKIM funziona) con
la chiave pubblica.
Si tenga conto che con la configurazione precedente opendkim viene eseguito con un utente non privilegiato, per cui occorrerà cambiare il permesso della chiave privata con:
chown opendkim mail.private
Occorre poi inserire in /etc/opendkim/trusted_host
la lista degli IP/host/reti che si considerano fidate sia per la ricezione, che per la spedizione, in particolare usando questa lista con ExternalIgnoreList
si dice a OpenDKIM di ignorarle nella verifica delle email in ingresso, mentre con InternalHosts
si dice che la posta che arriva da detti IP deve essere firmata.
Occorre fare attenzione in particolare a InternalHosts
in quanto se non si indica nulla viene abilitata comunque la firma delle email inviata passando dal localhost
(o meglio da 127.0.0.1
, se come su Debian localhost
risolve in IPv6 su ::1
l'invio di email fatto con connessioni a localhost
non sarà firmato) ma se si indica un file, questo default sparisce e 127.0.0.1 deve essere esplicitamente inserito nel file. Un esempio è il seguente:
# localhost 127.0.0.1 ::1 localhost # other hosts holland.truelite.it 144.76.13.157 144.76.13.137 136.243.5.189 136.243.5.190 136.243.5.137 # local subnet 192.168.1.0/24
Avendola dichiarata in KeyTable
occorre inserire nel file /etc/opendkim/key_table
la tabella che indicizza le chiavi da utilizzare; la tabella è realizzata con due campi testuali separati da uno spazio.
Il primo campo è la chiave di indicizzazione e può essere una stringa qualsiasi (nel caso si è deciso di usare, per essere univoci, il nome del record TXT che metteremo nel DNS, ma poteva anche essere qualunque cosa).
Il secondo campo è il valore associato alla chiave che indica come effettuare la firma, e prevede tre valori che vanno scritti di seguito separati dal carattere ":" e senza spazi. Il primo valore indica il dominio che si vuole sia inserito nella firma (quello indicato come argomento di -d2 quando si è creata la chiave), il secondo indica il selettore (quello usato come argomento di
-s@ quando si è creata la chiave), ed il terzo il file (con il pathname assoluto, per semplicità) contenente la chiave privata con cui eseguire la firma; nel nostro caso si è usato (corripondendo ai parametri usati nel creare la chiave):
mail._domainkey.truelite.it truelite.it:mail:/etc/opendkim/truelite.it/mail.private mail._domainkey.truelite.eu truelite.eu:mail:/etc/opendkim/truelite.it/mail.private
ma poteva anche essere qualcosa del tipo:
pinco truelite.it:mail:/etc/opendkim/truelite.it/mail.private pluto truelite.eu:mail:/etc/opendkim/truelite.it/mail.private
La firma dei messaggi in uscita è controllata, avendolo impostato con SigningTable
, dal contenuto del /etc/opendkim/signing_table
, il file
contiene la tabella, con due campi separati da spaziature delle corrispondenze che consentono di selezionare, sulla base dell'indirizzo di posta del mittente, quale chiave crittografica usare per la firma, da indicare con l'etichetta usata in /etc/opendkim/key_table
.
Se si usa come nell'esempio un file ordinario il valore campo from viene confrontato con la chiave (il primo campo di /etc/opendkim/signing_table
) e se viene trovata una corrispondenza, la email viene firmata con la chiave crittografica indicata dal secondo campo (usata come indice in /etc/opendkim/key_table
). La corrispondenza deve essere esatta, ma viene cercata prima sul mittente completo, e poi sul dominio (e poi per il mittente su eventuali sottodomini).
Di default, a meno di non aver abilitato firme multiple, l'esame del file si ferma alla prima corrispondenza. Nel nostro caso si è usato:
truelite.it mail._domainkey.truelite.it truelite.eu mail._domainkey.truelite.eu
Se serve una corripondenza più complessa si può indicare nella configurazione di opendkim.conf
il file come:
SigningTable refile:/etc/opendkim/signing_table
ed in tal caso la chiave viene usata come pattern in cui si può usare un "*" come carattere jolly.
Una volta configurati i vari domini, le relative chiavi, e le modalità del relativo uso nella firma, si potrà avviare il servizio. Nel nostro caso si è preferito per semplicità, farlo ascoltare su un socket su localhost, questo si fa scommentando la seguente riga in /etc/default/opendkim
:
SOCKET="inet:12345@localhost" # listen on loopback on port 12345
è possibile anche usare un socket locale, che però andrà creato nel chroot di postfix (ad esempio in /var/spool/postfix/private/opendkim
) e con permessi adeguati a far si che postfix possa operarvi. Si ricordi di riavviare il servizio con:
service opendkim restart
Per poter usare il servizio di OpenDKIM da postfix occorre configurarne l'uso come milter, aggiungendo a /etc/postfix/main.cf
le seguenti righe:
# DKIM/DMARK addition milter_protocol = 6 milter_default_action = accept smtpd_milters = inet:localhost:12345 non_smtpd_milters = inet:localhost:12345
e conviene inoltre modificare la configurazione di amavis-new
in /etc/postfix/master.cf
aggiungendo:
127.0.0.1:10025 inet n - y - - smtpd -o content_filter= ... -o smtpd_hard_error_limit=1000 -o smtpd_milters=
per evitare di fagli eseguire due volte il filtro.
A questo punto si potrà riavviare Postfix e verificare, inviando una email, che questa sia correttamente firmata, riportando negli header qualcosa del tipo:
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=truelite.it; s=mail; t=1449592614; bh=73owTq/o58W9zoPsclFWibqVtDP8ZlpL+oASguLeSqM=; h=To:From:Subject:Date:From; b=QwEiNmvmmTGuwI+0j5Z9Too4jnAwswQ2orR1mcOoRGapCP3Tc8FSftzJm9Y0i4HR+ DpQJJXfEHPuB20hohsMm1ttMyoyokqPxoAMSuC/pnzkITjgn+/RZH1nqpeRKwvnTKC OBQOewHKiH5DnPyEIIqv3ATKn9CTb04DlFCpwHfXe97xLZm0n69DS9YFSJtVxtMCEa 5S67bV8kELwuOGqXK7GJ3KvWdMmYcEmubdgIOOnrbjn61lMztXLdifatDMKw1YZblp b5WRAhHHYe222lCimLE6CS2RF6+82jeqqgUHrq3WLNRYlvhc7qG/MlqVqZC1qzxMmy 32uYD888clI4A==
Il passo finale per completare la configurazione di DKIM è impostare il DNS per pubblicare la propria chiave. Il record da inserire nel proprio dominio è direttamente disponibile nel file mail.txt
, ma inserire direttamente il contenuto di questo file in un file di zona darà luogo ad errore in quanto la stringa di testo che indica la chiave è più lunga (per chiavi di 2048 bit come quella utilizzata) del massimo di 256 caratteri supportati da bind
, questo si può risolvere spezzando la stringa, pertanto si dovrà inserire nel file di zona qualcosa del tipo (questo non serve per le dimensioni di default di una chiave a 1024 bit, che possono essere inserite direttamente):
mail._domainkey IN TXT ( "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2MfnM" "zbBCutJTkkZQe+5kAZlls5MZzsSzRVMtOn/FS6fS14wB0+Qn+SIXbewZxcg/37+iJ/" "qiOe5Xf7GF4IzvVSlXKswLVtiLdZU//0Dkq5YByL9pEQwtgsEJOnV+cHUEyjDRfoFk" "Qp0GdZXw/V42Pa7RzIAGFlJAPRAwCrEOYcMCPvu243PLjUhjV8Dl79EEipaZKLAAdyK" "2XsyDOGTTuBHiQ5Y06IV7BTi9cS76limReZcAGUBds/cwRvzZNhnq8V+sEEe05p0TrD" "0HcPwDCLT7M6tvb8q+1KDqBQzZF5xtILOPiEYFUEaBuBSkh2BNTQaa8UnlYnXUjJ5Ed" "Q5AQIDAQAB" )
per verificare la firma si installi:
apt-get install python-dkim
e poi si potrà effettuare la verifica con:
dkimverify < /path/to/email/message
Come passo ulteriore si può installare OpenDMARC per abilitare la verifica di DMARC su postfix, ma serve solo per la ricezione, per cui se non si intende usarlo, si può saltare questa parte. Per Wheezy il pacchetto è disponibile nei backports, e si installa con:
apt-get install -t wheezy-backports install opendmarc
per la configurazione si aggiunga a /etc/opendmark.conf
le seguenti righe:
## ## Added values ## AuthservID HOSTNAME TrustedAuthservIDs HOSTNAME #TrustedAuthservIDs jojo.truelite.it holland.truelite.it IgnoreHosts /etc/opendmarc/ignore.hosts HistoryFile /var/run/opendmarc/opendmarc.dat # for test SoftwareHeader true
nel file /etc/opendmarc/ignore.hosts
va messo l'elenco delle macchine per le quali non si vuole effettuare il controllo della posta ricevuta con DMARC. Questo vale per il server stesso (ed infatti in genere vi si mette il localhost
) ma anche per le reti locali del mynetworks
di Postfix, che in genere non vengono elencate nei record di SPF. In questo modo si evita che il server, pur spedendo correttamente verso l'esterno, classifiche le email provenienti dai suddetti indirizzi come fail
per DMARC quando le controlla. Un esempio del file è il seguente:
# localhost 127.0.0.1 holland.truelite.it 192.168.2.0/24 192.168.1.0/24 # other hosts jojo.truelite.it
Invece in /var/run/opendmarc/opendmarc.dat
verranno salvati i dati dei controlli eventualmente usabili per inviare i rapporti ai mittenti (non ancora configurati).
Le configurazioni di AuthservID
e TrustedAuthservIDs
con HOSTNAME
sono necessarie perché il programma possa generare un header con i risultati dell'autenticazione di DMARC. Invece SPFSelfValidate
dovrebe richiedergli di controllare il risultato di SPF se non lo trova negli header.
Per poter usare il servizio occorrerà attivare l'uso di un socket inserendo in /etc/default/opendmark
la riga:
SOCKET="inet:54321@localhost" # listen on loopback on port 12345
e modificare la configurazione di postfix in /etc/postfix/main.cf
in:
# DKIM/DMARK addition milter_protocol = 6 milter_default_action = accept smtpd_milters = inet:localhost:12345,inet:localhost:54321 non_smtpd_milters = ${smtpd_milters}
ricordandosi di riavviare i servizi:
service opendmarc restart service postfix restart
Aggiornato da Simone Piccardi oltre 8 anni fa · 2 revisions