#format wiki
#LANGUAGE it
<<BR>>
<<Include(NuoviStrumentiWiki/PaginaDiProva)>>
<<Indice>>
<<Informazioni(forum="http://forum.ubuntu-it.org/viewtopic.php?f=46&t=584194"; rilasci="24.04 22.04")>>

= Introduzione =

Questa guida illustra come installare e configurare un server mail completo. Fornire una base solida per la gestione della posta elettronica, includendo la ricezione, l'invio, l'accesso tramite client e webmail, la protezione da spam e virus.

== Pianificazione ==

Prima di iniziare, è fondamentale una corretta pianificazione e avere accesso alla [[Server/Dns|configurazione DNS]]:

 * '''Nome Dominio:''' È necessario possedere un nome dominio (es. `example.com`).
 * '''Record DNS:''' Saranno necessari almeno:
  * Un record '''A''' per il server mail (es. `mail.example.com` che punta all'IP pubblico del server).
  * Un record '''MX''' per il dominio (es. `example.com MX 10 mail.example.com`) che indica quale server gestisce la posta per quel dominio.
  * Un record '''PTR''' (reverse DNS) per l'IP pubblico del server, che risolva al nome host del server mail (es. `mail.example.com`). Questo è cruciale per la reputazione e per evitare che le mail vengano respinte come spam.
  * Configurazione '''[[https://it.wikipedia.org/wiki/Sender_Policy_Framework|SPF]]''', '''[[https://it.wikipedia.org/wiki/DomainKeys_Identified_Mail|DKIM]]''' e '''DMARC''' (consigliato): per migliorare la deliverability e combattere lo spoofing. Se necessario, si consiglia di approfondire tali in guide e/o manuali dedicati.
 * '''Partizionamento del Disco''' (Consigliato)''':''' Se possibile, dedicare [[Hardware/DispositiviPartizioni/Partizioni|partizioni separate]] può migliorare la gestione e la resilienza:
  * `/var/log`: Per i file di log.
  * `/var/spool/postfix`: Dove '''Postfix''' gestisce le code di posta.
  * `/var/mail` o `/var/vmail` (a seconda della configurazione): Dove vengono memorizzate le caselle di posta degli utenti.
 * '''Risorse del Server''': Un server mail, specialmente se con filtri antispam/antivirus, può richiedere una quantità significativa di RAM e CPU, a seconda del volume di posta gestito.
 * '''Sicurezza''': Il server dovrà essere accessibile da Internet sulle porte standard (25, 143, 587, 993, ecc.). È cruciale configurare un [[Sicurezza/Firewall|firewall]] (ad esempio '''[[Sicurezza/Ufw|ufw]]''') e mantenere il sistema aggiornato.

== Componenti Coinvolti ==

La gestione della posta elettronica in rete coinvolge diversi componenti software che lavoreranno in sinergia:

 * '''Client di Posta''' (MUA - Mail User Agent): Il programma utilizzato dagli utenti per leggere, scrivere e inviare messaggi (ad esempio [[InternetRete/Messaggistica/Thunderbird|Thunderbird]], Microsoft Outlook, K-9 Mail oppure la [[https://it.wikipedia.org/wiki/Webmail|webmail]]).
 * '''Mail Transfer Agent (MTA)''': Il cuore del sistema, responsabile della ricezione della posta da altri server, tramite [[https://it.wikipedia.org/wiki/Simple_Mail_Transfer_Protocol|SMTP]], dell'instradamento e dell'invio della posta ai server destinatari. Sarà utilizzato '''[[#Mail_Transfer_Agent_.28Postfix.29|Postfix]]'''.
 * '''Mail Delivery Agent (MDA) / Submission Agent''':
  * '''Local Delivery Agent''': Si occupa della consegna finale dei messaggi nelle caselle di posta elettronica in locale. Spesso è integrato in '''Postfix''' o gestito da '''Dovecot''', che fornisce supporto per i protocolli server '''[[https://it.wikipedia.org/wiki/Internet_Message_Access_Protocol|IMAP]]''' e '''[[https://it.wikipedia.org/wiki/Post_Office_Protocol|POP3]]'''.
  * '''Submission Agent''': Gestisce l'invio di posta da parte dei client autenticati, tipicamente sulla porta 587 (SMTP Submission).<<BR>>'''Postfix''' gestirà anche questo ruolo.
 * '''Filtri Antispam e Antivirus''': Software per analizzare le email in transito, identificare e bloccare spam e [[Sicurezza/Malware|malware]]. Si utilizzerà '''!SpamAssassin''' (per l'antispam) e '''[[Sicurezza/Clamav|ClamAV]]''' (per l'antivirus), coordinati da '''Amavisd-new'''.
 * '''Webmail''': Un'interfaccia web che permette agli utenti di accedere alla propria posta tramite un browser web. Si utilizzerà '''[[#Roundcube|Roundcube]]'''.

Il meccanismo di instradamento della posta si basa sull'associazione tra il dominio di posta elettronica (la parte dopo la `@` nell'indirizzo email) e i record DNS del dominio. L'MTA interroga i server DNS per trovare il server MX (Mail eXchanger) del dominio destinatario e consegnare il messaggio.

== Autenticazione Utenti ==

La configurazione principale si concentrerà sull'utilizzo di '''utenti di sistema locali UNIX''' (quelli creati con `adduser` o `useradd`) per l'autenticazione. L'integrazione con backend di autenticazione esterni come '''LDAP''' o database SQL è possibile con '''Postfix''' e '''Dovecot''' (per approfondire consultare la relativa documentazione/manualistica in rete).

= Installazione =

{{{#!wiki note
Prima di procedere con l'installazione, è consigliabile [[AmministrazioneSistema/InstallareProgrammi/Apt#update|aggiornare la lista dei pacchetti]].
}}}

== Mail Transfer Agent (Postfix) ==

Prima di tutto, occorre installare il '''Mail Transfer Agent (Postfix)''' e il '''server IMAP/POP3 (Dovecot)''', i quali si occuperanno di ricevere, inoltrare e consegnare le email.

[[AmministrazioneSistema/InstallareProgrammi|Installare]] i seguenti pacchetti, digitando nel [[AmministrazioneSistema/Terminale|terminale]]:{{{
sudo apt install postfix postfix-doc dovecot-core dovecot-imapd dovecot-pop3d dovecot-lmtpd
}}} verrà presentata una schermata di configurazione. Scegliere:
  * '''Tipo di configurazione del server di posta''': Sito Internet (Internet Site).
  * '''Nome di sistema della posta''' (System mail name): Inserire il proprio dominio di posta principale (es. `example.com`). Questo è il dominio per il quale il server sarà primariamente responsabile. __Non__ inserire quindi il nome host completo del server (es. `mail.example.com`), ma il solo dominio.

== Installazione Filtri Antispam e Antivirus ==

Ora installare i software per la protezione da spam e virus: '''!SpamAssassin''', '''[[Sicurezza/Clamav|ClamAV]]''' e '''Amavisd-new''' (che li coordina).

Per [[AmministrazioneSistema/InstallareProgrammi|installare]] i pacchetti, digitare nel [[AmministrazioneSistema/Terminale|terminale]] il seguente comando:{{{
sudo apt install amavisd-new spamassassin spamc pyzor razor dcc-client clamav-daemon clamav-freshclam libclamunrar9 libdbi-perl libdbd-mysql-perl libberkeleydb-perl
}}}

== Installazione Web Server e PHP ==

Per la webmail '''Roundcube''', è necessario un web server e [[Programmazione/Php|PHP]]. Si utilizzerà '''[[Server/Apache|Apache2]]'''.<<BR>>
Per [[AmministrazioneSistema/InstallareProgrammi|installare]] i pacchetti, digitare nel [[AmministrazioneSistema/Terminale|terminale]] il seguente comando:{{{
sudo apt install apache2 libapache2-mod-php php php-cli php-common php-gd php-curl php-intl php-mbstring php-mysql php-pear php-xml php-zip
}}}

{{{#!wiki note
Qualora si preferisca utilizzare '''Nginx''' come web server al posto di '''Apache''', i pacchetti da installare in questo passaggio sarebbero ovviamente diversi (es. ''nginx'' e ''php-fpm'') e la configurazione della webmail richiederebbe passaggi specifici per Nginx.
}}}

== Installazione Database e Webmail ==

'''Roundcube''' necessita di un database per memorizzare le sue impostazioni e i dati degli utenti (come la rubrica). Nei passaggi successivi saranno installati '''MariaDB''' (un fork di MySQL) e '''Roundcube'''.

=== MariaDB ===

 0. Se non si dispone già di un server '''MariaDB'''/'''MySQL''', digitare nel [[AmministrazioneSistema/Terminale|terminale]] il seguente comando:{{{
sudo apt install mariadb-server mariadb-client
}}}
 0. Dopo l'installazione si raccomanda di mettere in sicurezza l'installazione di MariaDB; digitare nel [[AmministrazioneSistema/Terminale|terminale]] il seguente comando:{{{
sudo mysql_secure_installation
}}} Seguire quindi le istruzioni a schermo.
 0. Creare un database e un utente specifici per '''Roundcube''', operazione che si vedrà nella sezione dedicata alla configurazione della webmail.

=== Roundcube ===

 0. Installare '''Roundcube''' digitando nel [[AmministrazioneSistema/Terminale|terminale]] il seguente comando:{{{
sudo apt install roundcube roundcube-core roundcube-mysql roundcube-plugins
}}}
 0. Durante l'installazione di roundcube, potrebbe essere richiesto di configurare il database. A seconda dei casi sarà possibile selezionare:
  * '''configurazione automatizzata''': quando richiesto scegliere "Sì" per configurare il database con `dbconfig-common` se si desidera una  di base; verranno richiesti il tipo di database, la password dell'utente amministratore del database, inoltre verrà creato un utente e database per Roundcube). 
  * '''configurazione manuale''': quando richiesto scegliere "No" e procedere in seguito con la configurazione del database ed i file di configurazione di Roundcube.
 Ai fini di questa guida, procedere con la configurazione automatizzata, se disponibile.

== Utility di Test ==

Infine, installare una semplice utility da [[AmministrazioneSistema/Terminale|riga di comando]] per testare l'invio di email. Digitare il comando:{{{
sudo apt install bsd-mailx
}}}

Al termine di questi passaggi, tutti i componenti software necessari dovrebbero essere installati. Sarà quindi possibile configurare ciascun componente, come descritto di seguito.

= Configurazione =

== Mail Transfer Agent (Postfix) ==

La configurazione principale di '''Postfix''' si trova nella directory `/etc/postfix/`; il file più importante è `main.cf`. Un altro file utile è `/etc/aliases` per la gestione degli alias degli utenti di posta elettronica.

=== File /etc/aliases ===

Il file `/etc/aliases` permette di definire alias per gli indirizzi email. Ad esempio, si può reindirizzare la posta destinata a `postmaster@example.com` o `root@example.com` a un utente di sistema reale.

{{{#!wiki important
Ogni volta che si modifica il file `/etc/aliases` è necessario aggiornare il database degli alias con il comando `sudo newaliases`
}}}

Esempio di contenuto per `/etc/aliases`:

 * Alias di sistema fondamentali (solitamente già presenti):{{{
mailer-daemon: postmaster
postmaster: root
nobody: root
hostmaster: root
usenet: root
news: root
webmaster: root
www: root
ftp: root
abuse: root
}}}
 * Alias personalizzati:
  * La posta per `info@example.com` viene consegnata all'utente di sistema `utentealpha`
  {{{
  info: utentealpha
  }}}
  * La posta per `supporto@example.com` viene consegnata agli utenti `utentebeta` e `utentegamma`
  {{{
  supporto: utentebeta, utentegamma
  }}}
  * La posta per `root` viene inoltrata anche a un indirizzo email esterno (sconsigliato per root senza cautela)
  {{{
  root: utentesistema, admin@altroprovider.com
  }}}

Questo comando legge il file `/etc/aliases` e crea/aggiorna il file aliases.db che '''Postfix''' utilizza effettivamente.

{{{#!wiki note
Dato che questa guida si concentra sugli utenti di sistema e non sull'integrazione LDAP, la sezione relativa a `ldap-aliases.cf` dell'originale viene omessa. Qualora fosse necessaria un'integrazione LDAP, consultare guide specifiche per [[https://www.postfix.org/LDAP_README.html|postfix-ldap]].
}}}

##Supponendo di avere un utente di sistema '''prova''', è possibile definire nel file `/etc/aliases` un alias come segue:{{{
##p.miodominio.com:	prova
##}}}
##che indica semplicemente che l'utente di sistema '''prova''' è identificato dal sistema MTA come ##'''p.miodominio.com'''.

=== File /etc/postfix/main.cf ===

Questo è il file di configurazione principale di Postfix. Aprire il file con i [[AmministrazioneSistema/PrivilegiDiAmministrazione|privilegi di amministrazione]] e un [[Ufficio/EditorDiTesto|editor di testo]] (ad esempio nano):{{{
sudo nano /etc/postfix/main.cf
}}}

Di seguito sono riportate le direttive fondamentali e alcune raccomandazioni. Molte di queste potrebbero essere già presenti o impostate correttamente dalla fase di installazione (Sito Internet). Verificare e adattare secondo le proprie necessità, sostituendo `example.com` con il proprio dominio e `mail.example.com` con il Fully Qualified Domain Name (FQDN) del proprio server mail.

##Per configurare '''postfix''', aprire il file `/etc/postfix/main.cf` e modificare il messaggio di benvenuto: {{{
##smtpd_banner = nostro messaggio di benvenuto
##}}}
##Quindi modificare le righe seguenti di conseguenza: {{{
##myhostname = FQDN di questo server (es : wilcoyote.example.com)

##mydomain = dominio di posta (=dominio DNS nel caso di LAN)

##alias_maps = hash:/etc/aliases,ldap:/etc/postfix/ldap-aliases.cf
##}}}
##L'ultima stringa dice al MTA che deve controllare, per la risoluzione dei nomi utente, prima il file `/etc/aliases` e poi il database LDAP referenziato dalle direttive nel file `/etc/aliases`.

##Di seguito vengono riportate le direttive presenti nel file:

## * '''myorigin = $mydomain'''<<BR>>indica che si invia posta soltanto per il proprio dominio
## * '''mydestination = dominio di posta, localhost.localdomain, localhost'''<<BR>>(N.B. dominio di posta ##= dominio DNS nel caso di LAN) indica che si accetta posta indirizzata soltanto al proprio dominio o a ##localhost (127.0.0.1).
## * '''inet_interfaces = all'''<<BR>>indica che il MTA all'avvio sta in ascolto su tutte le interfacce di rete.
## * '''smtpd_client_restrictions = reject_maps_rbl , reject_unknown_client , permit'''<<BR>>iniziano le restrizioni d'accesso native di postfix: questa indica di non accettare posta indirizzata o provenienete da siti di possibili spammers (indicati nella direttiva '''maps_rbl_domains''') e di non accettare connessioni da clients che non hanno record A in DNS.
## * '''smtpd_sender_restrictions = reject_unknown_sender_domain , reject_non_fqdn_sender , permit'''<<BR>>questa restrizione evita lo smistamento di posta proveniente da un mittente ignoto.
## * '''smtpd_recipient_restrictions = reject_unauth_destination , reject_non_fqdn_recipient , reject_unknown_recipient_domain , permit'''<<BR>>questa restrizione non permette di effettuare il relay (ovvero non permette di inviare posta elettronica da mittenti che non siano di questo sito) e di non smistare posta proveniente da un mittente ignoto.<<BR>>(N.B. La restrizione '''reject_unauth_destination''' dice al server di posta di impedire l'open relay e sostituisce la direttiva '''check_relay_domains''').
## * '''smtpd_helo_restrictions = reject_invalid_hostname , reject_non_fqdn_hostname , reject_unknown_hostname , permit'''<<BR>>queste restrizioni dicono di non accettare il saluto dal client che non risponda con un hostname esistente nel DNS (respingere se l'hostname presentato è invalido , non è nel formato FQDN o non ha record A o PTR nè MX nel DNS). Queste restrizioni sono molto importanti, poichè ad oggi molti spammers fanno uso di comandi helo-faked per velocizzare la spedizione di spam.
## * '''maps_rbl_domains = rbl.maps.vix.com,dul.maps.vix.com,relays.mail-abuse.org'''<<BR>>questa restrizione indica di non smistare posta proveniente da o indirizzata verso i domini elencati.

{{{
# Messaggio di benvenuto (banner) SMTP. È buona norma non rivelare la versione di Postfix.
smtpd_banner = $myhostname ESMTP

# Nome host completo del server (FQDN)
myhostname = mail.example.com

# Dominio di posta principale
mydomain = example.com

# Dominio da cui sembrano provenire le email inviate localmente senza un dominio specificato.
# Usare $mydomain è una scelta comune.
myorigin = $mydomain

# Domini per cui questo server accetta posta (destinazioni locali).
# Assicurarsi che il proprio dominio, il nome host e localhost siano inclusi.
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain

# Reti considerate "locali" o fidate. Postfix permetterà il relay da queste reti.
# Includere la rete locale se i client inviano posta tramite questo server senza autenticazione SMTP
# (non raccomandato per connessioni esterne). Per un server esposto su Internet,
# l'autenticazione SMTP (SASL) è il metodo preferito per permettere il relay.
# Esempio: mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 192.168.1.0/24
# Per una configurazione iniziale sicura, limitarsi a localhost:
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128

# Interfacce di rete su cui Postfix deve ascoltare per le connessioni in entrata.
# 'all' per ascoltare su tutte le interfacce disponibili.
inet_interfaces = all
# Se si vuole ascoltare solo su IPv4 (e non IPv6), si può usare:
# inet_protocols = ipv4
# Per default, Postfix usa 'all' (IPv4 e IPv6 se disponibili).
inet_protocols = all

# Mappa degli alias.
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases

# Limite sulla dimensione dei messaggi (in byte). 0 per illimitato (non consigliato).
# Esempio per 50MB:
message_size_limit = 52428800

# Limite sulla dimensione della casella di posta (mailbox_size_limit).
# Se si usa Dovecot per la consegna locale e le quote, questa impostazione di Postfix
# potrebbe essere meno rilevante o gestita da Dovecot. 0 per illimitato.
mailbox_size_limit = 0

# Percorso per la consegna locale (mailbox). Dovecot gestirà la consegna effettiva.
# Questo sarà spesso sovrascritto/gestito dalla configurazione di Dovecot (es. tramite LMTP o LDA).
# Per ora, commentare o assicurarsi che non sia in conflitto con Dovecot.
# home_mailbox = Maildir/
}}}

==== Restrizioni SMTP (Anti-Spam e Sicurezza di Base) ====

Le seguenti restrizioni aiutano a prevenire abusi e a ridurre lo spam. L'ordine è importante.
{{{
# Restrizioni per il client che si connette (fase CONNECT)
smtpd_client_restrictions =
    permit_mynetworks
    permit_sasl_authenticated
    reject_unauth_destination  # Fondamentale per prevenire open relay
    # Aggiungere qui RBLs (Real-time Blackhole Lists) se desiderato, es:
    # reject_rbl_client zen.spamhaus.org
    # reject_rbl_client b.barracudacentral.org

# Restrizioni sul comando HELO/EHLO
smtpd_helo_required = yes
smtpd_helo_restrictions =
    permit_mynetworks
    permit_sasl_authenticated
    reject_invalid_helo_hostname
    reject_non_fqdn_helo_hostname
    reject_unknown_helo_hostname # Può essere troppo restrittivo, valutare
    # check_helo_access hash:/etc/postfix/helo_access # Per blocchi specifici

# Restrizioni sul mittente (MAIL FROM)
smtpd_sender_restrictions =
    permit_mynetworks
    permit_sasl_authenticated
    reject_non_fqdn_sender
    reject_unknown_sender_domain
    # check_sender_access hash:/etc/postfix/sender_access # Per blocchi specifici

# Restrizioni sul destinatario (RCPT TO)
# reject_unauth_destination è la più importante qui per evitare open relay,
# ma è già in smtpd_client_restrictions o smtpd_relay_restrictions.
# Molte altre restrizioni sul destinatario sono spesso meglio gestite in smtpd_relay_restrictions.
smtpd_recipient_restrictions =
    permit_mynetworks
    permit_sasl_authenticated
    reject_unauth_destination
    # Aggiungere altre restrizioni se necessario, come:
    # reject_non_fqdn_recipient
    # reject_unknown_recipient_domain
    # check_recipient_access hash:/etc/postfix/recipient_access # Per blocchi specifici

# Restrizioni sul relay (più specifico per decidere se inoltrare la posta)
# Questa è una direttiva cruciale.
smtpd_relay_restrictions =
    permit_mynetworks
    permit_sasl_authenticated
    reject_unauth_destination

# Limita il numero di destinatari per messaggio.
smtpd_recipient_limit = 100

# Forza TLS per i client che si autenticano (Submission)
# Questa configurazione sarà dettagliata nella sezione Sicurezza.
# Per ora, assicurarsi che non ci siano direttive in conflitto.
}}}

{{{#!wiki note
Le liste RBL (Real-time Blackhole Lists) come `zen.spamhaus.org` possono essere molto efficaci contro lo spam, ma è importante scegliere RBL affidabili e monitorare che non causino falsi positivi. L'uso di Spamhaus richiede la conformità ai loro termini di servizio (solitamente gratuiti per uso non commerciale a basso volume).
}}}

{{{#!wiki important
Configurare le restrizioni SMTP richiede attenzione. Regole troppo aggressive possono bloccare email legittime. Iniziare con restrizioni più blande e monitorare i log per affinarle (`/var/log/mail.log`).
}}}

==== Configurazione per l'integrazione con Amavis (Antispam/Antivirus) ====

Questa parte sarà fondamentale per passare le email attraverso `Amavisd-new` per la scansione.
Verrà solitamente configurato un `content_filter` che instrada le email ad '''Amavis''' su una porta specifica (es. 10024) e Amavis le re-inietta in '''Postfix''' su un'altra porta (es. 10025) dopo la scansione.
{{{
# Integrazione con Amavisd-new (dopo che Amavis è stato configurato)
# Questa configurazione verrà attivata/dettagliata nella sezione dedicata ad Amavis.
# Per ora, si può lasciare commentata o prepararla.
# content_filter = smtp-amavis:[127.0.0.1]:10024
}}}

==== Configurazione per l'autenticazione SMTP (SASL) con Dovecot ====

Per permettere ai client di posta di inviare email attraverso il server, è necessaria l'autenticazione '''SMTP'''. Configurare '''Postfix''' per usare '''Dovecot SASL'''.

Questa parte sarà dettagliata nella sezione sulla sicurezza e l'autenticazione.
{{{
# Impostazioni per SASL (verranno dettagliate in seguito)
# smtpd_sasl_type = dovecot
# smtpd_sasl_path = private/auth
# smtpd_sasl_auth_enable = yes
# broken_sasl_auth_clients = yes # Per compatibilità con client più vecchi
# smtpd_sasl_security_options = noanonymous
# smtpd_sasl_local_domain = $myhostname
}}}

Salvare il file `main.cf` dopo le modifiche.

=== Verifica della configurazione e avvio/riavvio di Postfix ===

Dopo aver modificato `main.cf`, è buona norma verificare la presenza di errori di sintassi, digitare nel [[AmministrazioneSistema/Terminale|terminale]] il seguente comando:{{{
sudo postfix check
}}}

Se non vengono mostrati errori, è possibile applicare le modifiche ricaricando o riavviando Postfix già in esecuzione, digitando nel [[AmministrazioneSistema/Terminale|terminale]] i comandi descritti sotto in tabella:

||<tablestyle="width:80%;" :50%>'''Comando''' ||<:50%>'''Funzione''' ||
||'''sudo systemctl reload postfix''' || Ricarica il servizio. ||
||'''sudo systemctl restart postfix''' || Riavvia il servizio. ||
||'''sudo systemctl status postfix''' || Verificare lo stato del servizio. ||
||'''sudo systemctl enable postfix''' || Abilitare l'avvio automatico del servizio al boot di sistema. ||
||'''sudo systemctl stop postfix''' || Arresta il servizio. ||
||'''sudo systemctl disable postfix''' || Disabilita il servizio dall'avvio del sistema. ||

I log di '''Postfix''' si trovano principalmente in `/var/log/mail.log`. Controllare questo file per messaggi di errore o informazioni sul flusso della posta:{{{
sudo tail -f /var/log/mail.log
}}}

=== Ulteriori considerazioni sulla sicurezza (HELO/EHLO) ===

La sezione `smtpd_helo_restrictions` già proposta copre questi aspetti. È importante che sia impostato:{{{
smtpd_helo_required = yes
reject_invalid_helo_hostname
reject_non_fqdn_helo_hostname
reject_unknown_helo_hostname
}}} 
Questa può essere una restrizione forte e potrebbe bloccare server legittimi ma mal configurati. Valutare con cautela e monitorare i log.<<BR>>
Le restrizioni `smtpd_client_restrictions`, `smtpd_helo_restrictions`, `smtpd_sender_restrictions`, e `smtpd_recipient_restrictions` (o `smtpd_relay_restrictions`) lavorano insieme per proteggere il server.

{{{#!wiki important
È fondamentale assicurarsi che `reject_unauth_destination` sia presente in un punto appropriato delle restrizioni (tipicamente in `smtpd_relay_restrictions` o `smtpd_recipient_restrictions` se usato globalmente) per prevenire che il server diventi un "open relay", ovvero un server che inoltra posta per chiunque verso qualunque destinazione. Un open relay verrebbe rapidamente abusato dagli spammer e inserito in blacklist.
}}}

== Delivery Agent (Dovecot - IMAP/POP3) ==

'''Dovecot''' è il software che si utilizzerà per permettere agli utenti di accedere alle proprie caselle di posta tramite i protocolli '''IMAP''' (consigliato, la posta rimane sul server) e '''POP3''' (la posta viene scaricata localmente dal client). '''Dovecot''' si occuperà anche dell'autenticazione degli utenti e della consegna locale dei messaggi (Local Delivery Agent - LDA) tramite LMTP.

La configurazione di '''Dovecot''' è modulare e si trova principalmente in `/etc/dovecot/`, con i file di configurazione specifici dentro `/etc/dovecot/conf.d/`.

=== Configurazione di Base ===

Molte impostazioni predefinite di '''Dovecot''' sono già adeguate per un funzionamento di base. Di seguito alcune delle configurazioni chiave.

==== Abilitare i protocolli ====

Per definire su quali interfacce e porte '''Dovecot''' deve ascoltare:

 0. Aprire con i [[AmministrazioneSistema/PrivilegiDiAmministrazione/Sudo|privilegi di amministrazione]] e con un [[Ufficio/EditorDiTesto|editor di testo]] il file `/etc/dovecot/conf.d/10-master.conf`.
 0. Assicurarsi che le sezioni relative a `imap_listener` e `pop3_listener` siano abilitate (non commentate) e configurate per ascoltare su tutte le interfacce o su quelle desiderate (spesso è la configurazione di default).

Il parametro `protocols` nel file principale `/etc/dovecot/dovecot.conf` (o in `10-master.conf`) definisce quali protocolli sono globalmente abilitati.
 0. Verificare o modificare `/etc/dovecot/dovecot.conf`, digitando nel [[AmministrazioneSistema/Terminale|terminale]] il seguente comando:{{{
sudo nano /etc/dovecot/dovecot.conf
}}}
 0. Assicurarsi che la riga `protocols` includa imap pop3 lmtp:
## Protocolli abilitati. imaps e pop3s sono abilitati automaticamente se SSL è configurato.
{{{
protocols = imap pop3 lmtp
}}}

==== Formato e posizione della casella di posta ====

'''Dovecot''' deve essere configurato per individuare la posizione delle email degli utenti e in quale formato sono memorizzate (Maildir è il formato raccomandato).

 0. Aprire con i [[AmministrazioneSistema/PrivilegiDiAmministrazione/Sudo|privilegi di amministrazione]] e con un [[Ufficio/EditorDiTesto|editor di testo]] il file `/etc/dovecot/conf.d/10-master.conf`.
 0. Configurare `mail_location`. L'impostazione più comune per utenti di sistema è '''Maildir''' nella home directory dell'utente:
# Formato e percorso della casella di posta. Maildir è raccomandato.
# %h si espande alla home directory dell'utente.
{{{
mail_location = maildir:~/Maildir
}}}

Se si utilizza un percorso diverso per le caselle di posta (es. `/var/vmail/%d/%n` per domini virtuali), questa impostazione andrà adattata. Per utenti di sistema, `~/Maildir` è un buon punto di partenza.

{{{#!wiki note
'''Maildir''' memorizza ogni email in un file separato, il che lo rende più robusto contro la corruzione dei dati e più performante con grandi volumi di posta e accessi concorrenti. '''mbox''' memorizza tutte le email di una cartella in un unico file.
}}}

==== Autenticazione ====

'''Dovecot''' gestirà l'autenticazione degli utenti. Per utenti di sistema, l'autenticazione PAM è solitamente la scelta predefinita e funziona bene.

 0. Aprire con i [[AmministrazioneSistema/PrivilegiDiAmministrazione/Sudo|privilegi di amministrazione]] e con un [[Ufficio/EditorDiTesto|editor di testo]] il file `/etc/dovecot/conf.d/10-master.conf`.
 0. Assicurarsi che includa:{{{
auth_mechanisms = plain login
}}} e verificare che il backend di autenticazione per gli utenti di sistema sia abilitato.
  * Dovrebbe essere presente una sezione simile a questa (o il file `auth-system.conf.ext` dovrebbe essere incluso e configurato):{{{
# Esempio per l'autenticazione degli utenti di sistema (PAM)
# Questa potrebbe essere in un file incluso come auth-system.conf.ext
!include auth-system.conf.ext
}}}
  * Il cobtenuto del file `auth-system.conf.ext` dovrebbe essere simile al seguente:{{{
passdb {
  driver = pam
  # args = dovecot # Il nome del servizio PAM, solitamente /etc/pam.d/dovecot
}
userdb {
  driver = passwd
  # Per utenti con UID < 500 (o un altro valore minimo, es. 1000 per utenti normali)
  # args = uid=500 # o uid=1000 a seconda del sistema
}
}}}

{{{#!wiki note
La configurazione predefinita di solito gestisce correttamente gli utenti di sistema.
}}}

==== Configurazione SSL/TLS ====

La crittografia è fondamentale. Configurare '''SSL/TLS''' per '''IMAPS''' e '''POP3S'''.

Aprire con i [[AmministrazioneSistema/PrivilegiDiAmministrazione/Sudo|privilegi di amministrazione]] e con un [[Ufficio/EditorDiTesto|editor di testo]] il file `/etc/dovecot/conf.d/10-ssl.conf` ed impostare:{{{
# Abilita SSL. 'required' forza SSL e disabilita le versioni non criptate.
# Per iniziare, si può usare 'yes' che permette sia versioni criptate che non,
# poi passare a 'required' una volta che tutto funziona.
ssl = yes # o required per forzare SSL

# Percorsi ai file del certificato SSL e della chiave privata.
# È consigliabile usare certificati validi, ad esempio da Let's Encrypt.
# Sostituire con i propri percorsi.
ssl_cert = </etc/ssl/certs/dovecot.pem  # O il percorso del certificato del proprio dominio
ssl_key = </etc/ssl/private/dovecot.key # O il percorso della chiave del proprio dominio

# Protocolli SSL/TLS minimi consentiti. Aggiornare alle best practice.
ssl_min_protocol = TLSv1.2

# Cipher list (consultare le raccomandazioni moderne, es. da Mozilla SSL Config Generator)
# ssl_cipher_list = ...
}}}

{{{#!wiki note
Per i certificati '''SSL''', si possono usare certificati autofirmati per test, ma per un server di produzione è fortemente raccomandato utilizzare certificati emessi da una CA riconosciuta (es. '''Let's Encrypt'''). Se si usa Let's Encrypt, ssl_cert potrebbe essere `/etc/letsencrypt/live/mail.example.com/fullchain.pem` e `ssl_key /etc/letsencrypt/live/mail.example.com/privkey.pem`
}}}

=== Integrazione con Postfix (LMTP) ===

Per la consegna locale dei messaggi da '''Postfix''' a '''Dovecot''', utilizzare '''LMTP (Local Mail Transfer Protocol)''', che è più efficiente e flessibile rispetto alla chiamata diretta di dovecot-lda.

 0. Aprire con i [[AmministrazioneSistema/PrivilegiDiAmministrazione/Sudo|privilegi di amministrazione]] e con un [[Ufficio/EditorDiTesto|editor di testo]] il file `/etc/dovecot/conf.d/10-master.conf`, quindi assicurarsi che il servizio '''LMTP''' sia configurato per ascoltare su un socket UNIX (metodo preferito e più sicuro) o su una porta TCP.
 0. Cercare la sezione service lmtp e configurarla come nel seguente esempio:{{{
service lmtp {
  unix_listener /var/spool/postfix/private/dovecot-lmtp {
    # Impostazioni del listener LMTP via socket UNIX
    mode = 0600
    user = postfix
    group = postfix
  }

  # Esempio alternativo: listener LMTP su TCP (meno comune per integrazione locale)
  # inet_listener lmtp {
  #   port = 24 # o altra porta
  # }
}
}}}

Il socket `/var/spool/postfix/private/dovecot-lmtp` è un percorso comune. La directory `/var/spool/postfix/private/` deve essere accessibile a '''Postfix'''.<<BR>>Ora si dovrà configurare '''Postfix''' per usare questo socket '''LMTP'''. 

Aprire con i [[AmministrazioneSistema/PrivilegiDiAmministrazione/Sudo|privilegi di amministrazione]] e con un [[Ufficio/EditorDiTesto|editor di testo]] il file `/etc/postfix/main.cf` ed aggiungere o modificare la seguente riga:{{{
mailbox_transport = lmtp:unix:private/dovecot-lmtp
# Se si usano domini virtuali, potrebbe essere virtual_transport invece di mailbox_transport
}}} 
In questo modo si imposta '''Postfix''' per passare le email destinate a utenti locali al servizio '''LMTP''' di '''Dovecot''' tramite il socket UNIX specificato (relativo a `/var/spool/postfix/`).

=== Configurazione per l'autenticazione SASL da Postfix ===

'''Dovecot''' può fornire il meccanismo di autenticazione '''SASL''' a '''Postfix''', permettendo ai client di autenticarsi per inviare email.

 0. Aprire con i [[AmministrazioneSistema/PrivilegiDiAmministrazione/Sudo|privilegi di amministrazione]] e con un [[Ufficio/EditorDiTesto|editor di testo]] il file `/etc/dovecot/conf.d/10-master.conf`, quindi assicurarsi che il servizio di autenticazione sia configurato per Postfix.
 0. Cercare la sezione `service auth` e assicurarsi che esista un listener per Postfix:{{{
service auth {
  # ... altre impostazioni ...
  unix_listener /var/spool/postfix/private/auth {
    mode = 0660
    user = postfix
    group = postfix
  }

  # Alternativamente, potrebbe essere:
  # unix_listener auth-userdb { # per lookup utente
  #   mode = 0600
  #   user = vmail # o l'utente che Postfix userà per le query
  # }
}
}}} 
 La configurazione predefinita di solito crea `/var/spool/postfix/private/auth`.
 0. Ora si dovrà configurare '''Postfix''' per usare '''Dovecot SASL'''. Modificare `/etc/postfix/main.cf` aggiungendo o modificando le seguenti righe (alcune potrebbero già esistere o essere state preparate nella sezione Postfix):{{{
# Autenticazione SMTP (SASL) con Dovecot
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth  # Relativo a /var/spool/postfix/
smtpd_sasl_auth_enable = yes
# Per client più vecchi che potrebbero avere problemi con SASL
# broken_sasl_auth_clients = yes
# Non permettere login anonimi
smtpd_sasl_security_options = noanonymous
# Per evitare che Postfix tenti di aggiungere @nomehost agli username senza dominio
smtpd_sasl_local_domain = $myhostname
}}}

=== Avvio e Verifica di Dovecot ===

Dopo aver apportato le modifiche, riavviare '''Dovecot''' per applicarle. Digitare nel [[AmministrazioneSistema/Terminale|terminale]] i comandi descritti nella tabella sottostante

||<tablestyle="width:80%;" :50%>'''Comando''' ||<:50%>'''Funzione''' ||
||'''sudo systemctl restart dovecot.service''' || Riavvia il servizio. ||
||'''sudo systemctl status dovecot.service''' || Verifica lo stato del servizio. ||
||'''sudo systemctl enable dovecot.service''' || Abilitare l'avvio automatico al boot. ||
||'''sudo systemctl stop dovecot.service''' || Arresta il servizio. ||
||'''sudo systemctl disable dovecot.service''' || Disabilita il servizio dall'avvio del sistema. ||

Per controllare i log di Dovecot (e di Postfix) per eventuali errori, digitare nel [[AmministrazioneSistema/Terminale|terminale]] il seguente comando:{{{
sudo tail -f /var/log/mail.log
}}}

Tra i vari aspetti da considerare:
 * Potrebbero esserci log specifici di Dovecot in `/var/log/dovecot/` o syslog.
 * Per vedere i log di Dovecot con systemd:{{{
sudo journalctl -u dovecot.service -f
}}}
 * Si può testare la connessione '''IMAP/POP3''' con un client di posta o con telnet (es.: `telnet localhost 143` per IMAP, `telnet localhost 110` per POP3, `openssl s_client -connect localhost:993` per IMAPS).

== Webmail ==

=== Roundcube ===

Per consentire agli utenti di accedere alla propria posta elettronica tramite un [[InternetRete/Navigazione#Browser_per_navigare|browser web]], installare e configurare '''Roundcube''', una moderna applicazione di webmail. '''Roundcube''' si interfaccerà con il server IMAP (Dovecot) per recuperare le email e con il server SMTP (Postfix) per inviarle. Utilizzare '''[[Server/Apache|Apache2]] ''' come web server e '''MySQL'''/'''MariaDB''' come database per '''Roundcube'''.

Assicurarsi che i pacchetti necessari (Apache2, PHP, MariaDB, Roundcube) siano stati installati come descritto nel paragrafo dedicato all'installazione.

==== Creazione del Database (MariaDB/MySQL) ====

'''Roundcube''' necessita di un database per memorizzare le impostazioni utente, la rubrica, ecc. Se non è stato fatto durante l'[[#Roundcube|installazione di Roundcube]] tramite `dbconfig-common`, creare manualmente il database e l'utente.

 0. Accedere al prompt di '''MariaDB'''/'''[[Server/MySql|MySQL]]''' come utente root (verrà chiesta la password impostata durante `mysql_secure_installation` o la password di root del DB):{{{
sudo mysql -u root -p
}}}
 0. Una volta dentro il prompt, eseguire i seguenti comandi SQL. Sostituire `roundcube_password_segreta` con una password robusta:{{{
CREATE DATABASE roundcubemail CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'roundcubeuser'@'localhost' IDENTIFIED BY 'roundcube_password_segreta';
GRANT ALL PRIVILEGES ON roundcubemail.* TO 'roundcubeuser'@'localhost';
FLUSH PRIVILEGES;
EXIT;
}}} 

I precedenti comandi:
 * Creano un database chiamato '''roundcubemail'''.
 * Creano un utente chiamato `roundcubeuser` che può connettersi solo da localhost.
 * Concedono tutti i privilegi sul database roundcubemail all'utente roundcubeuser.

==== Configurazione di Roundcube ====

Se '''Roundcube''' è stato installato dai [[Repository|repository]], la configurazione principale si trova in `/etc/roundcube/config.inc.php`. Se questo file non esiste, copiare `/etc/roundcube/config.inc.php.sample` in `/etc/roundcube/config.inc.php`.

 0. Aprire con i [[AmministrazioneSistema/PrivilegiDiAmministrazione/Sudo|privilegi di amministrazione]] e con un [[Ufficio/EditorDiTesto|editor di testo]] il file di configurazione `/etc/roundcube/config.inc.php`.
 0. Modificare le seguenti direttive principali:{{{
// Configurazione del Database
// Assicurarsi che corrisponda a quanto creato nel database
$config['db_dsnw'] = 'mysql://roundcubeuser:roundcube_password_segreta@localhost/roundcubemail';

// Host IMAP
// 'localhost' se Dovecot è sulla stessa macchina. Usare 'ssl://localhost' o 'tls://localhost'
// per connessioni SSL/TLS rispettivamente. La porta 993 è per IMAPS (SSL).
$config['default_host'] = 'ssl://localhost'; // o 'tls://localhost'
$config['default_port'] = 993; // o 143 per IMAP non criptato con STARTTLS

// Host SMTP
// 'localhost' se Postfix è sulla stessa macchina. Usare 'ssl://localhost' o 'tls://localhost'
// per connessioni SSL/TLS rispettivamente. La porta 465 è per SMTPS (SSL), 587 per Submission (STARTTLS).
$config['smtp_server'] = 'tls://localhost'; // o 'ssl://localhost'
$config['smtp_port'] = 587; // o 465
$config['smtp_user'] = '%u'; // Username dell'utente corrente
$config['smtp_pass'] = '%p'; // Password dell'utente corrente
$config['smtp_auth_type'] = 'LOGIN'; // o PLAIN, a seconda di cosa supporta Postfix/Dovecot SASL

// Nome del prodotto (appare nel titolo della pagina)
$config['product_name'] = 'Webmail Aziendale'; // Personalizzare

// Supporto URL (opzionale)
// $config['support_url'] = 'http://support.example.com';

// Lingua predefinita (es. 'it_IT' per italiano)
$config['language'] = 'it_IT';

// Abilitare il logging degli errori SMTP (utile per il debug)
$config['smtp_log'] = true;
$config['log_dir'] = '/var/log/roundcube/'; // Assicurarsi che questa directory esista e sia scrivibile da Apache
$config['temp_dir'] = '/var/tmp/roundcube/'; // Assicurarsi che questa directory esista e sia scrivibile da Apache

// Plugin da abilitare
// $config['plugins'] = array('archive', 'zipdownload', 'managesieve'); // Esempio
$config['plugins'] = array(); // Iniziare con pochi o nessun plugin, poi aggiungerli
}}}
 0. Assicurarsi che le directory specificate in `log_dir` e `temp_dir` (es. `/var/log/roundcube/` e `/var/tmp/roundcube/` o `/var/lib/roundcube/temp`) esistano e abbiano i corretti permessi di scrittura per l'utente relativo ad Apache (solitamente `www-data`). A tal fine utilizzare i seguenti comandi:{{{
sudo mkdir -p /var/log/roundcube /var/tmp/roundcube
sudo chown www-data:www-data /var/log/roundcube /var/tmp/roundcube
sudo chmod 750 /var/log/roundcube /var/tmp/roundcube
}}}

Dopo aver salvato `config.inc.php`, '''Roundcube''' dovrebbe inizializzare la struttura del database al primo accesso, se non è già stato fatto da `dbconfig-common`.

==== Configurazione di Apache2 per Roundcube ====

Se '''Roundcube''' è stato installato dai [[Repository#Repository_ufficiali|repository ufficiali]], solitamente viene fornito un file di configurazione per '''[[Server/Apache|Apache]]''' in `/etc/apache2/conf-available/roundcube.conf`.

Abilitare questa configurazione (se non già fatto in precedenza) e il modulo rewrite di Apache con i seguenti comandi:{{{
sudo a2enconf roundcube
sudo a2enmod rewrite
sudo systemctl restart apache2
}}}

Il file `/etc/apache2/conf-available/roundcube.conf` definisce un '''Alias''' per accedere a '''Roundcube''', solitamente su `/roundcube` (es. `http://mail.example.com/roundcube`).
Se si desidera accedere a Roundcube direttamente da un Virtual Host dedicato (es.: `https://webmail.example.com`), è necessario creare un file di configurazione per un Virtual Host Apache.

Di seguito un esempio di Virtual Host per `webmail.example.com` in `/etc/apache2/sites-available/webmail.example.com.conf`:{{{
<VirtualHost *:80>
    ServerName webmail.example.com
    DocumentRoot /usr/share/roundcube/

    # Reindirizza tutto il traffico HTTP a HTTPS
    RewriteEngine On
    RewriteCond %{HTTPS} off
    RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R=301,L]

    ErrorLog ${APACHE_LOG_DIR}/webmail.example.com-error.log
    CustomLog ${APACHE_LOG_DIR}/webmail.example.com-access.log combined
</VirtualHost>

<VirtualHost *:443>
    ServerName webmail.example.com
    DocumentRoot /usr/share/roundcube/

    # Configurazione SSL
    SSLEngine on
    # Sostituire con i percorsi dei propri certificati SSL (es. Let's Encrypt)
    SSLCertificateFile /etc/letsencrypt/live/webmail.example.com/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/webmail.example.com/privkey.pem

    # Opzioni SSL moderne (consultare Mozilla SSL Configuration Generator)
    # SSLProtocol             all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
    # SSLCipherSuite          ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:...
    # SSLHonorCipherOrder     on
    # SSLCompression          off
    # SSLSessionTickets       off

    # Header di sicurezza
    Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
    Header always set X-Content-Type-Options "nosniff"
    Header always set X-Frame-Options "SAMEORIGIN"
    Header always set X-XSS-Protection "1; mode=block"

    <Directory /usr/share/roundcube/>
        Options -Indexes +FollowSymLinks
        AllowOverride All # O specifiche direttive se si conoscono
        Require all granted
        # Protezione aggiuntiva per file sensibili se necessario
        # <FilesMatch "\.(php|phtml|inc)$">
        # Require all denied
        # </FilesMatch>
        # <FilesMatch "(config.inc.php|mbox.php|CHANGELOG|INSTALL|README|UPGRADING)">
        # Require all denied
        # </FilesMatch>
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/webmail.example.com-ssl-error.log
    CustomLog ${APACHE_LOG_DIR}/webmail.example.com-ssl-access.log combined
</VirtualHost>
}}}

Dopo aver creato il file del Virtual Host:

 0. Abilitare il sito:{{{
sudo a2ensite webmail.example.com.conf
}}}
 0. Abilitare il modulo SSL di Apache:{{{
sudo a2enmod ssl
}}}
 0. Verificare la configurazione di Apache:{{{
sudo apache2ctl configtest
}}}
 0. Riavviare Apache:{{{
sudo systemctl restart apache2
}}}

{{{#!wiki note
Per i certificati '''SSL''', è fortemente raccomandato utilizzare '''Let's Encrypt''' per ottenere certificati gratuiti e validi. Il tool `certbot` può automatizzare la creazione e il rinnovo dei certificati.
}}}

==== Testare Roundcube ====

Aprire un [[InternetRete/Navigazione#Browser_per_navigare|browser]] e navigare all'URL configurato per '''Roundcube''' (es. `https://webmail.example.com` o `http://il_tuo_server_ip/roundcube`).

Si dovrebbe vedere la pagina di login di '''Roundcube'''. Provare ad accedere con un utente di sistema e la sua password.<<BR>>
In caso di problemi controllare i seguenti [[AmministrazioneSistema/LogDiSistema|log]]:
 * Log di Roundcube: `/var/log/roundcube/` (se configurato)
 * Log di Apache: `/var/log/apache2/error.log` e `/var/log/apache2/webmail.example.com-error.log`
 * Log di Postfix: `/var/log/mail.log`
 * Log di Dovecot: digitare il comando:{{{
sudo journalctl -u dovecot.service}}}

== Filtri AntiSpam/AntiVirus ==

Per proteggere il server mail da spam e malware, si integrerà '''Amavisd-new''', che orchestrerà '''!SpamAssassin''' (per il rilevamento dello spam) e '''[[Sicurezza/Clamav|ClamAV]]''' (per la scansione antivirus). '''Postfix''' invierà le email ad Amavisd-new prima della consegna finale; Amavisd-new le analizzerà e, se pulite, le re-inietterà in Postfix per la consegna.

Assicurarsi che i pacchetti ''amavisd-new'', ''spamassassin'', ''clamav-daemon'' e le loro dipendenze siano stati installati come descritto [[#Installazione|qui]].

=== Configurazione di ClamAV ===

{{{#!wiki note
'''[[Sicurezza/Clamav|ClamAV]]''' dovrebbe già funzionare grosso modo con le impostazioni predefinite.
}}}

La parte più importante consiste in:

 * Assicurarsi che il [[AmministrazioneSistema/Systemd|demone]] `clamav-daemon` sia in esecuzione e che `freshclam` aggiorni regolarmente le definizioni dei virus. Verificare che `freshclam` sia attivo per gli aggiornamenti automatici (solitamente lo è di default).
 * Assicurarsi che l'utente `clamav` sia membro del gruppo `amavis` (o viceversa, a seconda della configurazione di '''Amavis''') per permettere ad Amavis di comunicare con il socket di ClamAV:.
  * Per aggiungere l'utente `amavis` al gruppo `clamav`, digitare nel [[AmministrazioneSistema/Terminale|terminale]] il seguente comando:{{{
  sudo usermod -a -G clamav amavis
  }}} Oppure, se Amavis è gia eseguito come utente `amavis` e ClamAV come `clamav`, aggiungere l'utente clamav al gruppo amavis:{{{
 sudo usermod -a -G amavis clamav
 }}}
  * Verificare quale utente usa Amavis e ClamAV e i permessi del socket di ClamAV (es.: `/var/run/clamav/clamd.ctl`).
  {{{#!wiki note
  Una configurazione comune è che `amavis` possa accedere al socket di `clamd`.
  }}}
  * Riavviare i servizi dopo eventuali modifiche ai gruppi:{{{
  sudo systemctl restart clamav-daemon
  sudo systemctl restart amavis
  }}}

=== Configurazione di SpamAssassin ===

'''!SpamAssassin''' viene utilizzato da `Amavisd-new`. Le sue regole si trovano in `/etc/spamassassin/local.cf` per le personalizzazioni.

Per abilitare l'aggiornamento automatico delle regole di SpamAssassin (tramite sa-update):
 0. Aprire con i [[AmministrazioneSistema/PrivilegiDiAmministrazione|privilegi di amministrazione]] e con un [[Ufficio/EditorDiTesto|editor di testo]] il file `/etc/default/spamassassin`.
 0. Impostare il parametro `CRON=1` per abilitare il job di cron che esegue `sa-update`.

Il demone `spamd` non è strettamente necessario se `Amavisd-new` chiama !SpamAssassin come libreria Perl (comportamento comune). Tuttavia se `spamd` è in esecuzione, assicurarsi che sia configurato correttamente. Per questa guida si assumiame che Amavis chiami !SpamAssassin direttamente.

### corregere da qui

=== Configurazione di Amavisd-new ===

`Amavisd-new` è il collante tra '''Postfix''', '''SpamAssassin''' e '''ClamAV'''. La sua configurazione principale si trova in `/etc/amavis/conf.d/`. Modifichiamo il file `15-content_filter_mode` e `50-user`.

 0. Aprire `/etc/amavis/conf.d/15-content_filter_mode`:{{{
sudo nano /etc/amavis/conf.d/15-content_filter_mode
}}}
 0. Assicurarsi che le sezioni per abilitare SpamAssassin e ClamAV siano decommentate (rimuovere # all'inizio delle righe):{{{
# Abilita SpamAssassin
@bypass_spam_checks_maps = (
   %bypass_spam_checks,   # controls running of anti-spam code
   \%bypass_spam_checks_acl, # controls running of anti-spam code
);

# Abilita ClamAV (o altri antivirus)
@bypass_virus_checks_maps = (
   %bypass_virus_checks, # controls running of anti-virus code
   \%bypass_virus_checks_acl, # controls running of anti-virus code
);
}}}

Queste sono le impostazioni predefinite e solitamente abilitano i controlli.

 0. Aprire `/etc/amavis/conf.d/50-user` per le configurazioni specifiche dell'utente/sito:{{{
sudo nano /etc/amavis/conf.d/50-user
}}}
 0. Configurare le seguenti direttive (alcune potrebbero già esistere):{{{
# Dominio e nome host
$mydomain = 'example.com'; # Sostituire con il proprio dominio
$myhostname = "mail.$mydomain"; # Sostituire con FQDN del server mail

# Interfacce di ascolto di Amavis
# Amavis ascolta su 127.0.0.1:10024 per ricevere posta da Postfix (pre-queue filter)
# e reinvia la posta a Postfix su 127.0.0.1:10025 (post-queue filter)
$inet_socket_port = [10024, 10026]; # 10024 per Postfix, 10026 per il re-injection alternativo
$forward_method = 'smtp:[127.0.0.1]:10025'; # Dove Amavis reinvia la posta a Postfix
$notify_method  = $forward_method;

# Azioni per spam e virus
$sa_tag_level_deflt  = 2.0;  # Punteggio per aggiungere gli header X-Spam-*
$sa_tag2_level_deflt = 6.31; # Punteggio per aggiungere '***SPAM***' all'oggetto
$sa_kill_level_deflt = 6.31; # Punteggio per bloccare/rifiutare l'email (o metterla in quarantena)
                             # Per iniziare, è meglio non bloccare subito, ma solo taggare
                             # $sa_kill_level_deflt = $sa_tag2_level_deflt + 5; # Esempio per non bloccare
$sa_spam_subject_tag = '***SPAM*** '; # Prefisso per l'oggetto delle email spam

# Quarantena (opzionale, richiede configurazione aggiuntiva)
# $QUARANTINEDIR = '/var/virusmails'; # Commentato per ora
# $virus_quarantine_to = 'virus-quarantine@example.com'; # Notifica per virus in quarantena
# $spam_quarantine_to  = 'spam-quarantine@example.com';  # Notifica per spam in quarantena

# Log level
$log_level = 2; # 0-5, 2 è un buon livello per iniziare

# Assicurarsi che Amavis possa trovare ClamAV
# Questo è solitamente gestito dalla configurazione di ClamAV in 15-av_scanners o simile
# Esempio per clamd socket:
# ['ClamAV-clamd',
#   \&ask_daemon, ["CONTSCAN {}\n", "/var/run/clamav/clamd.ctl"],
# ... ],

# Assicurarsi che l'utente amavis sia nei gruppi giusti
# (es. 'clamav', 'postfix') per accedere ai socket e comunicare.
# Questo è stato parzialmente gestito prima.
# $daemon_user  = 'amavis';
# $daemon_group = 'amavis';
 }}}
 {{{#!wiki important
 I valori di `$sa_tag_level_deflt`, `$sa_tag2_level_deflt` e `$sa_kill_level_deflt` sono cruciali. Iniziare con un `$sa_kill_level_deflt` alto (o commentarlo) per evitare di bloccare email legittime (falsi positivi) finché non si è sicuri del comportamento del filtro. È meglio taggare le email e lasciare che gli utenti le filtrino nei loro client di posta, piuttosto che bloccarle aggressivamente all'inizio.
 }}}
 0. Verificare la configurazione di Amavis:{{{
 sudo amavisd-new testkeys
 }}}
 0. Riavviare Amavisd-new:{{{
 sudo systemctl restart amavis
 sudo systemctl enable amavis
 sudo systemctl status amavis
 }}}

=== Integrazione di Amavisd-new con Postfix ===

Ora dobbiamo dire a '''Postfix''' di inviare le email ad Amavisd-new per la scansione.

 0. Modificare `/etc/postfix/main.cf`:{{{
sudo nano /etc/postfix/main.cf
}}}
 0. Aggiungere o decommentare la seguente riga:{{{
# Invia le email ad Amavis prima della consegna
content_filter = smtp-amavis:[127.0.0.1]:10024
}}}
 0. Poi, dobbiamo configurare Postfix per accettare le email re-iniettate da Amavis. Modificare `/etc/postfix/master.cf`:{{{
sudo nano /etc/postfix/master.cf
}}}
 0. Aggiungere le seguenti sezioni alla fine del file (o assicurarsi che esistano e siano configurate correttamente):{{{
# Servizio SMTP per Amavisd-new (re-injection)
# Postfix ascolta sulla porta 10025 per le email processate da Amavis
127.0.0.1:10025 inet n  -       n       -       -       smtpd
  -o content_filter=                                    # Non filtrare di nuovo le email già processate
  -o local_recipient_maps=
  -o relay_recipient_maps=
  -o smtpd_restriction_classes=
  -o smtpd_delay_reject=no
  -o smtpd_client_restrictions=permit_mynetworks,reject
  -o smtpd_helo_restrictions=
  -o smtpd_sender_restrictions=
  -o smtpd_recipient_restrictions=permit_mynetworks,reject
  -o smtpd_data_restrictions=reject_unauth_pipelining
  -o smtpd_end_of_data_restrictions=
  -o mynetworks=127.0.0.0/8
  -o smtpd_error_sleep_time=0
  -o smtpd_soft_error_limit=1001
  -o smtpd_hard_error_limit=1000
  -o smtpd_client_connection_count_limit=0
  -o smtpd_client_connection_rate_limit=0
  -o receive_override_options=no_header_body_checks,no_unknown_recipient_checks,no_milters
  # Per Ubuntu 20.04+ e Postfix 3.4+, si può usare smtpd_authorized_xforward_hosts
  # per preservare l'IP originale del client se Amavis lo inoltra.
  # -o smtpd_authorized_xforward_hosts=127.0.0.0/8

# Servizio di pickup alternativo per Amavis (se Amavis è configurato per usarlo, es. porta 10026)
127.0.0.1:10026 inet n  -       n       -       -       smtpd
  -o content_filter=
  -o smtpd_authorized_xforward_hosts=127.0.0.0/8
  # ... altre opzioni simili al listener 10025 se necessario ...
}}}

{{{#!wiki note
Le numerose opzioni '''-o''' nel servizio `smtpd` per la `porta 10025` servono a disabilitare la maggior parte dei controlli e dei filtri di '''Postfix''' per le email che ritornano da Amavis, dato che sono già state processate. `permit_mynetworks,reject` assicura che solo '''Amavis''' (da 127.0.0.1) possa usare questo listener.
}}}

Dopo aver modificato `main.cf` e `master.cf`, ricaricare Postfix:{{{
sudo systemctl reload postfix
}}}

=== Test del Flusso di Posta e dei Filtri ===

Inviare un'email di test da un account esterno al proprio server di posta (a un utente del server). Controllare i log:
 * `/var/log/mail.log`: Mostrerà il percorso dell'email attraverso Postfix, la consegna ad Amavis (su porta 10024), la re-iniezione da Amavis a Postfix (su porta 10025), e la consegna finale a Dovecot.
 * Log di Amavis (spesso in `/var/log/mail.log` o `/var/log/syslog`, o configurabile in `/var/log/amavis.log`): Mostrerà i risultati della scansione di SpamAssassin e ClamAV.

Per testare !SpamAssassin, si può inviare un'email contenente la stringa di test GTUBE:{{{
XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X
}}} questa stringa, se presente nel corpo di un'email, dovrebbe farla classificare come spam da !SpamAssassin con un punteggio molto alto. L'email dovrebbe essere taggata (es. con ***SPAM*** nell'oggetto) o gestita secondo le regole impostate in Amavis ($sa_kill_level_deflt).

Per testare '''ClamAV''', si può inviare un'email con un file di test EICAR allegato. Il file EICAR è un file innocuo che tutti i software antivirus dovrebbero rilevare come virus di test. Creare un file eicar.com con il seguente contenuto:{{{
X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*
}}}

Inviare un'email con questo file come allegato. Amavis dovrebbe rilevarlo tramite ClamAV e bloccarlo o metterlo in quarantena.

Controllare gli header delle email ricevute. Dovrebbero esserci header X-Spam-Status, X-Spam-Level, X-Virus-Scanned aggiunti da Amavis, che indicano il risultato delle scansioni.

= Sicurezza dei Protocolli di Posta e Autenticazione =

La sicurezza è un aspetto fondamentale nella gestione di un server mail. Questa sezione tratterà la protezione delle comunicazioni tramite crittografia (TLS) e l'autenticazione sicura degli utenti (SASL).

== Crittografia TLS per SMTP, IMAP e POP3 ==

Transport Layer Security (TLS) e il suo predecessore SSL sono protocolli crittografici che forniscono comunicazioni sicure su una rete. È cruciale utilizzare TLS per proteggere:
 * Le credenziali di accesso degli utenti.
 * Il contenuto delle email durante il transito tra client e server, e tra server.

Per utilizzare TLS, sono necessari certificati SSL/TLS. Per un server di produzione, è **fortemente raccomandato** utilizzare certificati emessi da una Certificate Authority (CA) riconosciuta, come quelli gratuiti forniti da [Let's Encrypt](https://wiki.ubuntu-it.org/InternetRete/Server/LetsEncrypt). Assumiamo che si disponga di un certificato e di una chiave privata validi per il proprio nome host mail (es. `mail.example.com`).

=== Abilitare TLS in Postfix (per SMTP e Submission) ===

 0. Aprire `/etc/postfix/main.cf` per abilitare TLS:{{{
sudo nano /etc/postfix/main.cf
}}}
 0. Aggiungere o modificare le seguenti direttive. Sostituire i percorsi dei certificati con i propri (es. quelli di Let's Encrypt):{{{
# Impostazioni TLS Generali
# Livello di sicurezza per le connessioni SMTP in entrata (porta 25)
# 'may' permette TLS ma non lo richiede (opportunistic TLS).
# 'encrypt' richiede TLS per tutte le connessioni (può bloccare server remoti che non supportano TLS).
# 'dane' abilita la validazione DANE se configurata.
smtpd_tls_security_level = may

# Livello di sicurezza per le connessioni SMTP in uscita (quando Postfix è client)
smtp_tls_security_level = may # Per la compatibilità, 'may' è un buon inizio.
                               # 'dane' o 'verify' offrono maggiore sicurezza se il server remoto lo supporta.

# Percorsi ai file del certificato e della chiave del server
smtpd_tls_cert_file = /etc/letsencrypt/live/mail.example.com/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/mail.example.com/privkey.pem
smtpd_tls_dh1024_param_file = /etc/postfix/dhparams.pem # Generare se non esiste (vedi sotto)

# Log TLS (per debug)
smtpd_tls_loglevel = 1
smtp_tls_loglevel = 1

# Opzioni di sicurezza TLS
smtpd_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1 # Consentire solo protocolli moderni
smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
smtpd_tls_ciphers = high
smtpd_tls_mandatory_ciphers = high
smtpd_tls_exclude_ciphers = aNULL, eNULL, EXPORT, DES, RC4, MD5, PSK, aECDH, EDH-DSS-DES-CBC3-SHA, EDH-RSA-DES-CBC3-SHA, KRB5-DES, CBC3-SHA
smtpd_tls_eecdh_grade = strong # o ultra per curve più forti se supportate dai client
tls_high_cipherlist = ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
tls_preempt_cipherlist = yes

# Abilitare TLS per il servizio Submission (porta 587)
# Questo sarà configurato in master.cf per sovrascrivere le impostazioni globali.
}}}
 0. Generare i parametri Diffie-Hellman (se smtpd_tls_dh1024_param_file è specificato e il file non esiste):
  * Per 2048 bit (raccomandato):{{{
  sudo openssl dhparam -out /etc/postfix/dhparams.pem 2048
  }}}
  * Assicurarsi che il file sia leggibile solo da root:{{{
  sudo chmod 600 /etc/postfix/dhparams.pem
  }}}
 0. Ora, configurare il servizio Submission (porta 587) in `/etc/postfix/master.cf` per richiedere l'autenticazione SASL e forzare TLS:{{{
sudo nano /etc/postfix/master.cf
}}}
 0. Modificare o aggiungere la sezione submission:{{{
submission inet n       -       n       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt  # Richiede TLS per la submission
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_sasl_type=dovecot
  -o smtpd_sasl_path=private/auth
  -o smtpd_sasl_security_options=noanonymous
  -o smtpd_sasl_local_domain=$myhostname
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
  # -o smtpd_sender_restrictions=reject_sender_login_mismatch # Opzionale, lega mittente a utente SASL
  -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject_unauth_destination,reject
  -o milter_macro_daemon_name=ORIGINATING # Per i milter (es. Amavis, OpenDKIM)
}}}
 {{{#!wiki note
 Opportunistic TLS (porta 25) vs Mandatory TLS (porta 587):<<BR>>Sulla porta 25 (comunicazione server-to-server), TLS è solitamente "opportunistico" (smtpd_tls_security_level = may). Questo significa che se entrambi i server supportano TLS, la connessione verrà crittografata; altrimenti, avverrà in chiaro.<<BR>>Forzare TLS sulla porta 25 (encrypt) potrebbe impedire la ricezione di email da server più vecchi.<<BR>>Sulla porta 587 (Submission, client-to-server), TLS dovrebbe essere obbligatorio (encrypt) per proteggere le credenziali degli utenti.
 }}}
 0. Ricaricare Postfix:{{{
sudo systemctl reload postfix
}}}

=== Abilitare TLS in Dovecot (per IMAPS e POP3S) ===

Abbiamo già visto le basi per SSL/TLS in '''Dovecot''' nella sezione dedicata a Dovecot (`/etc/dovecot/conf.d/10-ssl.conf`). Ricapitoliamo:{{{
sudo nano /etc/dovecot/conf.d/10-ssl.conf
}}} Assicurarsi che:{{{
ssl = yes # o required per forzare solo connessioni SSL/TLS

# Percorsi ai certificati (sostituire con i propri)
ssl_cert = </etc/letsencrypt/live/mail.example.com/fullchain.pem
ssl_key = </etc/letsencrypt/live/mail.example.com/privkey.pem

# Protocolli minimi e cipher list (come già discusso)
ssl_min_protocol = TLSv1.2
# ssl_cipher_list = ... (consultare Mozilla SSL Config Generator)
# ssl_prefer_server_ciphers = yes
# ssl_dh = </etc/dovecot/dh.pem # Generare se necessario (vedi sotto)
}}} Se si usa `ssl_dh`, generare i parametri Diffie-Hellman per Dovecot (se non già fatto o se diversi da quelli di Postfix):
 * Per 4096 bit (raccomandato per Dovecot se supportato):{{{
sudo openssl dhparam -out /etc/dovecot/dh.pem 4096
}}}
 * Assicurarsi che il file sia leggibile:{{{
sudo chmod 644 /etc/dovecot/dh.pem
}}} O permessi più restrittivi se Dovecot gira come utente specifico
 {{{#!wiki note
 Se `ssl = yes` è impostato in '''Dovecot''', i servizi IMAPS (porta 993) e POP3S (porta 995) dovrebbero essere automaticamente disponibili. Se ssl = required, le porte non criptate (143, 110) accetteranno solo connessioni STARTTLS o verranno disabilitate a seconda di altre configurazioni (disable_plaintext_auth).
 }}}
 * Riavviare Dovecot:{{{
 sudo systemctl restart dovecot
 }}}

== Autenticazione SMTP (SASL) con Postfix e Dovecot ==

'''Simple Authentication and Security Layer (SASL)''' è un framework per fornire autenticazione e sicurezza dei dati nei protocolli di connessione. Verrà utilizzato per permettere agli utenti di autenticarsi con il server Postfix per inviare email.

Abbiamo già configurato le parti essenziali:
 * '''Dovecot''': Il servizio auth in `/etc/dovecot/conf.d/10-master.conf` fornisce un socket (`/var/spool/postfix/private/auth`) che Postfix può usare.
 * '''Postfix''':
  * In `/etc/postfix/main.cf`, le direttive smtpd_sasl_type = dovecot e smtpd_sasl_path = private/auth dicono a Postfix di usare il servizio SASL di Dovecot.
  * In `/etc/postfix/master.cf`, per il servizio submission (porta 587), abbiamo abilitato SASL (smtpd_sasl_auth_enable = yes) e specificato che solo gli utenti autenticati possono inviare (permit_sasl_authenticated).

Assicurarsi che l'utente postfix possa accedere al socket di autenticazione di Dovecot. I permessi (`mode = 0660`, `user = postfix`, `group = postfix`) sul listener `unix_listener /var/spool/postfix/private/auth` in `10-master.conf` di Dovecot dovrebbero essere corretti.

== Considerazioni sulla Sicurezza della Comunicazione Inter-Server (SMTP porta 25) ==

Mentre possiamo (e dovremmo) forzare TLS per le connessioni dai client al nostro server (Submission, IMAPS, POP3S), la comunicazione tra il nostro server e altri server mail su Internet (porta 25) è più complessa:
 * '''Opportunistic TLS''': Come menzionato, Postfix per default usa "opportunistic TLS" (smtp_tls_security_level = may per le connessioni in uscita, smtpd_tls_security_level = may per quelle in entrata). Questo significa che se l'altro server supporta STARTTLS, la connessione verrà crittografata. Altrimenti, avverrà in chiaro. Questo è lo standard attuale per la maggior parte del traffico email.
 * '''DANE''' (DNS-based Authentication of Named Entities): È una tecnologia più avanzata (RFC 6698) che usa record DNS (TLSA) per pubblicare informazioni sui certificati TLS. Se DANE è configurato e Postfix è impostato su smtp_tls_security_level = dane (o dane-only), Postfix verificherà il certificato del server remoto tramite DNS, offrendo una maggiore protezione contro attacchi man-in-the-middle. L'implementazione di DANE richiede un'infrastruttura DNSSEC.
 * '''MTA-STS''' (SMTP MTA Strict Transport Security): È uno standard più recente (RFC 8461) che permette ai domini di pubblicare policy che richiedono TLS per le email in entrata e specificano come i certificati devono essere validati.

Per la maggior parte delle configurazioni, iniziare con opportunistic TLS (may) è una scelta sicura e compatibile. L'adozione di DANE e MTA-STS è in crescita ma non ancora universale.

La vecchia guida menzionava la difficoltà di una PKI globale. Questo è ancora vero. Mentre TLS protegge il "canale" tra due server che comunicano, non garantisce l'autenticità del server remoto a meno che non si usino meccanismi come DANE o policy di verifica dei certificati più stringenti (che possono rompere la compatibilità).

La protezione del contenuto del messaggio end-to-end, indipendentemente dalla sicurezza del canale, è affrontata da tecnologie come GPG/OpenPGP o S/MIME, come discusso nella prossima sezione.

= Protezione dei Messaggi con GnuPG (GPG) =

Mentre TLS protegge la comunicazione tra client e server e tra server, non protegge il contenuto del messaggio ''end-to-end'' una volta che questo è memorizzato sui server o se un intermediario compromesso intercetta la comunicazione tra server che non usano TLS. Per garantire la confidenzialità (il messaggio può essere letto solo dal destinatario) e l'integrità/autenticità (il messaggio non è stato alterato e proviene effettivamente dal mittente dichiarato) del contenuto stesso dell'email, si può utilizzare la crittografia a chiave asimmetrica.

'''[[Sicurezza/GnuPg|GnuPG (GPG)]]''', l'implementazione GNU di OpenPGP, è lo strumento standard per questo scopo su sistemi Linux.

GPG è solitamente preinstallato sulle versioni moderne di Ubuntu. Se non lo fosse, si può [[AmministrazioneSistema/InstallareProgrammi/Apt|installare]] con:{{{
sudo apt install gpg
}}}

La maggior parte dei client di posta moderni (es. [[InternetRete/Messaggistica/Thunderbird|Thunderbird]] con l'estensione '''Enigmail/OpenPGP''', KMail, [[InternetRete/Messaggistica/Evolution|Evolution]]) offrono integrazione con '''GPG''' per semplificare la cifratura, decifratura e firma dei messaggi.

{{{#!wiki note
Per maggiori informazioni e una guida più dettagliata su ''''GnuPG''', consultare la pagina [[Sicurezza/GnuPg|GnuPg]]. Questa sezione fornisce un esempio pratico di base da riga di comando.
}}}

== Concetti Fondamentali ==

 * '''Coppia di Chiavi''': Ogni utente genera una coppia di chiavi:
  * '''Una chiave privata''', da conservare gelosamente e protetta da una passphrase robusta. Serve per decifrare i messaggi ricevuti e per firmare i messaggi inviati.
  * '''Una chiave pubblica''', da distribuire liberamente. Serve agli altri per cifrare i messaggi da inviargli e per verificare le firme apposte da lui.
 * '''Cifratura''': Per inviare un messaggio confidenziale a qualcuno, si cifra il messaggio con la chiave pubblica del destinatario. Solo il destinatario, con la sua chiave privata corrispondente, potrà decifrarlo.
 * '''Firma Digitale''': Per garantire autenticità e integrità, si firma un messaggio (o il suo hash) con la propria chiave privata. Chiunque abbia la chiave pubblica del mittente può verificare la firma.

== Esempio Pratico: Scambio di Messaggi Cifrati/Firmati ==

Supponiamo che l'utente `pippo@example.com` voglia scambiare messaggi protetti con `pluto@prova.edu`.

=== Generazione della Coppia di Chiavi (da fare per entrambi gli utenti) ===

L'utente pippo genera la sua coppia di chiavi, digitare nel [[AmministrazioneSistema/Terminale|terminale]] il seguente comando:{{{
gpg --full-generate-key
}}}

'''GPG''' guiderà attraverso una serie di domande:
 * '''Tipo di chiave''': Scegliere l'opzione predefinita (es. "RSA and RSA" o "ECC and ECC"). Gli algoritmi moderni come RSA (con lunghezza di chiave di almeno 3072 o 4096 bit) o EdDSA (es. Ed25519 per la firma) e Curve25519 (per la cifratura) sono raccomandati. La vecchia guida menzionava ElGamal, che è meno comune oggi.
 * '''Dimensione della chiave''': Per RSA, scegliere almeno 3072 bit, preferibilmente 4096.
 * '''Durata di validità della chiave''': Si può impostare una scadenza o scegliere che non scada.
 * '''Nome reale''', '''indirizzo email''', '''commento''': Inserire le informazioni richieste. L'indirizzo email dovrebbe corrispondere a quello che si userà per la posta.
 * '''Passphrase''': Scegliere una passphrase robusta per proteggere la chiave privata.

L'utente `pluto` eseguirà lo stesso comando per generare la propria coppia di chiavi.

=== Visualizzare le Chiavi ===

 * Per visualizzare le chiavi pubbliche nel proprio portachiavi (keyring):{{{
gpg --list-keys
}}}
 * Per visualizzare le chiavi private:{{{
gpg --list-secret-keys
}}}

=== Esportare e Scambiare le Chiavi Pubbliche ===

`pippo` esporta la sua chiave pubblica:{{{
gpg --export --armor -o pippo-pubkey.asc pippo@example.com
}}} L'opzione `--armor` crea un output testuale ASCII (formato Radix-64), facile da scambiare. `pippo-pubkey.asc` conterrà la chiave pubblica.<<BR>>`pippo` deve inviare questo file `pippo-pubkey.asc` a `pluto` (es. come allegato email, o tramite un keyserver pubblico).

Allo stesso modo, `pluto` esporterà la sua chiave pubblica (`pluto-pubkey.asc`) e la invierà a pippo.

{{{#!wiki note
'''Keyserver Pubblici''': Esistono server pubblici (es. keys.openpgp.org, keyserver.ubuntu.com) dove gli utenti possono caricare le proprie chiavi pubbliche e da cui altri possono scaricarle.<<>BR>>Per inviare una chiave a un keyserver: `gpg --send-keys <ID_CHIAVE>`.<<BR>>Per ricevere una chiave da un keyserver: `gpg --recv-keys <ID_CHIAVE>`.<<BR>><<BR>>L'uso dei keyserver semplifica lo scambio di chiavi ma richiede attenzione alla verifica dell'autenticità della chiave scaricata (vedi Web of Trust o fingerprint).
}}}

=== Importare la Chiave Pubblica del Destinatario ===

`pippo` importa la chiave pubblica di `pluto` (supponendo abbia ricevuto il file `pluto-pubkey.asc`):{{{
gpg --import pluto-pubkey.asc
}}}
Dopo l'importazione, è buona norma verificare il fingerprint della chiave con pluto attraverso un canale sicuro (es. telefono, di persona) per assicurarsi che la chiave sia autentica e non manomessa, e poi firmarla localmente per indicare che ci si fida di essa:{{{
gpg --fingerprint pluto@prova.edu
}}} Dopo la verifica del fingerprint:{{{
gpg --edit-key pluto@prova.edu
}}} Dentro il prompt di gpg, digitare 'sign' e seguire le istruzioni, poi 'save'.

