Newsgroup: it.comp.os.linux.sys
Titolo: DKIM

Ciao a tutti e buone feste.
 
Ho bisogno di un chiarimento su DKIM.
Parlando, ad esempio, di exi, ci sono due parametri che non mi sono chiari:
 
dkim_domain, dkim_selector
 
Se ho ben capito, vengono usati per cifrare la mail e, credo, per selezionare la chiave corretta tramite DNS.
 
Devono avere corrispondenza con il dominio della mail oppure possono essere indipendenti?
 
Mi spiego, supponendo di avere un dominio 
pippo.it
 da voler mettere sotto DKIM,
dovrò avere un dkim_domain settato a 
pippo.it
 e rispettivo selettore oppure posso farne uno generico, come ad esempio 
ilmiodominioperdkim.com
 e quindi usare un selettore per ogni dominio da firmare, esempio: "pippo-it" ?
 
In quest'ultimo caso, con un singolo dominio usato come "repository" posso firmare più domini cambiando il solo selettore.

 firmare più domini cambiando il solo selettore.
 
Volendo complicarsi la vita anche così' come dici.
 
DKIM è utile quando viene utilizzato come sistema di reputazione.
 
Se la gente se ne sbatte della reputazione del dominio 
pippo.it
 allora dkim 
non serve a nulla (peggio se la reputazione è negativa).
Se la gente non conosce il dominio 
pippo.it
 che è firmato con DKIM della 
reputazione non se ne fa nulla. Anzi, sono moltissime le mail di spam 
firmate.
Se la gente se ne sbatte della reputazione di chi firma, non serve a niente 
nemmeno in uscita.
 
DKIM è utile per fare scoring e per segare via email di alcuni domini da cui 
ti aspetti che le mail siano firmate (che ne so, paypal ad esempio).
 
Prima nota: alcune mailing list "rompono" le firme dkim quindi non puoi 
segare tutto a prescindere.
 
Seconda nota: guardati anche ADSP ma più per sapere cosa sia: anche questo è 
spesso disatteso o interpretato male
 
Terza nota: se ti arriva una mail con firmati solo il campo message-id e il 
content-type puoi anche ignorarla: è una firma che non serve a nulla (quindi 
anche qui dovresti definire un subset minimo di headers che ti aspetti di 
trovare firmati per validarla e dargli una utilità).
 
Vado di fretta e magari non sono stato chiarissimo ma spero di averti dato 
qualche spunto.
 
Buon Natale.
 
 

 qualche spunto.
 
Sei stato chiarissimo.
 
Io per ora sego brutalmente tutto ciò che mi arriva con una firma dkim non valida e/o malformata. Delle mailinglist, per ora, me ne frego.
Ho un problema che devo risolvere: ricevo da 10 giorni a sta parte, tonnellate di spam a mio nome, proveniente da server sicuramente compromessi. Adottando dkim, risolverei il problema "lato mio" ovvero non riceverei più mail forgiate di miei domini dato che non essendo firmate verrebbero segate ed allo stesso tempo risolverei il problema anche lato remoto per tutti i server riceventi che adottano dkim.

 tutti i server riceventi che adottano dkim.
 
Secondo me l'approccio è sbagliato.
SPF potrebbe essere molto più corretto.
 
Quanto alle ML, occhio che whitelistare ex post ti fa perdere parecchia 
roba.
 
 

 roba.
 
? Questa non l'ho capita. Io whitelisto prima dei check, altrimenti che whitelist sarebbe? Perchè dici ex post?

 whitelist sarebbe? Perchè dici ex post?
 
Se prima vai di reject indiscriminato e poi whitelisti alla bisogna, 
allora hai già perso parecchie mail.
Se non te ne frega nulla di quelle mailing list, allora non fa differenza.

 Se non te ne frega nulla di quelle mailing list, allora non fa differenza.
 
Ah ok, ora ho capito.
Io filtro solo quelle che hanno una firma dkim errata.
Se la mailinglist pubblica un record dkim e firma in maniera sbagliata la mail, il problema non è mio. Se non ha record DKIM, non è soggetto a filtro.

 apposta.
 
Sembra interessante, mi documento.
Hai idea di come si implementi su Exim?

 filtro.
 
None...
Che io sappia nessun mailing list manager firma o gestisce le firme dkim.
Il pattern normale è: tu mandi una mail che il tuo MTA firma con DKIM.
La mail arriva al mailing list manager che la ignora ma modifica la tua mail 
originale modificando il From: o altri headers (o pure il contenuto, perchè 
no).
Il risultato è che la tua mail, con l'header DKIM originale, è stata 
modificata e non valida più e chi la riceve se non sta attento, la butta.
 


