Home giubbe.org


×

Attenzione!

Le parole scritte in rosso devono essere sostituite dai vostri parametri.

×

Beta!

Sto lavorando al sito e commetterò tanti errori: potete segnalarmeli all'indirizzo indicato in fondo pagina. Segnalatemi anche eventuali vostre richieste. Grazie. !!!



Postfix.



Postfix è il cuore del mail server. Rende operativo il protocollo SMTP (Simple Mail Transfer Protocol), come descritto nel RFC 821 del 1982: trasferire la posta elettronica in modo affidabile ed efficiente.

Inizieremo con un normale aggiornamento del sistema:
sudo apt update && sudo apt upgrade
multi


Adesso possiamo installare Postfix ed anche la sua interfaccia al database mysql (MariaDB):
sudo apt install -y postfix postfix-mysql
multi

Parte automaticamente la configurazione di Postfix.

Ci verrà chiesto che preferiamo.

La configurazione che a noi si addice è Internet Site.

multi


Nella schermata seguente, ci chiede di indicare il nome di dominio: sarà quello che andrà dopo il nome utente, utente @ dominio.tld

multi


Leggiamo la configurazione iniziale di Postfix, main.cf :
cat /etc/postfix/main.cf

multi

Contiene le impostazioni generali di default.


La creazione iniziale del file master.cf definisce i servizi offerti da Postfix, come la ricezione delle mail via SMTP, la spedizione delle mail.
Usa le impostazioni generali di main.cf, ma può anche sovrascriverle.
cat /etc/postfix/master.cf

multi

multi



Per cambiare, sostituire, vedere o aggiungere funzionalità a Postfix nel file main.cf, possiamo scrivere queste modifiche nel file stesso, oppure usare una sua applicazione: postconf.

Tutte le direttive potenzialmente modificabili con postconf, sono elencate con:
sudo postconf -d | less
Tasto Spazio per avanzare di una pagina, tasto B per arretrare di una pagina

multi

Elenca tutta la configurazione con tutte le sue funzioni e valori.


Usiamo postconf per definire di non volere usare ipV6 (come per Apache).

Vediamo com'è attualmente impostata questa scelta in main.cf:
sudo postconf inet_protocols

multi

Postconf legge la relativa riga in main.cf e restituisce il risultato: tutti, cioè ipV4 e ipV6.

Per modificare ciò, usiamo l'opzione -e (edit, modifica) ed utilizziamo le doppie virgolette per proteggere la formattazione dell'enunciato.
sudo postconf -e "inet_protocols = ipv4"

multi


Controlliamo l'avvenuto cambio, aprendo direttamente il file main.cf:
sudo nano /etc/postfix/main.cf

multi

Postconf ha anche la particolarità di rendere attive immediatamente le modifiche, senza dover riavviare Postfix.

Continuiamo con il cambiare i parametri TLS. indicando dove cercare i relativi file.

Modifichiamo le prime due righe:
smtpd_tls_cert_file=/etc/letsencrypt/live/mail.sitoprovaprimo.it/fullchain.pem
smtpd_tls_key_file=/etc/letsencrypt/live/mail.sitoprovaprimo.it/privkey.pem
Lasciamo la riga seguente tls_security_level=may ed aggiungiamo altre 2 righe:
smtpd_tls_auth_only=yes
smtpd_tls_loglevel = 1
Con la prima riga, obblighiamo chiunque ad autenticarsi con TLS.
Questa scelta non è sempre condivisa, perchè alcuni Server pubblici ancora non usano TLS.
Ma sono una rarità e pure pericolosa; ed è per questo che consigliamo una autenticazione esclusivamente cifrata.
Nella seconda riga, impostiamo di registrare solo un messaggio sommario dell'handshake TLS .

Adesso, modifichiamo l'intera sessione riguardante le mail in uscita smtp_tls_CApath, sia le 3 righe smtpd, sia le 3 smtp.
smtp_tls_security_level = may
smtp_tls_loglevel = 1
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
Nella prima riga, impostiamo che il livello di sicurezza TLS non è obbligatorio, cioè, nella procedura SMTP avremo lo stesso l'opzione STARTTLS, ma la sua scelta non sarà doverosa.
La seconda riga si riferisce sempre ai log di eventi importanti.
La terza riguarda una specie di database, : viene usato per la cache della sessione TLS e sarà posto in /var/spool/postfix/smtpd_scache.

