Server mail base: Postfix Dovecot e MySql

Da Guide@Debianizzati.Org.
Vai alla navigazione Vai alla ricerca
Edit-clear-history.png Attenzione. Questa guida è da considerarsi abbandonata, per via del tempo trascorso dall'ultima verifica.

Potrà essere resa obsoleta, previa segnalazione sul forum, se nessuno si propone per l'adozione.


Debian-swirl.png Versioni Compatibili

Debian 6 "squeeze"

Introduzione

Prima di mettere in piedi un server mail, è necessario valutare l'architettura di cui abbiamo bisogno e poi fare la cernita tra i vari pacchetti disponibili, equivalenti e non che concorrono all'installazione del servizio globale di mailing.

Come potrete immaginare, un server mail non è un software ma è un castello di servizi che noi edifichiamo secondo le nostre esigenze o capacità. Ciò ci dà la massima flessibilità e libertà ma al contempo crea spesso confusione, incertezze, dubbi e difficoltà di installazione. Infine in Rete si trovano infinite e differenti documentazioni che, cercandole di adattare alle nostre varianti, spesso ci portano ad errori.

In questa pagina voglio esporre in modo completo (dalla A alla Z) una delle tante possibili configurazioni per creare un server mail. Le peculiarità salienti di questa architettura sono:

* servizio IMAP per la lettura delle email
* configurazione dinamica di utenti, forward, domini tramite immagazzinamento dati su un Database (mySql)
* gestione email per più domini

Se soltanto una di queste peculiarità differisce dalle tue necessità, ti consiglio di valutare e leggere altre documentazioni complete e pensate per altri scopi, in modo da non trovarti servizi e pacchetti inutili e problemi di configurazione nel caso in cui non conoscessi bene i software in uso.

Requisiti iniziali

Sulla macchina è installa una versione GNU/Linux Debian (testato su Debian 6.0 a 64 bit)

La macchina è predisposta per essere un server [LAMP ], ma per chi non ne avesse la necessità è sufficiente l'installazione del server MySQl

Per eseguire la guida bisogna avere i permessi di root

Bulb.png Suggerimento
Nelle mie guide utilizzo preferenzialmente l'editor testuale vi, ma vi lascio la libertà di poter scegliere quello che preferite: una ragione in più per porre attenzione ai copia e incolla dei comandi ;-)


Installazione

Per l'installazione dei pacchetti eseguire il comando:

 aptitude install postfix-mysql dovecot-imapd

Se sulla macchina c'era installato il predefinito Exim4, non preoccupatevi perché ci penserà Postfix a rimuoverlo. Postfix-mysql è una variante del classico Postfix in quanto fornisce il supporto per la connessione al database MySQL.

Durante l'installazione compariranno alcune schermate alle quali risponderemo in questo modo: Tipo di configurazione di mail server preferita rispondiamo: “sito internet con smarthost” Si tratta di inviare la posta in uscita ad un altro mail server (quello del nostro provider per esempio)

 Mail name: inseriamo il nome del nostro dominio ovvero quello che va dopo la chiocciola per esempio: miodominio.org
 Relayhost: indichiamo l'indirizzo smtp del server dove vogliamo inviare la posta, per esempio: smtp.dominioprovider.com

Tutte le impostazioni si possono fare direttamente nel file principale: /etc/postfix/main.cf


Creazione del database

A questo punto è necesasartio preparare il database che ospiterà tutti i dati. Il nome assegnato al database è mailserver, ma non è assolutamente vincolante, ergo potete assegnare il nome che volete, facendo però attenzione a modificare le istruzioni qui riportate.

Entrare nella shell di mysql (mysql -u root -p):

 mysql --user=root --password=mettere_password

Effettuato il login con i privilegi necessari e dalla console di MySQL creiamo il database:

 mysql>  CREATE DATABASE mailserver DEFAULT CHARSET utf8;

Ora passiamo alla prima tabella destinata a memorizzare gli account utente virtuali. Nel nostro caso indirizzo email e nome utente coincideranno, come sono soliti fare gli ISP. Selezioniamo il database

 mysql> use mailserver