https://lists.exim.org/lurker/message/20110107.204518.c532097f.en.html
 ??
 
(mai fatto, però... testalo bene perchè metterlo in produzione secondo me è 
rischioso)
 

 Che io sappia nessun mailing list manager firma o gestisce le firme dkim.
 
Sorry, per mailinglist intendevo "newsletter", di gran lunga più frequenti oggigiorno.
 
Potrei verificare la presenza di un header List-Unsubscribe o cose simili e se c'è, ignorare dkim. Così facendo dovrei riuscire a bypassare il 99.99% delle mailinglist.

 rischioso)
 
Ammetto di non capire come funziona l'implementazione dkim su exim.
Ho letto svariati documenti, ma non mi sono ancora chiari alcuni punti:
 
1) come funziona? Controlla il dominio prendendolo dal from o da envelope?
2) settando 'dkim_verify_signers' a '
paypal.com
', quel 
paypal.com
 da dove è preso, dal From?

 è preso, dal From?
 
Nel link che ti ho incollato vedo:
 
dkim_verify_signers = 
 ${ifdef:h_from:{${domain:$h_from:}}{$sender_address_domain}}:
 $dkim_signers
 
quindi viene preso dall'header from, se presente, altrimenti dall'envelope.
 
 

 99.99% delle mailinglist.
 
E' una strada, volendo.
 

 quindi viene preso dall'header from, se presente, altrimenti dall'envelope.
 
Il punto è un altro.
Se io li ci metto "
pincopallino.it
" (indipendentemente da macro e cose varie, faccio una brutale lista statica), Exim su cosa matcha ?
 
Come fa a sapere che la mail proviene da 
pincopallino.it
 e quindi, essendo presente in dkim_verify_signers deve matchare obbligatoriamente il dkim?
lo fa in base all'hostname del client? al from? ai dati di envelope?
Di certo non in base alla signature DKIM, visto che inserendo in tale lista un dominio qualunque, il check DKIM sarà fatto indipendentemente dalla presenza o meno della signature.
 
Perchè io in quella lista posso mettere tutti i domini che voglio, ma su cosa viene fatto il match?
 
Non so se mi son spiegato.

 Non so se mi son spiegato.
 
No! :-D

 No! :-D
 
Se nella lista di cui sopra metto in maniera statica "
pippo.it
", quel "
pippo.it
" a cosa corrisponde? Al dominio presente nel From? Al dominio nei dati di envelope? Al dominio dell'hostname?
 
Exim, su cosa fa il match?
 


Capitolo 56
 
http://www.exim.org/exim-html-current/doc/html/spec_html/index.html
 
 
 
The global option dkim_verify_signers can be set to a colon-separated 
list of DKIM domains or identities for which the ACL acl_smtp_dkim is 
called. It is expanded when the message has been received. At this point, 
the expansion variable $dkim_signers already contains a colon-separated 
list of signer domains and identities for the message. When 
dkim_verify_signers is not specified in the main configuration, it 
defaults as: 
 
dkim_verify_signers = $dkim_signers
 
-------------------------------------
 
il "signer domain" è il tag d= della firma DKIM.
 

 il "signer domain" è il tag d= della firma DKIM.
 
