Progetto

Generale

Profilo

Actions

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 -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 7 anni fa · 2 revisions