Server di Posta · 4 min read · Oct 13, 2025

Impostare un server di posta utilizzando Exim4, Clamav, Dovecot, SpamAssassin e molti altri su Debian Lenny

Impostare un server di posta utilizzando Exim4, Clamav, Dovecot, SpamAssassin e molti altri su Debian

Questo howto descrive un modo per costruire una piattaforma di posta scalabile, sicura e completa. Offre hosting virtuale di cassette postali in formato maildir con supporto per quote e filtraggio lato server, alias di dominio, alias di indirizzo, inoltro di indirizzi, indirizzi catchall. Il relaying è protetto con STARTTLS e SMTP-AUTH. Le email in arrivo vengono controllate per virus, spam e verificate contro la politica SPF e DNSBL.

Per raggiungere la scalabilità, la configurazione sarà suddivisa su 3 server:

  • 1 server MX, dove si trovano la maggior parte delle funzionalità di sicurezza (faramir.middle.earth)
  • 1 relay SMTP, per consentire agli utenti di inviare email al mondo esterno (ectelion.middle.earth)
  • 1 server Mailstore, dove si trova la cassetta postale (denetor.middle.earth)

Naturalmente, possono essere aggiunti più MX utilizzando i record DNS MX per i tuoi domini, più server di relay possono essere aggiunti utilizzando il round-robin DNS e più mail store possono essere aggiunti utilizzando i meccanismi descritti in questo howto. All’opposto, puoi facilmente unire la parte MX e quella del relay, o la parte del relay e quella del mailstore. Unire MX e mailstore comporta alcune modifiche.

Nota preliminare

In questo howto presumeremo che tu abbia un server Debian funzionante. Inoltre, si suppone che sudo sia installato sui sistemi e che tu debba essere un sudoer.

Configurazione di LDAP

Le informazioni degli utenti saranno memorizzate in una directory LDAP. Qui installeremo LDAP sul server di relay.

Prima di tutto, installiamo i pacchetti necessari:

 sudo apt-get install slapd ldap-utils

Per il tutorial utilizzeremo i seguenti parametri LDAP:

ldapBase: dc=middle,dc=earth

adminDn: cn=admin,dc=middle,dc=earth

adminPwd: thirdAge

Inoltre, utilizzeremo uno schema LDAP specifico. La maggior parte degli attributi e degli oggetti sono standard, tranne uno o due. Attenzione: poiché ci sono molti attributi standard, dovrai assicurarti che nessuno di essi sia definito due volte.

Quindi aggiungiamo lo schema in openldap in /etc/ldap/schema/mailMEO.schema:

 attributetype ( 2.16.840.1.113730.3.1.13   
   NAME 'mailLocalAddress'   
   DESC 'Indirizzo email RFC822 di questo destinatario'   
   EQUALITY caseIgnoreIA5Match   
   SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} )   

attributetype ( 2.16.840.1.113730.3.1.16   
   NAME 'mailQuota'   
   DESC 'Quantità massima di spazio su disco per una cassetta postale in kilobyte'   
   EQUALITY integerMatch   
   SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )   

attributetype ( 2.16.840.1.113730.3.1.18   
   NAME 'mailHost'   
   DESC 'FQDN del SMTP/MTA di questo destinatario'   
   EQUALITY caseIgnoreIA5Match   
   SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256}   
   SINGLE-VALUE )   

attributetype ( 2.16.840.1.113730.3.1.22   
   NAME 'mailCopyAddress'   
   DESC 'Indirizzo di copia shadow RFC822'   
   EQUALITY caseIgnoreIA5Match   
        SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} )   

attributetype ( 2.16.840.1.113730.3.1.47   
   NAME 'mailRoutingAddress'   
   DESC 'Indirizzo di routing RFC822 di questo destinatario'   
   EQUALITY caseIgnoreIA5Match   
   SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} )   

attributetype ( 2.16.840.1.113730.3.1.49   
   NAME 'spamassassinUserPrefs'   
   DESC 'Preferenze utente di SpamAssassin'   
   EQUALITY caseIgnoreIA5Match   
   SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} )   

objectclass ( 2.16.840.1.113730.3.2.147   
   NAME 'inetLocalMailRecipient'   
   DESC 'Destinatario di posta locale Internet'   
   SUP top AUXILIARY   
   MAY   ( mailLocalAddress $ mailHost $ mailRoutingAddress $ mailCopyAddress $ mailQuota $ spamassassinUserPrefs ) )   
 
objectclass ( 2.16.840.1.113730.3.2.148   
   NAME 'inetMailForwarder'   
   DESC 'Indirizzo di inoltro di posta Internet'   
   SUP top AUXILIARY   
   MAY   ( mailHost $ mailRoutingAddress ) )

Poi assicurati di aggiungere lo schema necessario in /etc/ldap/slapd.conf:

...  
include /etc/ldap/schema/inetorgperson.schema  
include /etc/ldap/schema/mailMEO.schema  
...

… e controlla il suffisso (debconf dovrebbe averlo già configurato quando hai installato slapd):