Stiamo girando in tondo.
Di default, è come dici te in quanto viene espansa la variabile che contiene il tag "d" della firma DKIM (se non c'è la firma, la variabile è nulla e quindi nessun check viene fatto).
 
Ma se dentro quella lista metto dei domini arbitrari, quindi bypassando l'espansione della variabile in questione, il match del dominio, su quale parte della mail viene fatta?
 
Io ho:
 
dkim_verify_signers = pippo.it:pluto.com:$dkim_signers 
 
pertanto, oltre alle mail contenenti la firma dkim, faccio il check dkim anche per "
pippo.it
" e "
pluto.com
" (come da alcuni esempi paypal che ho trovato in giro, visto che paypal firma sempre *tutte* le mail).
Quello che non capisco, è su quale parte della mail vien fatto il check del dominio.

 del dominio.
 
Secondo me dovresti darti una letta alla RFC.
 
In breve DKIM firma parte (o tutti) gli headers e parte o tutto il body 
della mail.
Se negli headers è contenuto il dominio di qualcosa, tali 
"stringhe" (perchè così sono trattate) andranno a far parte della firma.
 
E' per questo che firme dkim che non includano gli headers From: o To: o 
Sender: sono spessissimo inutili e talvolta indice di possibile frode.
 

 negli headers, non avviene nulla.
 
No, non è così, guarda:
 
X-DKIM-Status: none [(
paypal.com
)]
X-DKIM-Status: none [(
paypal.it
)]
X-DKIM-Status: none [(
ebay.com
)]
X-DKIM-Status: none [(
gmail.com
)]
X-DKIM-Status: none [(
google.com
)]
 
Io aggiungo un header ogni volta che viene richiamata la ACL di verifica DKIM.
Come puoi vedere sopra, la ACL viene richiamata 5 volte, ovvero una volta per ogni valore di dkim_verify_signers, che nel mio caso risulta essere:
 
dkim_verify_signers = paypal.com:paypal.it:ebay.com:ebay.it:gmail.com:gmail.it:$dkim_signers
 
Nel caso dkim_signers fosse vuoto (come nell'esempio di cui sopra), la ACL viene richiamata solo 5 volte, perchè 5 sono i domini statici che ho inserito.
Se dkim_signers fosse popolato, la ACL sarebbe richiamata 5 volte più tutte le volte per ciascun dominio presente in dkim_signers, quindi almeno 6 volte.
 
Questo per un motivo molto semplice: paypal firma TUTTE le mail in uscita, quindi è legittimo e sicuro forzare il check dkim per tutte le mail provenienti da paypal, altrimenti, un malintenzionato potrebbe bypassare dkim semplicemente non includendo la firma. Lo stesso metodo è usato da google, che rifiuta paypal ed ebay se non contengono obbligatoriamente una firma dkim valida.
 
Ed il ragionamento fila. Se sai a priori che un dato mittente firma tutto con dkim, puoi forzarne la verifica e rifiutare tutto ciò che non è valido o mancante.
 
Lo stesso è indicato nella documentazione di Exim, paragrafo 2, capitolo 56:
"dkim_verify_signers = paypal.com:ebay.com:$dkim_signers
This would result in acl_smtp_dkim always being called for "
paypal.com
" and "
ebay.com
", plus all domains and identities that have signatures in the message."
 
La domanda però è: cosa identifica "
paypal.com
"?
 
Brutale esempio in pseudocodice php:
 
if ( in_array($qualcosa, $dkim_verify_signers) ) {
   fai_verifica_dkim();
}
 
Quel $qualcosa, che diavolo è? Il dominio del From ?
 
 
 
Ripensandoci ora:
probabilmente non è exim che richiama la acl se il mittente compare in dkim_verify_signers ma exim richiama tale ACL sempre e comunque per ogni dominio elencato in tale lista.
 
Il filtro vero e proprio viene poi fatto dentro la ACL stessa, in base alle condition, tipo:
 
sender_domains = paypal.com:p
aypal.de
 
dkim_signers = paypal.com:p
aypal.de
 
dkim_status = none:invalid:fail
 
in questo caso, se il mittente è paypal e la firma manca, non è valida o è errata, lui fa scattare la acl.
 
 

 è errata, lui fa scattare la acl.
 
DKIM non serve per fare reject a meno che abbia un record ADSP collegato 
ed impostato a 'discardable'.
 
Se devi fare reject di paypal ed ebay, senza scomodare dkim (che mi pare 
tu non abbia digerito bene in termini di filosofia), ti basta verificare 
che il From: e l'envelope sender siano dello stesso dominio e al resto ci 
pensa SPF. 
 
 
 

 senza scomodare dkim (che mi pare tu non abbia digerito bene in termini di filosofia),
 
Si nota molto che di DKIM non ho capito nulla? :)
 
Scherzi a parte, io stavo seguendo la guida ufficiale di exim e riporta un esempio che tu dici non avere senso.
Invece, il senso c'è. Serve a far richiamare la ACL di verifica DKIM per tutti i domini elencati e non richiamarla solo in caso di presenza firma.
 
Il perchè l'ho già detto: se paypal firma tutto con dkim, la firma ci sarà sempre. Uno spammer, però, invierebbe senza firma dkim ed usando la configurazione standard di exim, non farebbe scattare la ACL e quindi la mail passerebbe. Usando l'esempio della stessa documentazione, invece, la ACL scatterebbe comunque, il check dkim su paypal fallirebbe e la mail sarebbe bloccata.
 
Non mi è chiaro come usare tale ACL pertanto faccio molta fatica a spiegarmi.
 
 
(il 'none' del mio esempio è corretto: sto forzando il check dkim su una mail senza firma, è normale sia none. Se tale mail avesse avuto paypal come envelope sarebbe stata bloccata)

 spiegarmi.
 
Se guardi su quel link si capisce come funziona e quale è il corretto 
approccio per utilizzare in maniera corretta DKIM associato ad ADSP per 
fare reject.
 
Da quello che ho capito tu vuoi utilizzare DKIM per fare reject delle 
mail che originano dai tuoi domini ma per quello c'è SPF che è pure più 
immediato.
 
O sbaglio ?

 O sbaglio ?
 
Ni. SPF come scritto da qualche parte non va bene, perchè blocca su envelope mentre io devo bloccare sul from.
 
Allora, pensavo di fare 2+2, portando come esempio paypal:
 
Hai un From: *@
paypal.com
 ? Allora *DEVE* esserci la firma dkim ed il check deve avere esito positivo, in tutti gli altri casi, sego.
Idem per gmail,
google.com
,ebay, miei domini.
 
Indipendentemente da ADSP, perchè, come riportato nella stessa doc. di exim, è possibile forzare l'ingresso nella acl dkim anche per email che non contengono la firma (quindi, in certi casi come paypal, sicuramente spam). Quello che non capisco è cosa usi Exim per fare il match nell'array in questione, visto che la firma dkim non c'è.

 in questione, visto che la firma dkim non c'è.
 
Ma fare il match di cosa ?
 
 

 le mail dai tuoi server e quindi puoi applicare SPF.
 
No.
SPF filtra su envelope, se io mando una mail con evelope 
pi...@pluto.it
 e poi
tra gli header ci metto un bel From: 
i...@me.com
 SPF interviene su 
pluto.it
 e
non su 
me.com
 
 
Ed il mio problema è evitare di ricevere mail avente il mio from e envelope
di altri che non pubblicano SPF.
 
Il ho bisogno di filtrare l'header From.

 paypal ti suggerisce tale reazione.
 
Sembra funzionare.
Ho provato a mettere volutamente envelope differente dal header From e lui mi fa il reject perchè io non sono paypal:
 
$ telnet x 25
Trying x...
Connected to x.
Escape character is '^]'.
220 x ESMTP Server
EHLO 
google.com
 
250-x Hello 
google.com
 [x]
250-SIZE 52428800
250-PIPELINING
250 HELP
MAIL FROM: 
in...@google.com
 
250 OK
RCPT TO: x
250 Accepted
DATA
354 Enter message, ending with "." on a line by itself
From: 
in...@paypal.com
 
To: x
Subject: TEST
 
Ciao
.
550-DKIM/ADSP: No DKIM signature present, but 
paypal.com
 has a 'discardable'
550 ADSP policy
Connection closed by foreign host.


Finalmente hai detto cosa vuoi, ci è voluto un pò ma l'importante è 
arrivarci.
 
Il problema del tuo dominio quando viene ricevuto da altri lo puoi, 
forse, talvolta, risolvere con DKIM+ADSP(discardable).
Talvolta perchè chi utilizza DKIM per fare reject è una minoranza di 
sistemi ma tentar non nuoce. 
Sicuramente impostando un record DKIM ed uno ADSP non generi danni nè a 
te nè ad altri.
Non risolverai però un problema insito nel protocollo SMTP da quando è 
nato perchè non è possibile (avresti trovato la soluzione al phishing).
 
 
Premesso questo, in fase di ricezione valgono le stesse considerazioni 
(sulla non soluzione del problema) e anche quelle che ti ho già fatto nei 
post precedenti: se vuoi bloccare le TUE mail che originano da "fuori" i 
tuoi sistemi puoi farlo a prescindere, senza complicarti la vita con DKIM 
(sempre se sai riconoscere - e credo sia scontato - quello che produci tu 
e quello che viene prodotto fuori dai tuoi sistemi).
 

 e quello che viene prodotto fuori dai tuoi sistemi).
 
Beh, lato mio, posso tranquillamente filtrare sul from ed allo stesso tempo un IP. Se c'è il mio from, allora la mail *DEVE* provenire da un dato ip, quello del mio smtp. Risolvo in 5 minuti, ma non risolvo (nè limito) il phishing verso l'esterno.
 
Comunque sia, ho attivato ADSP. Se ho ben capito funziona così:
 
 - verifica la presenza di un record TXT per ADSP.
 - se c'è il record ed è 'discardable' allora verifica la presenza di un record DKIM
 - se c'è DKIM e la verifica che è stata fatta sulla mail non è 'pass' sego via tutto (perchè ADSL ha detto discardable)