Project

General

Profile

DKIM-DMARC-SPF » History » Version 1

Simone Piccardi, 08/12/2016 03:16 PM

1 1 Simone Piccardi
h1. Installazione di DKIM/DMARC/SPF & C
2
3
Per gestire la posta in uscita per SPF non occorre fare altro che creare il
4
relativo record TXT sul proprio dominio, se però si vuole verificare la
5
validità della posta in ingresso e prendere eventuali provvedimenti, occorrerà
6
installare (dal pacchetto omonimo) e configurare @postfix-policyd-spf-python@.
7
8
Il file di configurazione è
9
@/etc/postfix-policyd-spf-python/policyd-spf.conf@, in cui inserire un
10
contenuto del tipo:
11
12
<pre>
13
#HELO_reject = SPF_Not_Pass
14
#Mail_From_reject = Fail
15
HELO_reject = False
16
Mail_From_reject = False
17
18
Authserv_Id = holland
19
Header_Type = SPF
20
</pre>
21
22
in cui di commentano le istruzioni che farebbero respingere la posta, si
23
indica la macchina che esegue i controlli (indicando l'hostname con
24
@Authserv_Id@) e si indica con @Header_Type@ di inserire un header coi
25
risultati di autenticazione. Le due possibilità sono @AR@ e @SPF@, il primo
26
sarebbe lo standard preferito da @opendmarc@, ma non funziona.
27
28
Occorre poi configurare postfix per usare il programma come policy service,
29
pertanto si dovrà prima configurarne l'avvio in @master.cf@ aggiungendo le
30
righe:
31
32
<pre>
33
# for SPF check
34
policyd-spf  unix  -       n       n       -       0       spawn
35
  user=nobody argv=/usr/bin/python /usr/bin/policyd-spf /etc/postfix-policyd-spf
36
-python/policyd-spf.conf
37
</pre>
38
39
e poi abilitarne l'uso in @main.cf@ con:
40
41
<pre>
42
smtpd_recipient_restrictions =
43
        ...
44
        reject_unauth_destination,
45
        check_policy_service unix:private/policyd-spf,
46
        ...