suffix          "dc=middle,dc=earth"

Ora aggiungiamo alcune ACL di cui i demoni avranno bisogno per collegarsi a LDAP.

Un accesso in sola lettura all’attributo userPassword per dovecot:

access to attrs=userPassword,shadowLastChange   
        by dn="cn=admin,dc=middle,dc=earth" write   
        by dn="uid=dovecot,dc=middle,dc=earth" read   
        by anonymous auth   
        by self write   
        by * none

Un accesso in sola lettura ad altri attributi per exim e dovecot:

access to *   
        by dn="cn=admin,dc=middle,dc=earth" write   
        by dn="uid=dovecot,dc=middle,dc=earth" read   
        by dn="uid=exim,dc=middle,dc=earth" read   
        by * read   
        by anonymous none

L’ultima ACL disabilita le letture anonime ma consente la lettura (ricerca) per ogni utente autenticato, cosa che potresti non voler.

Possiamo ora riavviare slapd affinché le modifiche abbiano effetto:

sudo /etc/init.d/slapd restart

Dobbiamo creare gli utenti delle ACL precedenti. Per farlo utilizzeremo il seguente file user.ldif:

dn: uid=exim,dc=middle,dc=earth  
objectClass: account  
objectClass: simpleSecurityObject  
objectClass: top  
uid: exim  
userPassword:: e01ENX1hOElTeXAwV2hnVzFSVnhHd0hCNDF3PT0=  
  
dn: uid=dovecot,dc=middle,dc=earth  
objectClass: account  
objectClass: simpleSecurityObject  
objectClass: top  
uid: dovecot  
userPassword:: e01ENX1yZGp2Q1lPNmtDRm1scXAyVWQwa0xBPT0=

L’utente/password sono:

dovecot/dovecotpopper
exim4/eximmta 

Per alimentare la directory digita:

ldapadd -x -D cn=admin,dc=middle,dc=earth -W < users.ldif

Ecco un altro file ldif che contiene dati di esempio (attenzione, questo campione contiene indirizzi IP che non si adattano alla tua configurazione, cambiali manualmente):

dn: ou=domains,dc=middle,dc=earth  
objectClass: organizationalUnit  
objectClass: top  
ou: domains  
  
dn: dc=middle.earth,ou=domains,dc=middle,dc=earth  
dc: middle.earth  
objectClass: dNSDomain  
objectClass: top  
objectClass: inetLocalMailRecipient  
objectClass: domainRelatedObject  
objectClass: posixAccount  
mailLocalAddress: [email protected]  
cn: catchall  
gidNumber: 8  
homeDirectory: /var/mail/middle.earth/c/catchall  
uid: catchall  
uidNumber: 8  
userPassword:: e01ENX1EV3RteGErOFROanJKNUFXZWt1Z0tBPT0=  
mailQuota: 102400  
mailHost: denetor.middle.earth  
associatedDomain: middle.earth  
associatedDomain: lotr.middle.earth  
  
dn: uid=sam,dc=middle.earth,ou=domains,dc=middle,dc=earth  
cn: sam  
displayName: Sam Gamji  
gidNumber: 8  
homeDirectory: /var/mail/middle.earth/s/sam  
mail: [email protected]  
mailHost: 172.16.16.23  
mailQuota: 102400  
objectClass: inetLocalMailRecipient  
objectClass: inetOrgPerson  
objectClass: posixAccount  
objectClass: top  
sn: Gamji  
uidNumber: 8  
uid: sam  
userPassword:: e01ENX1NeVV5M1BxaHkvWWVLaVpyMXlOaExBPT0=  
mailLocalAddress: [email protected]  
mailLocalAddress: [email protected]  
mailLocalAddress: [email protected]  
  
dn: uid=frodo,dc=middle.earth,ou=domains,dc=middle,dc=earth  
cn: frodo  
displayName: Frodo Baggins  
gidNumber: 8  
givenName: Frodo  
homeDirectory: /var/mail/middle.earth/f/frodo  
mail: [email protected]  
mailHost: 172.16.16.23  
mailQuota: 102400  
objectClass: inetLocalMailRecipient  
objectClass: inetOrgPerson  
objectClass: posixAccount  
objectClass: top  
sn: Baggins  
uidNumber: 8  
uid: frodo  
userPassword:: e01ENX04UGlDRHVnWEdCMmNhRktnbDljTmpRPT0=  
mailLocalAddress: [email protected]  
mailLocalAddress: [email protected]  
mailLocalAddress: [email protected]  
  
dn: uid=gmail,dc=middle.earth,ou=domains,dc=middle,dc=earth  
cn: gmail  
mail: [email protected]  
mailHost: 172.16.16.23  
mailRoutingAddress: [email protected]  
objectClass: inetMailForwarder  
objectClass: inetOrgPerson  
objectClass: top  
sn: alias to Gmail address  
uid: gmail
Share: X/Twitter LinkedIn

Ricevi i nuovi post nella tua casella di posta.

Nessuno spam. Disiscriviti in qualsiasi momento.