Server mail base: Postfix Dovecot e MySql
Guida da adottare! |
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
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 è necessario 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, dalla console di MySQL procediamo con la creazione del 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. Prima dobbiamo selezionare il database
#mysql> use mailserver
Poi creiamo la tabella con la seguente istruzione SQL
#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" della tabella, questo lo 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;
Infine, usciamo dalla shell di mysql con il comando:
#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
NB: lo user "postfix" e relativa password sono relativi all'utente del database che hai definito con il comando "GRANT ..." nel capitolo precedente Server_mail_base:_Postfix_Dovecot_e_MySql#Creazione_del_database
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 i dati di autenticazione per permettere l'accesso al database, con 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
NB: lo user "postfix" e relativa password sono relativi all'utente del database che hai definito con il comando "GRANT ..." nel capitolo precedente Server_mail_base:_Postfix_Dovecot_e_MySql#Creazione_del_database
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
NB: lo user "postfix" e relativa password sono relativi all'utente del database che hai definito con il comando "GRANT ..." nel capitolo precedente Server_mail_base:_Postfix_Dovecot_e_MySql#Creazione_del_database
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
NB: lo user "postfix" e relativa password sono relativi all'utente del database che hai definito con il comando "GRANT ..." nel capitolo precedente Server_mail_base:_Postfix_Dovecot_e_MySql#Creazione_del_database
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).
NB: lo user "postfix" e relativa password sono relativi all'utente del database che hai definito con il comando "GRANT ..." nel capitolo precedente Server_mail_base:_Postfix_Dovecot_e_MySql#Creazione_del_database
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, con i seguenti due comandi:
# 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
Guida scritta da: More+ 23:37, 13 mag 2011 (CEST) | Debianized 20% |
Estesa da: | |
Verificata da: | |
Verificare ed estendere la guida | Cos'è una guida Debianized |