DKIM-DMARC-SPF » Cronologia » Versione 1
Versione 1/2
| Successivo »
Simone Piccardi, 12-08-2016 15:16
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 conAuthserv_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 -d 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 conSigningTable
, 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:
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:
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 delmynetworks
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 · 1 revisions