Differences between revisions 6 and 7
Revision 6 as of 2022-03-14 13:52:18
Size: 6325
Editor: Kurgan
Comment:
Revision 7 as of 2023-01-26 13:34:56
Size: 6329
Editor: Kurgan
Comment:
Deletions are marked like this. Additions are marked like this.
Line 69: Line 69:
_domainkey IN TXT "t=y; o=~;" PER TESTING
_domainkey IN TXT "o=~" PER PRODUZIONE
_domainkey IN TXT "o=-" PER PRODUZIONE
_dmarc IN TXT "v=DMARC1; p=none" CONFIG MINIMALE DMARC
_domainkey IN TXT "t=y; o=~;" ;PER TESTING
_domainkey IN TXT "o=~" ;PER PRODUZIONE
_domainkey IN TXT "o=-" ;PER PRODUZIONE
_dmarc IN TXT "v=DMARC1; p=none" ;CONFIG MINIMALE DMARC

DKIM su Exim 4 v.4.94 e successive

Il supporto a DKIM esiste in Exim4 sia in ingresso che in uscita. Prima di tutto, mi occupero` della configurazione in uscita, ovvero di firmare le email uscenti dal mio server. Il controllo delle firme in ingresso sara` oggetto di un lavoro futuro.

DKIM in uscita su Exim 4

Il sistema qui descritto permette di firmare automaticamente tutte le email in uscita. E` adatto a una configurazione multidominio, con diverse chiavi di firma una per dominio. Se una chiave per un dominio manca, le mail in uscita non vengono firmate, senza che vi sia alcun errore. Questo e` un comportamento voluto. La configurazione di DKIM in uscita e` composta principalmente di 3 passi:

  • Configurare Exim
  • Creare le chiavi per i domini che vogliamo configurare
  • Pubblicare le chiavi pubbliche nel DNS per i vari domini.

Va faro` l'esempio con il mio dominio, kurgan.org.

Configurazione di Exim4

  • Nella configurazione di exim aggiungo questa definizione di variabile, che indica il posto in cui conservero` le chiavi DKIM. Ovviamente e` a vostra scelta spostarle. Nella mia configurazione sono dentro a /etc/exim4/dkim/.

    # dove si trova la configurazione di exim4
    EXIM4=/etc/exim4
    
    # Dove si trovano le chiavi per DKIM
    DKIM_PATH = EXIM4/dkim
  • Sempre nella configurazione di Exim, nel trasporto che fa SMTP in uscita, devo aggiungere delle impostazioni relative a DKIM. Nella mia configurazione il trasporto in questione e` remote_smtp:

    # Delivery via SMTP all' MX del dominio remoto
    remote_smtp:
      driver = smtp
      # parametri per DKIM
      dkim_canon = relaxed
      dkim_selector = dkim
      dkim_domain = ${lc:$sender_address_domain}
      # TAINT facendo un lookup dsearch il risultato è non tainted
      dkim_private_key = ${lookup {${lc:$sender_address_domain}-private.pem} dsearch,ret=full {DKIM_PATH}}

Se andate a leggervi la documentazione di Exim vedrete che ci sono altri parametri per il DKIM. Studiate.

Creazione dei files di chiavi pubbliche / private

Abbiamo detto che nella nostra configurazione mettiamo i files di chiavi dentro a /etc/exim4/dkim/, quindi creiamo la directory, entriamoci, e creiamo le chiavi. Questa procedura va ripetuta per ogni dominio per il quale vogliamo usare DKIM in uscita. Questi files devono essere leggibili dall'utente con cui gira Exim, ovviamente. Nota che ci sono due sintassi diverse a seconda dalla versione di Openssl che usate:

  • Per le vecchie versioni di openssl (fino a Debian 8 / Devuan 1)
    openssl genrsa -out kurgan.org-private.pem 1024 -outform PEM
    openssl rsa -in kurgan.org-private.pem -out kurgan.org.pem -pubout -outform PEM
  • Per le versioni successive di openssl
    openssl genpkey -algorithm RSA -out kurgan.org-private.pem -pkeyopt rsa_keygen_bits:1024
    openssl rsa -in kurgan.org-private.pem -out kurgan.org.pem -pubout -outform PEM

Questi comandi generano due chiavi, una pubblica e una privata, per il dominio kurgan.org. Notare che nelle chiavi, che non sono certificati, non c'e` scritto il dominio da nessuna parte. Quello che conta e` che la chiave pubblica e` derivata dalla privata. I nomi dei files contengono il nome del dominio (in minuscolo) perche` e` cosi` che Exim li cerca, stando alla configurazione che ho appena fatto. Queste chiavi sono valide per sempre, non vanno rinnovate, ma possono essere rifatte in ogni momento se lo riteniamo necessario. E` sufficiente ripubblicare la nuova chiave pubblica sul DNS. (vedi il passo dopo)