Le altre 3 righe sono da sostituire con 4 nuove righe:
smtpd_tls_mandatory_protocols = >=TLSv1.2, <=TLSv1.3
smtpd_tls_protocols = >=TLSv1.2, <=TLSv1.3
smtp_tls_mandatory_protocols = >=TLSv1.2, <=TLSv1.3
smtp_tls_protocols = >=TLSv1.2, <=TLSv1.3
Stiamo dicendo a Postfix di usare, durante le fasi smtpd e smtp, i protocolli maggiori o uguali (>=) a TLSv1.2 e minori o uguali (<=) a TLSv1.3, cioè di usare soltanto TLSv1.2 oppure TLSv1.3, i quali garantiscono più sicurezza.

Adesso, dovremo istruire Postfix su come procedere con le autenticazioni:
smtpd_sasl_type=dovecot
smtpd_sasl_path=private/auth
smtpd_sasl_auth_enable=yes
La prima riga dice che useremo il metodo di autenticazione di Dovecot .
La seconda riga risolve un "problema" di Postfix.
Postfix agisce solo all'interno della sua "gabbia" (/var/spool/postfix/) e non ha contatti con altre applicazioni.
Per ovviare al problema, Dovecot crea un canale di comunicazione (un Gate tra l'esterno e Postfix, dove dare un appuntamento per un incontro) in /var/spool/postfix/private/auth per permettere a Postfix di usare l'autenticazione degli utenti creata da Dovecot, usando i dati presi dal database implementato nella pagina precedente.
Il terzo rigo abilita l'autenticazione sicura.


Le altre impostazioni declinate durante la configurazione sono:

smtp_relay_restrictions: possono inviare mail quelli della nostra rete interna e quelli autenticati; gli altri non possono e Postfix rinvia le mail che subiscono errori 4XX, cioè temporanei;

myhostname è il nostro domino FQDN, mail.sitoprovaprimo.it
si potrebbe esplicitare anche mydomain: sitoprovaprimo.it

alias_maps e alias_database servono quando vogliamo creare un alias ad un utente del sistema, ma noi useremo il database creato con MariaDB.

myorigin, posto nel file /etc/mailname, è sitoprovaprimo.it

mydestination elenca la lista dei domini per cui Postfix gestisce la posta.

Modifichiamo lo scritto perchè useremo i domini elencati in mariaDB:
mydestination = $myhostname, localhost.$mydomain, localhost
Altra riga interessante è mailbox_size_limit ove possiamo indicare la capacità massima in bytes della cartella di posta dell'utente.
Noi useremo le quote, per diversificare da utente a utente.
Comunque, è settata a 0, il che equivale ad infinito, finchè il disco non è saturo.

inet_interfaces sono le interfacce di rete da cui Postfix viene contattato.

inet_protocols l'abbiamo cambiato.

Aggiungiamo una riga per impostare la capacità massima in bytes di ogni messaggio.
Se superiamo questa soglia, la mail non sarà accettata da Postfix.

La impostiamo a (35*1024*1024=36700160), ma potete impostarla a vostro piacimento. Di default è 10MB.
message_size_limit = 36700160
Troveremo anche una impostazione simile, quando affronteremo le quote, e potremo indicare che la quota massima per un messaggio è tot bytes.


L'impostazione di main.cf finora dovrebbe assomigliare a questa immagine.

multi


Aggiungeremo tutta un'altra serie di enunciati in main.cf per conformarlo ai nostri bisogni.
Questi enunciati verranno posti dalla fine dell'attuale main.cf .

Innazitutto, diremo a Postfix come consegnare le mail al sistema interno
Dovrà consegnare le mail a Dovecot affinchè questi ponga le mail nelle giuste caselle.
Dovecot lo farà con un suo protocolo, molto simile a smtp

Il canale di comunicazione tra i due sarà posto in /var/spool/postfix/private/dovecot-lmtp.
Lo esplicitiamo con:
mailbox_transport = lmtp:unix:private/dovecot-lmtp
Aggiungiamo un'altra riga, perchè Dovecot non accetta la codifica dei caratteri in UTF-8 :
smtputf8_enable = no

Adesso, regoleremo i rapporti tra Postfix ed il database creato.

Indichiamo a Postfix qual'è il file che regola i domini virtuali:
virtual_mailbox_domains = proxy:mysql:/etc/postfix/sql/domini_virtuali.cf

La seconda riga indicherà dove cercare le impostazioni delle caselle virtuali:
virtual_mailbox_maps = proxy:mysql:/etc/postfix/sql/caselle_virtuali.cf

Nella terza riga, indicheremo a Postfix dove sono poste le regole per gli alias virtuali:
virtual_alias_maps = proxy:mysql:/etc/postfix/sql/alias_virtuali.cf

L'ultima parte aggiunta, dovrebbe rassomigliare a questo:

multi

Usciamo temporaneamente da main.cf, salvando comunque il lavoro svolto, per creare i 3 file menzionati sopra.


Creiamo una cartella, dove porre tutti i file necessari al rapporto Postfix-MariaDB
sudo mkdir /etc/postfix/sql/

multi


Creiamo il primo file, domini_virtuali :
sudo nano /etc/postfix/sql/domini_virtuali.cf
multi


In esso, indichiamo a Postfix come connettersi al database e cosa chiedere per conoscere i domini da gestire:
user = gestoreposta
password = g€$t0r€p0$t@
hosts = localhost
dbname = serverdiposta
query = SELECT domain FROM domain WHERE domain='%s'

multi

User, password e dbname sono facilmente intuibili.
Hosts è la macchina che ospita il database; essendo sulla stessa macchina, usiamo localhost.
La richiesta (query) chiede di selezionare la colonna domain dalla tavola domain e pone l'opzione %s ;
in utente@dominio.tld : %n = utente , %s = dominio.tld , %u = utente@dominio.tld

Proviamo se Postfix riuscirà a leggere il risultato:
sudo postmap -q sitoprovasecondo.it mysql:/etc/postfix/sql/domini_virtuali.cf
Restituisce il dominio enunciato, perchè presente nel DB.

Se inventiamo un dominio, non rende nulla:
sudo postmap -q sitoprovaterzo.it mysql:/etc/postfix/sql/domini_virtuali.cf
multi



Creiamo il secondo file, caselle_virtuali, nella cartella /sql:
sudo nano /etc/postfix/sql/caselle_virtuali.cf
multi

Prevediamo in esso sempre la connessione al database e la richiesta su come trovare la cartella di ogni utente:
user = gestoreposta
password = g€$t0r€p0$t@
hosts = localhost
dbname = serverdiposta
query = SELECT maildir FROM mailbox WHERE username='%s'

multi

La query, in questo caso, estrapola la collocazione della cartella virtuale dell'utente dalla tabella mailbox prendendo solo il dominio.tld dall'indirizzo utente, per confermare che quel dominio è effettivamente gestito da Postfix.

Chiediamo conferma se a Postfix viene indicata la cartella dell'utente enunciato::
sudo postmap -q giubbe@sitoprovaprimo.it mysql:/etc/postfix/sql/caselle_virtuali.cf
multi

Restituisce la cartella dell'utente indicato nella richiesta.


Creiamo il terzo ed ultimo file, alias_virtuali, nella cartella /sql:
sudo nano /etc/postfix/sql/alias_virtuali.cf
multi

Anche stavolta, inseriamo prima la connessione al database e poi la richiesta su come trovare il rapporto tra alias e destinatario/goto finale:
user = gestoreposta
password = g€$t0r€p0$t@
hosts = localhost
dbname = serverdiposta
query = SELECT goto FROM alias WHERE address='%s'

multi

Passando un alias nella richiesta, dovrebbe rendere l'indirizzo del destinatario finale, se l'alias esiste:
sudo postmap -q abuse@sitoprovaprimo.it mysql:/etc/postfix/sql/alias_virtuali.cf
multi

Risultato conforme alla richiesta.


Dato che abbiamo inserito informazioni sensibili in questi file, inseriamo l'utente di sistema Postfix nel gruppo proprietario della cartella sql creata.

sudo chgrp postfix /etc/postfix/sql/*
Rendiamo i file contenuti in essa, leggibili e scrivibili solo da Postfix e root:
sudo chmod -R 0640 /etc/postfix/sql/*
multi



Torniamo ad occuparci di main.cf
sudo nano /etc/postfix/main.cf

Per lo smistamento della posta virtuale, invece degli agenti LDA inclusi in Postfix (local e virtual), ad occuparsene sarà Dovecot.

Indichiamo questa scelta a Postfix:
virtual_transport = lmtp:unix:private/dovecot-lmtp

Gli indichiamo anche la cartella madre, all'interno della quale saranno create le cartelle per ogni singolo dominio ed utente:
virtual_mailbox_base = /var/vmail

Dobbiamo aggiungere 2 righe, in cui indichiamo a Postfix con quale utente deve operare.
Quest'utente vmail, sarà creato subito dopo usciti da main.cf ;

Intanto, lo indichiamo attraverso il suo uid ed il gid del suo gruppo:
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000

Visto che usiamo magari più domini, dobbiamo abilitare Postfix a gestire più nomi di dominio, (come fatto in Apache con i virtual-hosts), usando :
tls_server_sni_maps = hash:/etc/postfix/sni_maps
Usciamo da main.cf, chiudendo e salvando le modifiche


Dobbiamo creare un utente unico, vmail, (come www-data in Apache) per gestire la scrittura e lettura nella cartella /var/vmail/, dandogli un e un relativo per il gruppo di appartenenza:
sudo groupadd -g 5000 vmail
sudo useradd -g vmail -u 5000 vmail -d /var/vmail -m
multi


Se già non esistente, creiamo la cartella /var/vmail
sudo mkdir /var/vmail
e rendiamo l'utente vmail prorpietario di essa e di tutto il suo contenuto.
sudo chown -R vmail:vmail /var/vmail
multi



Adesso, passiamo alla creazione del file sni_maps:
sudo nano /etc/postfix/sni_maps
multi


ed inseriamo al suo interno la "mappatura" dei due siti finora creati, cioè, dove Postfix dovrà cercare i relativi certificati.
mail.sitoprovaprimo.it   /etc/letsencrypt/live/mail.sitoprovaprimo.it/privkey.pem   /etc/letsencrypt/live/mail.sitoprovaprimo.it/fullchain.pem
mail.sitoprovasecondo.it   /etc/letsencrypt/live/mail.sitoprovasecondo.it/privkey.pem   /etc/letsencrypt/live/mail.sitoprovasecondo.it/fullchain.pem
multi

Salviamo e chiudiamo.

Diciamo a Postfix di fare suo la tavola del file sni_maps:
sudo postmap -F /etc/postfix/sni_maps
multi



Passiamo alle restrizioni contro lo spam e contro gli abusi.


Questa immagine indica dove avvengono le varie restrizioni, durante la procedura SMTP.

Procedura ripetibile (finchè non indichiamo le restizioni), peraltro, se vogliamo comprendere meglio la procedura SMTP.

Chiamiamo telnet + indirizzo ip server con Postfix + porta 25, e poi seguiamo le risposte date nell'immagine.

multi



Rientriamo, un'altra volta, in main.cf :
sudo nano /etc/postfix/main.cf

Per primo, ci occupereremo della configurazione del controllo di chi è autorizzato a spedire mail a Postfix, MAIL FROM:
smtpd_sender_restrictions =
   permit_mynetworks
   permit_sasl_authenticated
   reject_non_fqdn_sender
   reject_unknown_sender_domain
   reject_unlisted_sender
   reject_unverified_sender
La prima e la seconda riga sono già state commentate altrove.

La terza riga impone di rigettare le mail ove non è indicato il FQDN.

La quarta riga avviene quando manca il record DNS A oppure il MX.

La quinta, invece, prende il caso di quando MAIL FROM non è nella lista degli utenti validi per quel dominio.

La sesta riga affronta il caso quando la destinazione non è raggiungibile


È la volta delle restrizioni che avvengono durante il comando HELO/EHLO.

smtpd_helo_required = yes
smtpd_helo_restrictions =
   permit_mynetworks
   permit_sasl_authenticated
   reject_non_fqdn_helo_hostname
   reject_invalid_helo_hostname
   reject_unknown_helo_hostname
Anche qui, la prima e la seconda riga sono state ampiamente commentate.

La terza riga indica che il messaggio è rigettato quando il comando HELO non è in FQDN.

La quarta riga impedisce alla connessione di proseguire quando il comando HELO è mal composto.

La quinta riga ferma la connessione quando, al comando HELO, l'hostname non ha un record DNS A oppure MX.


Adesso affrontiamo le restrizioni durante la connessione al comando RCPT TO :

smtpd_recipient_restrictions =
   permit_auth_destination
   permit_sasl_authenticated
   reject_non_fqdn_recipient
   reject_unknown_recipient_domain
   reject_unlisted_recipient
   reject_unverified_recipient
   reject_unauth_destination,
   permit

Le righe sono già state commentate.

La vostra seconda parte del file main.cf dovrebbe risultare come questa:

multi

Salviamo le modifiche e chiudiamo il file.


Per abilitare Postfix a ricevere la posta, dovremo abilitare la relativa predisposizione in master.cf.

In questo file, alcuni servizi iniziano con smtp ed altri con smtpd.

Smtp si riferisce a quando Postfix inoltra la posta ad un altro server.

Smtpd, invece, si riferisce a quando Postfix riceve la mail, sia da un altro mail server, sia dall'applicazione client (outlook, apple mail, thunderbird, webmail), per poi inoltrarla verso altri server.
sudo nano /etc/postfix/master.cf

multi


Modifichiamone il contenuto abilitando l'enunciato predisposto togliendo il carattere # (che sta per commento)
oppure, quando non predisposto, scrivendo nel file.

Togliamo il carattere # alla riga che inizia con submission, permettendo ai client di raggiungere Postfix alla porta 587.

Togliamo lo stesso # alla riga syslog, cosicchè nei file di log ci sia l'intestazione postfix/submission, per una più facile ricerca e comprensione.

Eliminiamo sempre # a tls_security_level, per obbligare chi si connette a Postfix ad usare una connessione protetta e cifrata, evitando la diffusione in chiaro di nome utente e password.

Eliminiamo # pure dalla successiva riga, sasl_auth_enable, per autenticarsi su Postfix.

Togliamo il commento anche a reject_unlisted_recipient.

Decommentiamo le righe con client_, helo_, sender_, relay_

Anche a recipient_restrictions togliamo il commento per permettere solo a chi è autenticato di mandare mail.

E togliamo il commento alla riga con _macro.



Chi usa , come client, Outlook, deve impostare il servizio smtps con la porta 465.

Togliamo il carattere # alla riga submissions e sostituiamo submissions con :
smtps

Eliminiamo sempre # alla riga appena sotto e modifichiamo il nome che apparirà nei file di log, per distinguerlo dal nome impostato per il servizio smtp:
postfix/smtps

Togliamo # alla riga tls_wrappermode , per settare Postfix a "bypassare" STRATTLS sulla porta "submission" 587 durante la procedura SMTP, e permettere ad Outlook di connettersi alla porta 465, comunque usando sempre TLS.

Abilitiamo, togliendo sempre #, anche la riga successiva sasl_auth_enable=yes, come per smtp.

Anche reject_unlisted va decommentato.

Possiamo decommentare anche le righe:
smtpd_client_
smtpd_helo_
smtpd_sender_
smtpd_relay.

Il risultato finale ottenuto dev'essere come la seguente immagine.

multi

Salviamo ed usciamo dal file (tasti Ctrl+X, Y, Invio)


Riavviamo Postfix ed accertiamoci che tutto funzioni:

sudo systemctl restart postfix
systemctl status postfix
multi



Le principali impostazioni di Postfix sono attuate.

Passiamo al suo "scudiero" : Dovecot.