Anche pluto importerà e verificherà/firmerà la chiave pubblica di pippo.

=== Cifrare e Firmare un Messaggio (Pippo invia a Pluto) ===

`pippo` vuole inviare il contenuto del file `messaggio.txt` a `pluto`, cifrandolo e firmandolo:{{{
-s o --sign: Firma il messaggio.
-e o --encrypt: Cifra il messaggio.
-r pluto@prova.edu o --recipient pluto@prova.edu: Specifica il destinatario (GPG userà la sua chiave pubblica per cifrare).
-a o --armor: Crea un output testuale ASCII.
-o messaggio-protetto.asc: Specifica il file di output.
gpg --sign --encrypt --armor -r pluto@prova.edu -o messaggio-protetto.asc messaggio.txt
# Alternativa più breve: gpg -sea -r pluto@prova.edu -o messaggio-protetto.asc messaggio.txt
}}}
`pippo` ora può inviare il file `messaggio-protetto.asc` (o il suo contenuto) a `pluto@prova.edu`.

=== Decifrare e Verificare un Messaggio (Pluto riceve da Pippo) ===

`pluto` riceve `messaggio-protetto.asc` e lo decifra:{{{
-d o --decrypt: Decifra il messaggio.
-o messaggio-originale.txt: Specifica il file di output per il contenuto decifrato.
gpg --decrypt -o messaggio-originale.txt messaggio-protetto.asc
}}}
'''GPG''' chiederà a `pluto` la passphrase della sua chiave privata per decifrare il messaggio.
Durante la decifratura, GPG verificherà automaticamente anche la firma. L'output mostrerà:{{{
gpg: Good signature from "Pippo <pippo@example.com>"
}}}
Se la firma è valida, significa che il messaggio proviene effettivamente da pippo e non è stato alterato.
Se la firma fosse non valida (messaggio alterato o chiave del mittente errata), GPG mostrerebbe:{{{
gpg: BAD signature from "Pippo <pippo@example.com>"
}}}
Il contenuto decifrato sarà in `messaggio-originale.txt`.

Questo esempio illustra l'uso da [[AmministrazioneSistema/Terminale|riga di comando]]. I client di posta elettronica con integrazione GPG automatizzano gran parte di questi passaggi, rendendo il processo più trasparente per l'utente finale.

= Ulteriori risorse =

 * [[http://www.postfix.org/|Sito ufficiale del progetto Postfix]]
 * [[http://www.dovecot.org/|Sito ufficiale del progetto Dovecot]]
 * [[http://www.squirrelmail.org/|Sito ufficiale del progetto SquirrelMail]]
 
----
##CategoryServer
CategoryHomepage CategoryNuoviDocumenti