proseguiamo con l' installazione di rspamd
per usare rspamd dobbiamo installare redis che viene utilizzato come supporto di memorizzazione e cache
apt install redis-server
quindi aggiungiamo i repository di rspamd
Rspamd serve a contrastare lo spam e aumentare lo score delle nostre mail ,con rspamd gestiremo sia le chiavi DKIM (che certificano l origine certa della mail) che i record DMARC del DNS .
per ubuntu:
wget -O- https://rspamd.com/apt-stable/gpg.key | sudo apt-key add -
echo "deb http://rspamd.com/apt-stable/ $(lsb_release -cs) main" | sudo tee -a /etc/apt/sources.list.d/rspamd.list
per debian 10:
wget -O- https://rspamd.com/apt-stable/gpg.key | apt-key add -
echo "deb http://rspamd.com/apt-stable/ buster main" | sudo tee -a /etc/apt/sources.list.d/rspamd.list
dopodiche possiamo verificare che sia stata installata la chiave con :
apt-key list
ci deve rispondere con verie righe tra cui :
pub rsa4096 2015-07-28 [SC]
3FA3 47D5 E599 BE45 95CA 2576 FFA2 32ED BF21 E25E
uid [ unknown] Rspamd Nightly Builds (Rspamd Nightly Builds) <Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo.;
sub rsa4096 2015-07-28 [E]
possiamo ora procedere con :
apt update
apt install rspamd
rspamd utilizza un metodo di configurazione a piu' file
abbiamo , in /etc/rspamd
i file di configurazione che vengono portati dal pacchetto che installiamo, le nostre configurazioni andranno fatte in
/etc/rspamd/local.d
/etc/rspamd/override (dir che non e' creata in automatico su debian)
in pratica, le conf fatte in local.d sofrascrivono i valori di default , e le conf in override sovrascrivono i valori di default e di local.d
un esempio abbastanza chiaro è disponibile qui : https://rspamd.com/doc/faq.html#what-are-the-locald-and-overrided-directories
l' effetto delle nostre configurazioni puo' esser analizzato col comando
rspamadm configdump
rspamadm configdump worker
che ci fa vedere tutta la conf, oppure solo la conf dei worker
inziiamo quindi a modificare/creare il file
/etc/rspamd/local.d/
worker-normal.inc
ove
indicheremo l' ip e la porta su cui il servizio deve rimanere in ascolto, la porta di default è la 11333:
bind_socket = "127.0.0.1:11333";
Configurare il proxy tra Postfix e Rspamd, mettendolo in ascolto sulla porta 11332
creiamo il file /etc/rspamd/local.d/worker-proxy.inc
bind_socket = "127.0.0.1:11332";
configurare una password per il worker. La password va generata col seguente comando :
rspamadm pw --encrypt -p your_secret_password
ricordarsi di settare la propria password
si avra un output del tipo :
rspamadm pw --encrypt -p your_secret_password
$2$93qin9nkifzjpr7taqhs9guua888tnny$dnys6um6xm1gb1amgnz9hocuz7grxuk5z9yjw87psrk6yu641oiy
scriviamo la password nel file /etc/rspamd/local.d/worker-controller.inc
usando il risultato criptato di rspamadm:
password = "$2$93qin9nkifzjpr7taqhs9guua888tnny$dnys6um6xm1gb1amgnz9hocuz7grxuk5z9yjw87psrk6yu641oiy";
configurariamo rspamd per lavorare con redis , creiamo il file
/etc/rspamd/local.d/classifier-bayes.conf
servers = "127.0.0.1";
backend = "redis";
creiamo il file per l' header "milter"
/etc/rspamd/local.d/milter_headers.conf
:
use = ["x-spamd-bar", "x-spam-level", "authentication-results"];
a questo punto possiamo riavviare il servizio rspamd e verificare che sia attivo
service rspamd restart
service rspamd status
aggiungiamo un proxy alla configurazione di uno dei siti che abbiamo fatto su Nginx (ad esempio: /etc/nginx/sites-enabled/mail.example.com.conf
)
un proxy web è un componente che prende le richieste dalla porta 80 o 443 o quella che è configurata e le gira ad un entita esperna al server web , in questo caso le passa ad un server web in ascolto sull' interfaccia localhost / 127.0.0.1 porta 11334 , e di ritrorno gira le risposte al client esterno
...
location /rspamd {
proxy_pass http://127.0.0.1:11334/;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
...
riavviamo Nginx:
service nginx restart
ora possiamo accedere all' interfaccia web di Rspamd all' indirizzo: http://your_servers_ip/rspamd/
per autenticarsi utilizzare la password che si è configurato primacol comando rspamadm pw
.
notare lo / finale, se lo saltiamo otterremo una pagina senza css .....
a questo punto passiamo alla configurazione di Postfix con rspamd , aggiungiamo alla conf di postfixcol comando postconf
:
postconf -e "milter_protocol = 6"
postconf -e "milter_mail_macros = i {mail_addr} {client_addr} {client_name} {auth_authen}"
postconf -e "milter_default_action = accept"
postconf -e "smtpd_milters = inet:127.0.0.1:11332"
postconf -e "non_smtpd_milters = inet:127.0.0.1:11332"
riavviamo postfix per rendere effettive le modifiche
service postfix restart
quindi passiamo alla configurazione di dovecot
Dovecot è gia installato sul sistema, dobbiamo aggiungere la configurazione del modulo "filtro sieve" e l' integrazione con Rspamd.
apt install dovecot-sieve dovecot-managesieved
modifichiamo il file /etc/dovecot/conf.d/20-lmtp.conf
aggiungendo l' indirizzo nostro di postmaster (non lasciate example.com!!!!) e la riga sul plugin:
...
protocol lmtp {
postmaster_address = Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo.
mail_plugins = $mail_plugins sieve
}
...
modifichiamo il file /etc/dovecot/conf.d/20-imap.conf
:
...
protocol imap {
...
mail_plugins = $mail_plugins imap_quota imap_sieve
...
}
...
Editiamo il file /etc/dovecot/conf.d/20-managesieve.conf
:
...
service managesieve-login {
inet_listener sieve {
port = 4190
}
}
...
service managesieve {
process_limit = 1024
}
...
ora il file /etc/dovecot/conf.d/90-sieve.conf
:
plugin {
...
# sieve = file:~/sieve;active=~/.dovecot.sieve
sieve_plugins = sieve_imapsieve sieve_extprograms
sieve_before = /var/vmail/mail/sieve/global/spam-global.sieve
sieve = file:/var/vmail/mail/sieve/%d/%n/scripts;active=/var/vmail/mail/sieve/%d/%n/active-script.sieve
imapsieve_mailbox1_name = Spam
imapsieve_mailbox1_causes = COPY
imapsieve_mailbox1_before = file:/var/vmail/mail/sieve/global/report-spam.sieve
imapsieve_mailbox2_name = *
imapsieve_mailbox2_from = Spam
imapsieve_mailbox2_causes = COPY
imapsieve_mailbox2_before = file:/var/vmail/mail/sieve/global/report-ham.sieve
sieve_pipe_bin_dir = /usr/bin
sieve_global_extensions = +vnd.dovecot.pipe
....
}
creiamo una directory per gli script di sieve:
mkdir -p /var/vmail/mail/sieve/global
creiamo un filtro globale per sieve nel file /var/vmail/mail/sieve/global/spam-global.sieve
serve a spostare le email contrassegnate come spam nella cartella span:
require ["fileinto","mailbox"];
if anyof(
header :contains ["X-Spam-Flag"] "YES",
header :contains ["X-Spam"] "Yes",
header :contains ["Subject"] "*** SPAM ***"
)
{
fileinto :create "Spam";
stop;
}
nome file errato - riproposto sotto , manca qualche cosa???
creiamo lo script /var/vmail/mail/sieve/global/report-spam.sieve
nella guida originale il nome file era sbagliato , e cercando in giro col nomefile corretto ho trovato due risutlati che sembrano suggerire un comportamento simile a report-ham , quindi lascio lo stesso contenuto, se qualcuno vuole spiegarmi di piu' le spiegazioni sono ben accette:
require ["vnd.dovecot.pipe", "copy", "imapsieve"];
pipe :copy "rspamc" ["learn_spam"];
creiamo lo script /var/vmail/mail/sieve/global/report-ham.sieve
che sarà richiamato ogni volta che spostiamo una mail manualmente nella cartella spam
require ["vnd.dovecot.pipe", "copy", "imapsieve"];
pipe :copy "rspamc" ["learn_ham"];
compiliamo gli script di sievee configuriamo i giusti permessi:
sievec /var/vmail/mail/sieve/global/spam-global.sieve
sievec /var/vmail/mail/sieve/global/report-spam.sieve
sievec /var/vmail/mail/sieve/global/report-ham.sieve
sudo chown -R vmail: /var/vmail/mail/sieve/
e stica , non funziona !!!!
report-spam: line 1: error: require command: unknown Sieve capability `vnd.dovecot.pipe'. report-spam: line 1: error: require command: unknown Sieve capability `imapsieve'. report-spam: line 2: error: unknown command 'pipe' (only reported once at first occurrence). report-spam: error: validation failed. sievec(root): Fatal: failed to compile sieve script '/var/vmail/mail/sieve/global/report-spam.sieve' report-ham: line 1: error: require command: unknown Sieve capability `vnd.dovecot.pipe'. report-ham: line 1: error: require command: unknown Sieve capability `imapsieve'. report-ham: line 2: error: unknown command 'pipe' (only reported once at first occurrence). report-ham: error: validation failed. sievec(root): Fatal: failed to compile sieve script '/var/vmail/mail/sieve/global/report-ham.sieve'
penso che un punto di partenza possa essere ...
https://wiki2.dovecot.org/HowTo/AntispamWithSieve
dopo qualche giorno , gia me ne ero scordato, dando il comando
dovecot -n
vedo questo output , vado ad editare il file
# Pigeonhole version 0.5.4 () doveconf: Fatal: Error in configuration file /etc/dovecot/conf.d/20-managesieve.conf line 31: Unknown setting: service { service { service doveconf: Error: managesieve-login: dump-capability process returned 89 doveconf: Fatal: Error in configuration file /etc/dovecot/conf.d/20-managesieve.conf line 31: Unknown setting: service { service { service
e ho trovato che mi ero scordato a chiudere una graffa ... ora dovecot -n non si lamenta piu' e la compilazione dei filtri sieve funziona ...
in pratica il comando ci fa vedere tutta la configurazione di dovecot in modo che possiamo capire se stiamo editando i file di configurazione in modo corretto e se stiamo editando il file giusto .... (da vari siti che ho visto puntano a file di configurazioni diversi)
dopo tutto questo sbatti ... guardo i log di rspamd in /var/log/rspamd/rspamd.log
e me li ritrovo pieni di
monitored; rspamd_monitored_dns_cb: DNS query blocked on multi.uribl.com (127.0.0.1 returned), possibly due to high volume
in pratica http://uribl.com/refused.shtml ci spiega che il servizio è libero per piccole interrogazioni , controllano quante richieste arrivano da un dato dns e se superano il limite la risposta è picche ...
host -tTXT 2.0.0.127.multi.uribl.com 2.0.0.127.multi.uribl.com descriptive text "127.0.0.1 -> Query Refused. See http://uribl.com/refused.shtml for more information [Your DNS IP: xxx.xxx.xx.xx]"
allo stato attuale mi sembra di capire che le soluzioni siano 3
- pagare
- uso un dns server che non ha fatto molte richieste
- mi faccio il mio dns server ....
ma mi serve davvero per quello che devo fare???
Creazione delle chiavi DKIM
DomainKeys Identified Mail (DKIM) è un metodo di autenticazione della mail ideato per riconoscere le mail di sppofing , serve a verificare che l' origine della mail sia chi dice di essere, e lo si fa aggiungendo una firma digitale agli haeder della mail , la verifica di questa firma da parte di chi riceve la mail usando la chiave pubblicha pubblicata sul record dns consente di validare il mittente
in praticail server di posta ricevente riceve la mail , legge la firma, legge la chiave pubblica sul record dns, fa una verifica, è positiva? la mail arriva dal server corretto , se la mail arrivasse da un server che impersona il mio server mail ma non lo è non avrebbe la possibilita di superare il controllo della firma non avendo la chiave privata
siccome potremmo avere piu' server mail sul nostro dominio, nel processo va identificato un dkim key selector , ossia un sellettore della chiave, in modo da porte avere nei record dns piu' chiavi, indicate dai selettori e ogni server utilizzare la giusta chiave
iniziamo col creare la directory dove conservare i file delle chiavi e generiamo le chiavi tramite il comando rspamadm
.
nel seguente esempio utilizziamo il nome mail
come selettore DKIM . generiamo cosi una coppia di chiavi pubblica/privata) che puo' esser utilizzata per tutti idomini che gestirà il nostro server di posta.
mkdir /var/lib/rspamd/dkim/
rspamadm dkim_keygen -b 2048 -s mail -k /var/lib/rspamd/dkim/mail_selector.key > /var/lib/rspamd/dkim/mail_selector.pub
nella directory troveremo quindi i due file:
mail_selector.key
- il file della chiave privatamail
- il file della chiave pubblica_selector
.pub
creiamo un nuovo file /etc/rspamd/local.d/dkim_signing.conf
per istruire Rspamd su dove guardare per trovare la chiave DKIM e il nome del selettore .
l'a terza riga abilita la firma DKIM per gli indirizzi alias
l ultima riga gli stiamo dicendo di mantenere il subdominio se c'e' e di non levarlo (questo lo spiego nella sezione relativa ai test):
selector = "mail_selector";
path = "/var/lib/rspamd/dkim/$selector.key";
allow_username_mismatch = true;
use_esld = False;
Rspamd supporta anche la firma ARC ,usiamo lo stesso file di configurazione copiandolo
cp /etc/rspamd/local.d/dkim_signing.conf /etc/rspamd/local.d/arc.conf
riavviamo Rspamd:
service rspamd restart
DNS settings
ora siamo quasi pronti, e dobbiamo aggiungere un record TXT al nostro pannello DNS che indichi quale firma e selettore utilizza il nostro server , aggiungiamo quindi al chiave pubblica che si trova in .
cat /var/lib/rspamd/dkim/mail.pub
conterra una cose del tipo:
mail_selector._domainkey IN TXT ( "v=DKIM1; k=rsa; "
"p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxzllrHkbUwSR24B6iG+TgNTOU43lZhTPJemo8PKXkgaVppGJ57tlWOe9U321Qk+Ksk9qoukR4f39TCMQdAgtEPFpWSBWJJE9C2SmNz38SmhTC0AkvIzBxCdatitK2aWjHq4s9bsoQ1gIQlXKM+V7GbN2LFCBfvAU7ElBQk+QG2DuxGD/XNDLQWloYEWcqkUfxlHr0znoY86jkglVZ"
"nhi/cAoE0SbzjphCtibT9T1w6AztxV1yK2VTJPpBFdtAsP1Sa3GDbTn0HATHUJI8eOIXtFcIBbYisiOIWjisE3TXFpvkS69Q0gvxVFYDnftLvsf5AticeygdMOVbK1o3T4Z7QIDAQAB"
) ;
va aggiunta al nostro pannello dns come recorrd TXT
non so se sia per tutti, ma nel mio pannello dns ho creato un record TXT
mail_selector_domainkey
e come valore ho messo
"v=DKIM1; k=rsa; p=MIIB_stringa_molto_lunga_254_byte_jkglVZnhi/cAaltra_stringa_lungaQAB"
con una sola apertura e chiusura di virgollette, e tutta la stringa lunga p= per intero senza spezzarla su due righe
aggiunta:
uno dei client connessi (telecamera dahua) mi mandava le mail in spam in quanto a differenza delle altre macava un parametro (MISSING MID) e avevo nei log questo errore:
(default: T (add header): [6.00/15.00] [MISSING_MID(2.50){},SUBJ_EXCESS_BASE64(1.50){},CTYPE_MIXED_BOGUS(1.00){},MIME_BASE64_TEXT_BOGUS(1.00){},
MIME_BASE64_TEXT(0.10){},MIME_GOOD(-0.10){multipart/mixed;text/plain;},ARC_NA(0.00){},DKIM_SIGNED(0.00)
non potendo agire sulla telecamera dovevo agire sul server , cercando info va aggiunto la configurazione per multimap , ossia dei filtri che vengono valutati per variare il comportamento
ora posso scegliere se modificare il comportamento per indirizzo mittente, indirizzo destinatario , o per ip mittente, sono riuscito a far funzionare entrambi
in pratica va creato il file
/etc/rspamd/local.d/multimap.conf
SENDER_FROM_WHITELIST { type="from"; map="file:///etc/rspamd/maps.d/address_whitelist.inc"; description = "Local from whitelist"; score = -2.5; } #IP_WHITELIST { # type = "ip"; # map = "file:///etc/rspamd/maps.d/ip_whitelist.map"; # action = "accept"; #}
va riavviato rspamd dopo aver creato/modificato questo file
la prima sezione analizza per mittente ("from") riscontrando il mittente rispetto all' elenco contenuto in /etc/rspamd/maps.d/address_whitelist.inc e abbassando il punteggio di spam di 2.5 punti , in pratica otteniamo:
(default: F (no action): [3.50/15.00] [MISSING_MID(2.50){}, SENDER_FROM_WHITELIST(-2.50){telecamera @ miodominio.it;}, SUBJ_EXCESS_BASE64(1.50){},CTYPE_MIXED_BOGUS(1.00){}, MIME_BASE64_TEXT_BOGUS(1.00){},MIME_BASE64_TEXT(0.10){}, MIME_GOOD(-0.10){multipart/mixed;text/plain;},ARC_NA(0.00){}, DKIM_SIGNED(0.00)
ora con un punteggio di 3.5 non è più considerato spam
il formato del file ip_whitelist.map è (una entry per riga)
telecamera @ miodominio.it telecamera2 @ miodominio.it telecamera3 @ miodominio.it telecamera4 @ miodominio.it
la seconda sezione che vedete sopra commentata, invece agisce in base all' indirizzo ip del mittente e fa saltare tutti i controlli successivi
(default: F (no action): [0.00/15.00] [IP_WHITELIST(0.00){192.168.1.7;}])
anche qui il formato del file ip_whitelist.map è (una entry per riga)
192.168.1.7 192.168.1.8 192.168.1.9
se vogliamo verificare che sia stata recepita la configurazione
rspamadm configdump |less se vogliamo cercare a mano dentro l' intera configurazione
oppure
rspamadm configdump multimap per vedere la sola sezione multimap
multimap { freemail_envfrom { type = "from"; description = "Envelope From is a Freemail address"; score = 0; symbol = "FREEMAIL_ENVFROM"; map = "https://maps.rspamd.com/freemail/free.txt.zst"; filter = "email:domain"; } SENDER_FROM_WHITELIST { score = -2.500000; map = "file:///etc/rspamd/maps.d/address_whitelist.inc"; type = "from"; description = "Local from whitelist"; } freemail_replyto {
se vogliamo debuggurre il comportamento di map , possiamo editare il file
nano /etc/rspamd/logging.inc
debug_modules = [map]
ottentendo in /var/log/rspamd/rspamd.log:
(main) <xyoi7b>; map; rspamd_parse_kv_list: insert key only pair: telecamera @ miodominio.it -> ; line: 0 (controller) <b7hbnu>; map; rspamd_parse_kv_list: insert key only pair: 192.168.1.7 -> 1; line: 0
step precedenti:
postfixadmin, let's encrypt e nginx
step successivi :