Creiamo la table

 mysql> CREATE TABLE `users` (
    `email` varchar(200) NOT NULL,
   `password` varchar(128) NOT NULL,
   `Status` enum('DISABLE','ENABLE') NOT NULL  default 'ENABLE',
   `created` timestamp NOT NULL default '0000-00-00 00:00:00',
   `updated` timestamp NOT NULL default CURRENT_TIMESTAMP on update    CURRENT_TIMESTAMP,
   `type` enum('NORMAL','SYSTEM') NOT NULL default 'NORMAL',
   PRIMARY KEY  (`email`)
  ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Mailbox virtuali';


Notate il campo active, potremo utilizzarlo come flag per disattivare un utente senza eliminare le informazioni relative alla sua casella di posta. Proseguiamo con la successiva tabella destinata a contenere i domini per i quali il nostro server sarà abilitato a ricevere posta. Non dimenticate di far puntare al suo indirizzo IP i corrispondenti record MX dei DNS.

 mysql> CREATE TABLE `domains` (
     `domain` varchar(200) NOT NULL,
     `Status` enum('DISABLE','ENABLE') NOT NULL  default 'ENABLE',
     `created` timestamp NOT NULL default '0000-00-00 00:00:00',
     `updated` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
     PRIMARY KEY  (`domain`)
   ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Domini virtuali';

Passiamo ora alla creazione della tabella degli forward, dove il campo "source" conterrà l'alias mentre "destination" la casella email verso cui verrà effettuata la ridirezione:

 mysql> CREATE TABLE `forward` (
   `source` varchar(200) NOT NULL,
   `destination` varchar(200) NOT NULL,
   `Status` enum('DISABLE','ENABLE') NOT NULL  default 'ENABLE',
   `created` timestamp NOT NULL default '0000-00-00 00:00:00',
   `updated` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
   PRIMARY KEY  (`source`)
   ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Tabella dei Forward' ;

Terminiamo creando un utente che consentirà a Postfix di agire sul database:

 mysql> GRANT SELECT, INSERT, UPDATE, DELETE ON mailserver.* TO postfix@localhost IDENTIFIED BY 'postfix_password'; 

Aggiorniamo i privilegi

 mysql> FLUSH PRIVILEGES;

Usciamo dalla sessione di mysql

 mysql> quit


Preparazione della destinazione delle email

Come vedremo meglio più avanti, in fase di configurazione, ci proponiamo di gestire le email in formato maildir. Dobbiamo però considerare che i nostri utenti sono virtuali, esistono solo in database e quindi non posseggono una home directory. Gestiremo tutto con un unico utente che chiameremo vmail, appartenente al gruppo vmail e con home directory in /home/vmail:

 groupadd -g 5000 vmail
 useradd -g vmail -u 5000 vmail -d /home/vmail -m  -s /sbin/nologin
 chgrp postfix /home/vmail

Vogliamo memorizzare la posta per l'account test@miodominio.com in un percorso di questo tipo: /home/vmail/miodominio.com/test. In questo modo ciascun dominio avrà una propria directory al cui interno troveranno posto solo le directory relative ai suoi account. Con quest'accortezza la gestione di un server multidominio risulterà molto più semplice. Infine, per permettere a Postfix di operare, abbiamo assegnato la directory /home/vmail al gruppo postfix.


Postfix e MySQL

Per poter gestire la posta di più domini, è necessario definire, oltre al dominio locale (indicato nella direttiva mydestination del file di configurazione /etc/postfix/main.cf), anche i cosiddetti domini virtuali, che corrispondono ai domini che dovremo gestire. A questo punto, è utile distinguere i domini locali dai domini virtuali: nel nostro caso, abbiamo un dominio locale in cui, ad ogni utente creato sul sistema, corrisponde una casella di posta elettronica. L’utilizzo dei domini virtuali ci consente di definire degli indirizzi di posta con dominio diverso da quello locale, che vengono mappati sulla corrente macchina come casella di posta elettronica locale definiti alias virtuali.

NB: In sostanza i domini virtuali mappati nel database DEVONO essere diversi dal dominio locale del sistema.


Domini

Nella directory /etc/postfix, creiamo un file di nome mysql-domains.cf.

 vi /etc/postfix/mysql-domains.cf

Tale file servirà ad accedere alla tabella domains, precedentemente creata, per verificare se Postfix sia autorizzato a ricevere posta per il dominio in oggetto. Ricordo che dovremo aver preventivamente configurato i DNS perché i record MX del dominio puntino al nostro server. Inseriamo in mysql-domains.cf le seguenti istruzioni:

 user = postfix
 password =  postfix_password
 dbname = mailserver
 query = SELECT domain AS virtual FROM domains WHERE domain='%s'
 hosts = 127.0.0.1

La sintassi è molto semplice: con le prime tre righe indichiamo a Postfix le credenziali (user e password) ed il database a cui collegarsi. La quarta riga rappresenta la query di selezione vera e propria. Questa potrebbe essere facilmente personalizzata per aggiungere funzionalità come il controllo di un flag di stato del record. L'ultima riga indica l'host su cui gira MySQL, in questo caso l'host locale. Se il database si trovasse su una macchina diversa basterebbe scrivere il corrispondente numero IP.


Utenti

Nella directory /etc/postfix, creiamo un file di nome mysql-users.cf

 vi /etc/postfix/mysql-users.cf

All'interno del file inseriamo il seguente testo:

 user = postfix
 password = postfix_password
 dbname = mailserver
 query = SELECT CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/') FROM users WHERE email='%s' AND status='ENABLE' 
 hosts = 127.0.0.1

La funzione SUBSTRING_INDEX permette di suddividere una stringa in sottostringhe utilizzando un carattere come separatore, nel nostro caso "@". Supponendo che l'indirizzo email sia test@miazienda.it SUBSTRING_INDEX(email,'@',-1) corrisponderà a miazienda.it mentre SUBSTRING_INDEX(email,'@',1) a test. Il risultato della query sarà il percorso miazienda.it/test/ ed rappresenterà il percorso dove verranno salvate le email dell'utente in questione. Questo ci permetterà di gestire facilmente molti domini isolandoli e raggruppando i rispettivi account.


Forward o Alias

Questa tabella conterrà gli alias, ovvero quegli indirizzi email che saranno girati automaticamente ad un altro account email. Nella directory /etc/postfix, creiamo i seguenti due file:

 vi /etc/postfix/mysql-aliases.cf

All'interno del file inseriamo il seguente testo:

 user = postfix
 password = postfix_password
 dbname = mailserver
 query = SELECT destination FROM forward WHERE source='%s'
 hosts = 127.0.0.1

Creiamo il secondo file:

 vi /etc/postfix/mysql-email2email.cf

All'interno del file inseriamo il seguente testo:

 user = postfix
 password = postfix_password
 dbname = mailserver
 query = SELECT email FROM users WHERE email='%s' AND status='ENABLE'
 hosts = 127.0.0.1

Permessi

Infine modifichiamo i permessi su tutti i file appena creati:

 chmod 640 /etc/postfix/mysql-*.cf
 chown root:postfix /etc/postfix/mysql-*.cf


Configuriamo Postfix

Ora, dovremo aprire e modificare /etc/postfix/main.cf, il file di configurazione principale di Postfix. Di seguito le istruzioni fondamentali da inserire nel file di configurazione corredate da commenti, evidenziate le parti principali:


 # Debian specific:  Specifying a file name will cause the first
 # line of that file to be used as the name.  The Debian default
 # is /etc/mailname.
 myorigin = /etc/mailname
 myhostname = miodominio.it
 mydestination = localhost
 
 smtpd_banner = $myhostname ESMTP $mail_name (storiaccia)
 biff = no
 
 # appending .domain is the MUA's job.
 append_dot_mydomain = no
 
 # Uncomment the next line to generate "delayed mail" warnings
 #delay_warning_time = 4h
 
 readme_directory = no
 
 # TLS parameters
 smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
 smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
 smtpd_use_tls=yes
 smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
 smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
 
 #impostare l'alias privo di NIS
 alias_maps = hash:/etc/aliases
 
 #mailbox_size_limit = 0
 #recipient_delimiter = +
 
 #utilizzare tutte le interfacce di rete
 inet_interfaces = all
 
 #SMTP esterno per invio email con autenticazione
 relayhost = mail.191.biz
 #autenticazione con l'SMTP esterno
 smtp_sasl_password_maps=hash:/etc/postfix/sasl_password
 smtp_sasl_auth_enable=yes
 smtp_sasl_mechanism_filter=plain,login
 smtp_sasl_security_options = noanonymous
 soft_bounce=yes
 
 #limito le notifiche BOUNCE a un massimo di byte
 bounce_size_limit = 2000
 
 #impostazioni catch-all: destinazione email con destinatario sconosciuto
 luser_relay = /dev/null
 
 #gli indirizzi IP autorizzati a spedire messaggi
 #mynetworks = 192.168.2.0/24, 127.0.0.0/8
 #abilito esclusivamente l'invio dal server stesso (ad esempio web mail)
 mynetworks = 127.0.0.0/8
 
 #le direttive necessarie ad utilizzare MySQL
 virtual_alias_maps = mysql:/etc/postfix/mysql-aliases.cf, mysql:/etc/postfix/mysql-email2email.cf
 virtual_mailbox_domains = mysql:/etc/postfix/mysql-domains.cf
 virtual_mailbox_maps = mysql:/etc/postfix/mysql-users.cf
 
 #l'utente con cui postfix deve operare
 #ovvero vmail che avevamo creato
 virtual_uid_maps = static:5000
 virtual_gid_maps = static:5000
 
 #la directory base da utilizzare per la posta
 virtual_mailbox_base = /home/vmail
 virtual_create_maildirsize = yes
 virtual_mailbox_extended = yes
 
 #massima dimensione di una casella
 #virtual_mailbox_limit = 512000000
 
 #alcune restrizioni di sicurezza sull'SMTP
 #la seconda e' commentata per possibili
 #problemi su pc win con outlook(!!)
 smtpd_helo_required = yes
 #smtpd_helo_restrictions = reject_invalid_hostname, reject_unknown_hostname
 smtpd_recipient_restrictions = permit_mynetworks, reject_unauth_destination, reject_non_fqdn_sender, reject_non_fqdn_recipient, reject_unknown_recipient_domain, reject_invalid_hostname, reject_unknown_sender_domain, reject_unauth_pipelining
 
 #le tabelle di lookup cui il server proxymap puo' accedere
 proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks
 
 #MMM aumento email size massima accettata a 20 Mb (default=10Mb) 
 message_size_limit = 20480000

Ovviamente le opzioni di configurazione utilizzabili sono molte di più ed uno sguardo alla documentazione risulterà sicuramente consigliabile.

Verificare che nel file /etc/mailname sia presente il dominio principale:

 miodominio.it


Registrazione dati per l'autenticazione con il relayhost esterno

NB: Se non utilizzate un relayhost per inviare le email, saltate questo capitolo. Adesso bisogna inserire lo user e la password per l'autenticazione con il server SMTP esterno.

 vi /etc/postfix/sasl_password

All'interno di questo file, scrivere l'indirizzo host, come specificato in relayhost del file main.cf, seguito dallo user:password validi per l'autenticazione con tale host. Aggiungendo una riga simile a questa:

 mail.191.biz username:password

Generiamo il postfix lookup table, con il seguente comando:

 postmap hash:/etc/postfix/sasl_password

Verifichiamo che la table sia stata creata correttamente con il seguente comando:

 postmap -q mail.191.biz /etc/postfix/sasl_password

Adesso, per ragioni di sicurezza, possiamo cancellare il file di generazione:

 rm /etc/postfix/sasl_password


Verifica invio all'esterno delle email

Riavviamo il servizio postfix

 service postfix reload

Inviare un'email test a una propria casella email:

 mail -s 'test funzionamento' prova@dominio.it 

Verificare i log per eventuali problemi:

 tail -f /var/log/mail.log


Verifica impostazioni in master.cf

Infine per sicurezza controllate che nel file /etc/postfix/master.cf il flag chroot sia impostato a n per tutti i programmi elencati.


Configuriamo Dovecot

Prima di creiamo/modifichiamo il file:

 vi /etc/dovecot/dovecot-sql.conf

All'interno del file scriviamo il seguente testo:

 driver=mysql
 default_pass_scheme = MD5
 connect= host=127.0.0.1 port=3306 dbname=mailserver user=postfix password=postfix_password
 password_query = SELECT password FROM users where email='%u' AND status='ENABLE'
 user_query = SELECT '/home/vmail/%d/%n' AS home, 'maildir:/home/vmail/%d/%n' AS mail, 5000 AS uid, 5000 AS gid FROM users WHERE email='%u' AND status='ENABLE'
 Si intuisce dalla sintassi che %u rappresenta l'indirizzo email completo (test@miazienda.it), %d il dominio (miazienda.it), %n il  nome (test). 

Adesso impostiamo il file di configurazione

 vi /etc/dovecot/dovecot.conf

con questi principali parametri:

 #protocolli abilitati
 protocols = imap imaps
 #operazioni di log
 log_path =/var/log/dovecot.log
 info_log_path =/var/log/dovecot.log
 #posizione della mailbox 
 mail_location = maildir:/home/vmail/%d/%n
 #range degli utenti validi
 #mettiamo l'uid di vmail
 first_valid_uid = 5000
 protocol imap {
  #configurazioni specifiche di imap
 }
 #autenticazione
 auth default {
   mechanisms = DIGEST-MD5
   passdb sql {
    # percorso del file di configurazione
    # con la query sql per la password
    args = /etc/dovecot/dovecot-sql.conf
  }
 user = mysql
 userdb sql {
     # percorso del file di configurazione
     # con la query sql per l'utente  
     args = /etc/dovecot/dovecot-sql.conf
   }
 }


Testiamo la configurazione

Per eseguire i test disabilitiamo eventuali servizi di firewall!!

Postfix

A questo punto facciamo qualche prova per vedere se tutto funziona. Avviamo Postfix e controlliamo i messaggi nel file di log:

 service postfix start
 tail -f /var/log/mail.log

Se c'è qualche problema correggiamolo interpretando i messaggi ricevuti. Per far rileggere a Postfix il file di configurazione digitiamo semplicemente postfix reload.

Per controllare che Postfix è installato correttamente, fate un telnet alla porta 25 di localhost (hostname dov'è installato postfix).

 telnet localhost 25

Se tutto va bene, dovreste leggere un messaggio di benvenuto simile a questo:

   Trying 127.0.0.1...
   Connected to localhost.localdomain.
   Escape character is '^]'.
   220 pippo.linux.it ESMTP Postfix (Postfix)

NB: per uscire da telnet, digitare il comando quit


Server imap

Da terminale dare il comando

 telnet localhost imap

se compare una scritta del tipo:

 Trying 127.0.0.1...
 Connected to localhost.
 Escape character is '^]'.
 * OK [CAPABILITY IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA IDLE ACL ACL2=UNION   STARTTLS] Courier-IMAP ready. Copyright 1998-2004 Double Precision, Inc.  See COPYING for distribution information.

Significa che il servizio è attivo e funzionante. Ora testiamo se riusciamo a effettuare il login dello user creato per leggere la mail:

 a login user password_clear

Per uscire digitare:

 a logout

Se non effettua il login verificare se è stata attivata l'autenticazione della password in chiaro e che la maildir specifica dello user è corretta, esistente e con i giusti permessi.

Una volta fatta l'autenticazione da telnet possiamo dare i seguenti comandi per fare ulteriori verifiche:

 a list “inbox” “*” (visualizza le sottocartelle dell'inbox)
 a examine inbox  (esamina la cartella)

Inviamo un'email di prova

A questo punto il funzionamento di base è testato non resta che cominciare ad inviare qualche email al server, sia all'account reale che all'alias, verificandone la corretta consegna. Inizialmente proviamo in locale con il comando mail:

 mail -s 'test funzionamento' test@miazienda.it

Dopo aver digitato il comando mail premiamo invio, poi scriviamo un messaggio di prova e con CRTL + d indichiamo che l'immissione di testo è terminata, un nuovo invio dopo "Cc:" finalizza la spedizione dell'email.

A questo punto controlliamo la directory /home/vmail dovremmo trovarci le nuove directory miazienda.it/test/cur, miazienda.it/test/new, miazienda.it/test/tmp. In caso di corretta consegna all'interno di new ci saranno due file corrispondenti ai messaggi ricevuti.

Successivamente passiamo provare ad accedere alla mailbox tramite un client di posta IMAP (es: Icedove) configurato per il nostro server.

Errori noti

Nei log in /var/log/mail.log ho riscontrato questo errore:

 postfix/trivial-rewrite[1749]: warning: do not list domain miodominio.it in BOTH mydestination and virtual_mailbox_domains

che mi impediva di inviare da locale le email al dominio virtuale miodominio.it. Questo problema è noto in quanto se Postfix trova un dominio virtuale identico al dominio della sistema, elimina l'email in quanto non sa dove destinarla.

Una soluzione è assegnare domini differenti, ad esempio lasciare tutto il sistema e il database con il dominio originale e modificare in /etc/postfix/main.cf il valore di mydestination; per esempio:

 mydestination = localhost

così postfix farà riferimento allo smistamento locale per localhost e poi verificherà la presenza dei domini virtuali senza trovare alcuna incongruenza

Conclusioni

A questo punto abbiamo un server mail base funzionante, ora, volendo, si potrebbero fare varie implementazioni, come, ad esempio, inserire dei controlli (virus e spam) alle email, installare e/o crearci un'interfaccia per modificare comodamente i campi del database, installare una webmail, ecc..

Implementazioni

Aggiunta del mail scanner per il controllo delle email: Amavisd-new - fai riferimento alla guida Server mail: Postfix Amavisd-new Dovecot e MySql

Aggiunta del mail scanner per il controllo delle email: MailScanner - fai riferimento alla guida Server mail: Postfix MailScanner Dovecot e MySql




Documentazione testata su Debian Squeeze 64 bit

Autore More+