47
48
policyd-spf_time_limit = 3600
49
</pre>
50
51
Per Debian Wheezy. Installare OpenDKIM:
52
53
<pre>
54
apt-get install opendkim opendkim-tools
55
</pre>
56
57
modificare il file di configurazione @/etc/opendkim.conf@ aggiungendo:
58
59
<pre>
60
## Added configurations
61
62
KeyTable           /etc/opendkim/key_table
63
SigningTable       /etc/opendkim/signing_table
64
ExternalIgnoreList /etc/opendkim/trusted_hosts
65
InternalHosts      /etc/opendkim/trusted_hosts
66
AutoRestart             Yes
67
AutoRestartRate         10/1h
68
Mode                    sv
69
PidFile                 /var/run/opendkim/opendkim.pid
70
SignatureAlgorithm      rsa-sha256
71
Canonicalization        relaxed/simple
72
UserID                  opendkim:opendkim
73
74
# Added to write headers
75
AuthservID     HOSTNAME
76
</pre>
77
78
Dove l'ultima riga è essenziale se si vuole che @opendkim@ controllando le
79
firme dei messaggi in arrivo costruisca un corretto header di autenticazione
80
ad uso sia di @opendmarc@ che del debug dei relativi problemi, la parola
81
chiave @HOSTNAME@ assegna un identificativo di chi ha eseguito il controllo
82
automaticamente inizializzato all'hostname della macchina su cui lo si esegue. 
83
84
Occorre poi creare la directory @/etc/opendkim/@ ed una sottodirectory per
85
ciascun dominio che si vuole utilizzare:
86
87
<pre>
88
mkdir /etc/opendkim
89
mkdir /etc/opendkim/truelite.it
90
mkdir /etc/opendkim/fountainpen.it
91
...
92
</pre>
93
94
per ciascun dominio creare una chiave RSA con:
95
96
<pre>
97
cd /etc/opendkim/truelite.it
98
opendkim-genkey -b 2048 -s mail -d truelite.it
99
</pre>
100
101
oppure, se non si è paranoici e ci si accontenta della sicurezza
102
standard che nel caso, non avendo da cifrare dati ma solo da inserire
103
un token di reputazione per la firma è senz'altro sufficiente:
104
105
<pre>
106
opendkim-genkey -s mail -d truelite.it
107
</pre>
108
109
che genera una chiave RSA da 1024 bit, che comunque é la dimensione
110
raccomandata dalle specifiche di DKIM e che è anche più semplice da
111
gestire con il DNS. (occorre verificare se si può usare la stessa
112
chiave per più domini)
113
114
Questo crea due file usando come nome il selettore (l'argomento
115
dell'opzione @-s@), nel caso @mail.private@ con la chiave privata e
116
@mail.txt@ che contiene il record TXT da aggiungere al DNS (ma questo
117
fa fatto solo dopo aver verificato che la firma con DKIM funziona) con
118
la chiave pubblica.
119
120
Si tenga conto che con la configurazione precedente opendkim viene eseguito
121
con un utente non privilegiato, per cui occorrerà cambiare il permesso della
122
chiave privata con:
123
124
<pre>
125
chown opendkim mail.private
126
</pre>
127
128
Occorre poi inserire in @/etc/opendkim/trusted_host@ la lista degli
129
IP/host/reti che si considerano fidate sia per la ricezione, che per la
130
spedizione, in particolare usando questa lista con @ExternalIgnoreList@ si
131
dice a OpenDKIM di ignorarle nella verifica delle email in ingresso, mentre
132
con @InternalHosts@ si dice che la posta che arriva da detti IP deve essere
133
firmata.
134
135
Occorre fare attenzione in particolare a @InternalHosts@ in quanto se non si
136
indica nulla viene abilitata comunque la firma delle email inviata passando
137
dal @localhost@ (o meglio da @127.0.0.1@, se come su Debian @localhost@
138
risolve in IPv6 su @::1@ l'invio di email fatto con connessioni a @localhost@
139
non sarà firmato) ma se si indica un file, questo default sparisce e 127.0.0.1
140
deve essere esplicitamente inserito nel file. Un esempio è il seguente:
141
142
<pre>
143
# localhost
144
127.0.0.1
145
::1
146
localhost
147
# other hosts
148
holland.truelite.it
149
144.76.13.157
150
144.76.13.137
151
136.243.5.189
152
136.243.5.190
153
136.243.5.137
154
# local subnet
155
192.168.1.0/24
156
</pre>
157
158
Avendola dichiarata in @KeyTable@ occorre inserire nel file
159
@/etc/opendkim/key_table@ la tabella che indicizza le chiavi da utilizzare; la
160
tabella è realizzata con due campi testuali separati da uno spazio.
161
162
Il primo campo è la chiave di indicizzazione e può essere una stringa
163
qualsiasi (nel caso si è deciso di usare, per essere univoci, il nome del
164
record TXT che metteremo nel DNS, ma poteva anche essere qualunque cosa).
165
166
Il secondo campo è il valore associato alla chiave che indica come effettuare
167
la firma, e prevede tre valori che vanno scritti di seguito separati dal
168
carattere ":" e senza spazi. Il primo valore indica il dominio che si vuole
169
sia inserito nella firma (quello indicato come argomento di -d quando si è
170
creata la chiave), il secondo indica il selettore (quello usato come argomento
171
di -s quando si è creata la chiave), ed il terzo il file (con il pathname
172
assoluto, per semplicità) contenente la chiave privata con cui eseguire la
173
firma; nel nostro caso si è usato (corripondendo ai parametri usati nel creare
174
la chiave):
175
176
177
178
<pre>
179
mail._domainkey.truelite.it truelite.it:mail:/etc/opendkim/truelite.it/mail.private
180
mail._domainkey.truelite.eu truelite.eu:mail:/etc/opendkim/truelite.it/mail.private
181
</pre>
182
183
ma poteva anche essere qualcosa del tipo:
184
185
<pre>
186
pinco   truelite.it:mail:/etc/opendkim/truelite.it/mail.private
187
pluto   truelite.eu:mail:/etc/opendkim/truelite.it/mail.private
188
</pre>
189
190
La firma dei messaggi in uscita è controllata, avendolo impostato con
191
@SigningTable@, dal contenuto del @/etc/opendkim/signing_table@, il file
192
contiene la tabella, con due campi separati da spaziature delle corrispondenze
193
che consentono di selezionare, sulla base dell'indirizzo di posta del
194
mittente, quale chiave crittografica usare per la firma, da indicare con
195
l'etichetta usata in @/etc/opendkim/key_table@.
196
197
Se si usa come nell'esempio un file ordinario il valore campo from viene
198
confrontato con la chiave (il primo campo di @/etc/opendkim/signing_table@) e se
199
viene trovata una corrispondenza, la email viene firmata con la chiave
200
crittografica indicata dal secondo campo (usata come indice in
201
@/etc/opendkim/key_table@). La corrispondenza deve essere esatta, ma viene
202
cercata prima sul mittente completo, e poi sul dominio (e poi per il mittente
203
su eventuali sottodomini).
204
205
Di default, a meno di non aver abilitato firme multiple, l'esame del file si
206
ferma alla prima corrispondenza. Nel nostro caso si è usato:
207
208
<pre>
209
truelite.it    mail._domainkey.truelite.it
210
truelite.eu    mail._domainkey.truelite.eu
211
</pre>
212
213
Se serve una corripondenza più complessa si può indicare nella
214
configurazione di @opendkim.conf@ il file come:
215
216
<pre>
217
SigningTable refile:/etc/opendkim/signing_table
218
</pre>
219
220
ed in tal caso la chiave viene usata come pattern in cui si può usare un "*"
221
come carattere jolly.
222
223
Una volta configurati i vari domini, le relative chiavi, e le modalità del
224
relativo uso nella firma, si potrà avviare il servizio. Nel nostro caso si è
225
preferito per semplicità, farlo ascoltare su un socket su localhost, questo si
226
fa scommentando la seguente riga in @/etc/default/opendkim@:
227
228
<pre>
229
SOCKET="inet:12345@localhost" # listen on loopback on port 12345
230
</pre>
231
232
è possibile anche usare un socket locale, che però andrà creato nel chroot di
233
postfix (ad esempio in @/var/spool/postfix/private/opendkim@) e con permessi
234
adeguati a far si che postfix possa operarvi. Si ricordi di riavviare il
235
servizio con:
236
237
<pre>
238
service opendkim restart
239
</pre>
240
241
Per poter usare il servizio di OpenDKIM da postfix occorre configurarne l'uso
242
come milter, aggiungendo a @/etc/postfix/main.cf@ le seguenti righe:
243
244
<pre>
245
# DKIM/DMARK addition
246
milter_protocol = 6
247
milter_default_action = accept
248
smtpd_milters = inet:localhost:12345
249
non_smtpd_milters = inet:localhost:12345
250
</pre>
251
        
252
e conviene inoltre modificare la configurazione di amavis-new in
253
@/etc/postfix/master.cf@ aggiungendo:
254
255
<pre>
256
127.0.0.1:10025 inet n  -       y       -       -  smtpd
257
    -o content_filter=
258
    ...
259
    -o smtpd_hard_error_limit=1000
260
    -o smtpd_milters=
261
</pre>
262
263
per evitare di fagli eseguire due volte il filtro.
264
265
266
A questo punto si potrà riavviare postfix e verificare, inviando una email,
267
che questa sia correttamente firmata, riportando negli header qualcosa del
268
tipo:
269
A questo punto si potrà riavviare postfix e verificare, inviando una email,
270
che questa sia correttamente firmata, riportando negli header qualcosa del
271
tipo:
272
273
<pre>
274
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=truelite.it; s=mail;
275
        t=1449592614; bh=73owTq/o58W9zoPsclFWibqVtDP8ZlpL+oASguLeSqM=;
276
        h=To:From:Subject:Date:From;
277
        b=QwEiNmvmmTGuwI+0j5Z9Too4jnAwswQ2orR1mcOoRGapCP3Tc8FSftzJm9Y0i4HR+
278
         DpQJJXfEHPuB20hohsMm1ttMyoyokqPxoAMSuC/pnzkITjgn+/RZH1nqpeRKwvnTKC
279
         OBQOewHKiH5DnPyEIIqv3ATKn9CTb04DlFCpwHfXe97xLZm0n69DS9YFSJtVxtMCEa
280
         5S67bV8kELwuOGqXK7GJ3KvWdMmYcEmubdgIOOnrbjn61lMztXLdifatDMKw1YZblp
281
         b5WRAhHHYe222lCimLE6CS2RF6+82jeqqgUHrq3WLNRYlvhc7qG/MlqVqZC1qzxMmy
282
         32uYD888clI4A==
283
</pre>
284
285
Il passo finale per completare la configurazione di DKIM è impostare il DNS
286
per pubblicare la propria chiave. Il record da inserire nel proprio dominio è
287
direttamente disponibile nel file @mail.txt@, ma inserire direttamente il
288
contenuto di questo file in un file di zona darà luogo ad errore in quanto la
289
stringa di testo che indica la chiave è più lunga (per chiavi di 2048 bit come
290
quella utilizzata) del massimo di 256 caratteri supportati da bind, questo si
291
può risolvere spezzando la stringa, pertanto si dovrà inserire nel file di
292
zona qualcosa del tipo:
293
294
<pre>
295
mail._domainkey IN TXT  ( 
296
    "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2MfnM"
297
    "zbBCutJTkkZQe+5kAZlls5MZzsSzRVMtOn/FS6fS14wB0+Qn+SIXbewZxcg/37+iJ/"
298
    "qiOe5Xf7GF4IzvVSlXKswLVtiLdZU//0Dkq5YByL9pEQwtgsEJOnV+cHUEyjDRfoFk"
299
    "Qp0GdZXw/V42Pa7RzIAGFlJAPRAwCrEOYcMCPvu243PLjUhjV8Dl79EEipaZKLAAdyK"
300
    "2XsyDOGTTuBHiQ5Y06IV7BTi9cS76limReZcAGUBds/cwRvzZNhnq8V+sEEe05p0TrD"
301
    "0HcPwDCLT7M6tvb8q+1KDqBQzZF5xtILOPiEYFUEaBuBSkh2BNTQaa8UnlYnXUjJ5Ed"
302
    "Q5AQIDAQAB" )
303
</pre>
304
305
per verificare la firma si installi:
306
307
<pre>
308
apt-get install python-dkim
309
</pre>
310
311
e poi si potrà effettuare la verifica con:
312
313
<pre>
314
dkimverify < /path/to/email/message
315
</pre>
316
317
Come passo ulteriore si può installare OpenDMARC per abilitare la verifica di
318
DMARC su postfix, ma serve solo per la ricezione, per cui se non si intende
319
usarlo, si può saltare questa parte. Per Wheezy il pacchetto è disponibile
320
nei backports, e si installa con:
321
322
<pre>
323
apt-get install -t wheezy-backports install opendmarc
324
</pre>
325
326
per la configurazione si aggiunga a @/etc/opendmark.conf@ le seguenti righe:
327
328
<pre>
329
##
330
## Added values
331
##
332
AuthservID HOSTNAME
333
TrustedAuthservIDs HOSTNAME
334
#TrustedAuthservIDs jojo.truelite.it holland.truelite.it
335
IgnoreHosts /etc/opendmarc/ignore.hosts
336
HistoryFile /var/run/opendmarc/opendmarc.dat
337
# for test
338
SoftwareHeader true
339
</pre>
340
341
nel file @/etc/opendmarc/ignore.hosts@ va messo l'elenco delle
342
macchine per le quali non si vuole effettuare il controllo della posta
343
ricevuta con DMARC. Questo vale per il server stesso (ed infatti in
344
genere vi si mette il @localhost@) ma anche per le reti locali del
345
@mynetworks@ di Postfix, che in genere non vengono elencate nei record
346
di SPF. In questo modo si evita che il server, pur spedendo
347
correttamente verso l'esterno, classifiche le email provenienti dai
348
suddetti indirizzi come @fail@ per DMARC quando le controlla. Un
349
esempio del file è il seguente:
350
351
<pre>
352
# localhost
353
127.0.0.1
354
holland.truelite.it
355
192.168.2.0/24
356
192.168.1.0/24
357
358
# other hosts
359
jojo.truelite.it
360
</pre>
361
362
Invece in @/var/run/opendmarc/opendmarc.dat@ verranno salvati i dati
363
dei controlli eventualmente usabili per inviare i rapporti ai mittenti
364
(non ancora configurati). 
365
366
Le configurazioni di @AuthservID@ e @TrustedAuthservIDs@ con @HOSTNAME@ sono
367
necessarie perché il programma possa generare un header con i risultati
368
dell'autenticazione di DMARC. Invece @SPFSelfValidate@ dovrebe richiedergli di
369
controllare il risultato di SPF se non lo trova negli header. 
370
371
Per poter usare il servizio occorrerà attivare l'uso di un socket inserendo in
372
@/etc/default/opendmark@ la riga:
373
374
<pre>
375
SOCKET="inet:54321@localhost" # listen on loopback on port 12345
376
</pre>
377
378
e modificare la configurazione di postfix in @/etc/postfix/main.cf@ in:
379
380
<pre>
381
# DKIM/DMARK addition
382
milter_protocol = 6
383
milter_default_action = accept
384
smtpd_milters = inet:localhost:12345,inet:localhost:54321
385
non_smtpd_milters = ${smtpd_milters}
386
</pre>
387
388
ricordandosi di riavviare i servizi:
389
390
<pre>
391
service opendmarc restart
392
service postfix restart
393
</pre>