Pubblicazione della chiave pubblica sul DNS

Il contenuto della chiave pubblica (SOLO QUELLA PUBBLICA) va pubblicato sul DNS in un record TXT. Inoltre sempre sul DNS vanno pubblicate le "regole" che vogliamo (vorremmo) che gli altri seguissero quando ricevono mail da noi. Ovvero, se vogliamo o meno che gli altri accettino per esempio anche i messaggi non firmati o la cui verifica della firma fallisce, oppure se siamo cosi` sicuri che il nostro sistema non mandera` mai via messaggi non firmati, che vogliamo che gli altri rifiutino in toto i messaggi non firmati da noi.

Dobbiamo quindi creare due record TXT per il nostro dominio, cosi` fatti:

dkim._domainkey IN      TXT     "k=rsa; p=CHIAVE PUBBLICA RSA"
_domainkey      IN      TXT     "t=y; o=~;"  ;PER TESTING
_domainkey      IN      TXT     "o=~"        ;PER PRODUZIONE
_domainkey      IN      TXT     "o=-"        ;PER PRODUZIONE
_dmarc          IN      TXT     "v=DMARC1; p=none" ;CONFIG MINIMALE DMARC

Nota bene: la chiave pubblica deve essere inserita senza la prima e l'ultima riga, ovvero non deve contenere i due pezzi -----BEGIN PUBLIC KEY----- e -----END PUBLIC KEY----- e inoltre deve essere su una sola riga.

Poniamo attenzione alla stringa che determina le regole per il dominio:

  • t=y significa che stiamo provando il sistema, e quindi se ci sono errori nella verifica della firma questi vanno ignorati da parte del ricevente della email. Quando siamo confidenti che funziona tutto, togliamo totalmente questa stringa.

  • o=~ significa che non tutte le email che mandiamo sono firmate con DKIM, quindi il ricevente non dovrebbe buttare via una nostra email se non e` firmata.

  • o=- significa che tutte le email che mandiamo sono firmate con DKIM, quindi il ricevente puo` applicare una policy piu` aggressiva e buttare via le nostre email non firmate.

Potete verificare se avete pubblicato bene questi dati usando questi comandi (ovviamente il vostro dominio al posto del mio):

host -t txt _domainkey.kurgan.org
host -t txt dkim._domainkey.kurgan.org

Il risultato dovrebbe essere qualcosa del tipo:

# host -t txt _domainkey.kurgan.org
_domainkey.kurgan.org descriptive text "t=y\; o=~\;"

# host -t txt dkim._domainkey.kurgan.org
dkim._domainkey.kurgan.org descriptive text "k=rsa\; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDCAm+FLU8fTj5dF+5EDMDsox+12xUvHZMi79gwYD2E0t/+b7AEolifWQbyzTMjO5gIrvO5Lq/HMvX0n6b2YeGZBQ3wBxQWfE81n7zwZlkWbdKJ6D2Qjf2ucjhfax4OQJQDRVgF/UevdPSzWxLjMSgeFXXApW9Zoy+MxuXUc2/P1wIDAQAB"

Potete ulteriormente verificare se funziona tutto usando lo strumento di validazione che trovate a https://www.mail-tester.com/ oppure https://mxtoolbox.com

LinuxDebian/Exim4-DKIM (last edited 2023-01-26 13:34:56 by Kurgan)