Project

General

Profile

DKIM-DMARC-SPF » History » Version 1

Version 1/2 - Next » - Current version
Simone Piccardi, 08/12/2016 03:16 PM


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 e
mail.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 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:
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 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