Andiamo Virtuali |
Home Page | Commenti | Articoli | Faq | Documenti | Ricerca | Archivio | Storie dalla Sala Macchine | Contribuire | Imposta lingua:en it | Login/Register
Questa settimana mi sono cimentato nella ri-configurazione del nostro server di posta aziendale, server che gestisce un panegirico di domini ed utenti anche non nostri, dopo aver lungamente penato per raccattare informazioni ed aver letto un numero impressionante di howto sull'argomento, howto che, tragicamente non hanno funzionanto, ho deciso di scriverlo io un howto, tanto per chiarire un po' le cose.
La configurazione che ho deciso di utilizzare e' la seguente:
Perche' tutta sta' roba? E' presto detto. Come gia' indicato, il server gestisce una serie di domini non nostri, quindi i vari utenti - gestori di dominio devono potersi creare i loro utenti, alias eccetera eccetera. Ergo, devo avere dei domini ed utenti virtuali per permettergli di leggersi la posta, inviarla eccetera ma non posso pretendere che questa gente si metta a smandruppare i files di configurazione di Postfix per farlo.
Per un po' ho meditato sul creare degli script che, ogni tanto, generino i files di configurazione di postfix, ma alla fine ho abbandonato l'idea perche' troppo prona ad errori, e porkacciamiseria, ci sara' un modo per farlo in modo migliore no?
Procmail come "delivery agent" mi serve per consentire agli utenti di crearsi i loro 'forward'/'autoreply' eccetera.
Dovecot come IMAP (vabbe', niente da dire qui).
Horde come WebMail. Fino ad ora e' quello che mi e' sembrato migliore come semplicita' di uso e supporto per cose come filtri/autoreply eccetera. E lo preferisco di sicuro contro il vecchio SquirrelMail.
MySQL come backend. Dato che Horde usa MySQL per gestire le preferenze degli utenti et similia, ho deciso di usarlo per tutto e basta. Inoltre il vecchio sistema usava Ldap e ci stava dando una marea di problemi. Quindi, via LDAP.
Di tutto questo il grosso problema e' Postfix, la cui distribuzione "standard" (almeno per RH e derivate) non comprende il supporto per mysql. Per cio' ho dovuto usare un RPM di terze parti (postfix-2.3.3-2.el5.centos.mysql_pgsql.i386.rpm).
Il resto del software lo trovate sui vari siti originali. Per Dovecot mi sono limitato ad installare quello standard che arriva con CentOS.
Per cominciare decidiamo a quale "utente" dovranno appartenere tutte le directory ed i vari files di posta. Io, per semplicita' ho deciso di chiamare tale utente "virtual". Creato l'utente con il suo corrispondente gruppo e assegnato una 'home' directory apposita.
useradd -m -d /var/virtual virtual
Ho assegnato all'utente una vera Shell, perche' voglio che questo utente sia anche usato da Horde per creare i vari file .procmail per gli utenti.
Io voglio le cose ordinate. Quindi non voglio tutti gli utenti mischiati ma li voglio divisi per 'dominio'. Quindi nella mia directory "virtual" voglio le cose in questo modo:
virtual (home dir) | +- dominio.com | + utente | + altroutente | +- altrodominio.com | + utente | + altroutente | ...
Quindi entrambi i domini hanno un utente chiamato "utente" ma la loro posta non si mischia. Per fare cio' devo depositare la posta nella directory (maildir) "dominio/utente" e non "utente@dominio".
Questo richiede un piccolo trucco in Procmail che e' descritto dopo. Ovviamente, se voi volete fare in modo diverso, vi basta cambiare la funzione in procmail.
Per la struttura del database ho usato quella standard distribuita con Postfix Admin.
La configurazione di postfix consiste nel dire a postfix di leggersi la mappa degli utenti dal database. Questo si fa' usando le apposite direttive nel file main.cf:
virtual_minimum_uid = 1026 virtual_gid_maps = static:1026 virtual_uid_maps = static:1026 virtual_mailbox_base = /var/virtual virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains_maps.cf virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf virtual_mailbox_limit = 51200000 virtual_transport = procmailPregasi notare i primi 3 parametri. Nel mio caso '1026' e' l'ID dell'utente "virtual" (ed il suo gruppo). Nel vostro caso dovrete metterci l'ID giusto.
A questo poi si tratta di aggiungere (o verificare che gia' esistano) le "restrizioni" per i destinatari. Dovrebbe essere una roba tipo:
smtpd_recipient_restrictions= reject_non_fqdn_recipient, reject_unknown_recipient_domain, permit_mynetworks, reject_unauth_destination
Ora si tratta di cambiare il file master.cf per inviare la posta usando procmail:
procmail unix - n n - - pipe -o flags=RO user=virtual argv=/usr/bin/procmail -t -m USER=${user} \ EXTENSION=${extension} NEXTHOP=${nexthop} /etc/procmailrc
(la seconda e terza riga devono essere una sola)
Questo richiama procmail passandogli come parametri il nome dell'utente ed il corrispondente 'dominio' virtuale. Questo ci serve (e mi serve) per poter depositare la posta nella casella giusta.
A questo punto ci serve di leggere i dati dal database, questo si fa con i files "mysql_virtual_alias_maps.cf", "mysql_virtual_mailbox_maps.cf" e "mysql_virtual_domains_maps.cf". Ovviamente questi nomi sono quelli scelti da me. Se non vi vanno bene cambiateli, basta che usiate gli stessi nel main.cf (come scritto sopra).
# mysql_virtual_alias_maps # ritorna gli Alias leggendoli da MySQL user = postfix password = postfix hosts = 127.0.0.1 dbname = postfix query = select goto from alias where address='%s'
Chiaramente, i parametri user, password e dbname dovranno essere quelli del vostro database. Questo sono solo di esempio. Come si capisce, il "nocciolo" della questione e' la query che ritorna l'indirizzo di destinazione passandogli il parametro "indirizzo".
# mysql_virtual_mailbox_maps.cf # Definisce le mailbox (maildir) per ogni utente user = postfix password = postfix hosts = 127.0.0.1 dbname = postfix query = select maildir from mailbox where username='%s'
Anche qui non c'e' molto da dire. E per ultima la tabella dei domini.
# mysql_virtual_domains_maps.cf # Definisce i domini virtuali user = postfix password = postfix hosts = 127.0.0.1 dbname = postfix query = select domain from domain where domain='%s' and active=1
Notare che qui definisco "active" per identificare domini "vivi" da domini "morti".
Questo e' quanto per quanto riguarda Postfix.
La configurazione di dovecot e' quasi banale, quello che dobbiamo ricordarci e': definire la "mail_location" indicando il dominio ed il nome dell'utente, specificare "first_valid_uid" etc. in modo che sia sempre l'utente "virtual" ad accedere alla posta e quindi specificare il file di configurazione di mysql per l'autenticazione con backend 'sql'.
In soldoni...
mail_location = maildir:/var/virtual/%d/%n first_valid_uid = 1026 last_valid_uid = 1026 first_valid_gid = 1026 last_valid_gid = 1026 auth default { mechanisms = plain login # SQL database # http://wiki.dovecot.org/AuthDatabase/SQL passdb sql { args = /etc/dovecot-sql.conf } userdb static { args = uid=1026 gid=1026 home=/var/virtual/ allow_all_users=y } }
I parametri in 'userdb' devono essere (di nuovo) i vostri UID e GID per l'utente 'virtual'.
Questo e' quanto per il file di configurazione di Dovecot a parte lo standard. Di nuovo, il file di configurazione -sql.conf e' il nome che ho scelto io.
# dovecot-sql.conf # sql config file for dovecot driver = mysql connect = host=127.0.0.1 dbname=postfix user=postfix password=postfix default_pass_scheme = PLAIN password_query = SELECT username as user,password FROM mailbox where username='%u';
Di nuovo, il succo e' la query che ritorna username e password dal db.
Procmail deve depositare la posta nel posto giusto. Ci sono due modi di farlo. Il primo modo e' "diretto". Cioe' usare procmail stesso. Il secondo modo e' invocare "deliver" di dovecot. Teoricamente, il secondo modo consente a dovecot di mantenere gli indici sui messaggi in modo piu' efficiente, ma io non ho visto differenze sostanziali. Forse se avete un paio di milioni di messaggi di posta...
Per Procmail, il trucco sta' nel richiamare un procmail "standard" prima di richiamare quello "personale" dell'utente. Il che si fa' nella configurazione di postfix in master.cf dove abbiamo messo:
procmail unix - n n - - pipe -o flags=RO user=virtual argv=/usr/bin/procmail -t -m USER=${user} \ EXTENSION=${extension} NEXTHOP=${nexthop} /etc/procmailrc
Quindi in /etc/procmailrc mettiamo:
DEFAULT=/var/virtual/$NEXTHOP/$USER/ INCLUDERC=/var/virtual/$NEXTHOP/$USER/.procmailrc #LOGFILE=/tmp/proclog #VERBOSE=yes
Ed ecco che si spiegano anche cosa sono quei parametri 'nexthop' e 'user'. User e' (ovviamente) il nome utente a cui consegnamo la posta, mentre 'nexthop' e' il dominio di apparenenza. Questo semplice procmail consegnera' la posta in /var/virtual/dominio/utente. Notare l'ultime "/" nel "default" di procmail! Quella "/" dice a procmail di usare il formato maildir invece di mailbox.
Be', di questo non c'e' molto da dire. La configurazione e' di default. Le uniche cose da tenere presente sono: i parametri di connessione al database e i parametri domain_path e domain_in_mailbox, che io ho deciso che non voglio. In particolare, il parametro domain_path specifica se si vuole le varie maildir dentro ad una directory per dominio o no. Ed io le voglio. Mentre domain_in_mailbox indica se si vuole ogni maildir come "utente@dominio" o no.
La mia configurazione quindi riporta:
$CONF['domain_path'] = 'YES'; $CONF['domain_in_mailbox'] = 'NO';
Per Horde non c'e' molto da configurare, ma, se volete usare procmail per gestire autoreply etcetera, bisogna fare in modo che Horde scriva il file nella directory giusta. E per quello occorre un piccolo cambiamento al codice.
In /doveavetehorde/ingo/config/backend.php eliminate tutto e lasciate solo il backend "procmail", quindi:
/* Procmail */ $backends['procmail'] = array( 'driver' => 'vfs', 'preferred' => 'localhost', 'hordeauth' => false, 'params' => array( 'hostspec' => 'localhost', 'filename' => '.procmailrc', 'username' => 'virtual', 'password' => 'secret', 'vfs_path' => '/var/virtual/%d/%u', 'vfstype' => 'ftp', 'port' => 21, ), 'script' => 'procmail', 'scriptparams' => array( 'path_style' => 'maildir', 'variables' => array( ) ), 'shares' => false );
Notare il parametro 'vfs_path' => '/var/virtual/%d/%u', nella versione "normale", "%d" non esiste, e qui' rappresenta (ovviamente) il Dominio virtuale. Per gestire il dominio occorre fare una semplice modifica allo script /dovestahorde/ingo/lib/Driver/vfs.php nella funzione '_connect'. La modifica e' la seguente:
function _connect()
{
/* Do variable substitution. */
if (!empty($this->_params['vfs_path'])) {
$user = Ingo::getUser();
# change to handle virtual domains -dovecot style
# D.B. - March 2009
$pos=strpos($user,'@');
if( $pos !== false ) {
$domain=substr($user,$pos+1);
}
if ($_SESSION['ingo']['backend']['hordeauth'] !== 'full') {
$pos = strpos($user, '@');
if ($pos !== false) {
$user = substr($user, 0, $pos);
}
}
$this->_params['vfs_path'] = str_replace(
array('%u', '%U', '%d'),
array($user, $this->_params['username'],$domain),
$this->_params['vfs_path']);
}
if (!empty($this->_vfs)) {
return true;
}
require_once 'VFS.php';
$this->_vfs = &VFS::singleton($this->_params['vfstype'], $this->_params);
if (is_a($this->_vfs, 'PEAR_Error')) {
$error = $this->_vfs;
$this->_vfs = null;
return $error;
} else {
return true;
}
}
}
Le parti cambiate sono in grassetto. Come si vede non c'e' molto.
Vsftpd non sarebbe strettamente necessario, ma e' l'unico modo per Horde di creare i files .procmail per gli utenti (a meno che voi non vogliate dare ad Apache i diritti di scrittura su tutto il disco). Per questo occorre installare Vsftpd. Potete farlo ascoltare solo su 127.0.0.1 (se il server di posta ed il webmail stanno sullo stesso server ovviamente) o restringere al solo webmail.
Create i database per Horde e PostfixAdmin. Ocio a dare i permessi e la password giusta all'utente giusto.
Se tutto e' ok dovreste essere in grado di avviare tutti i servizi (Mysql e vsftpd per primi) e tutto dovrebbe funzionare senza problemi. Createvi un dominio ed un utente all'interno del dominio e provate ad inviare e ricevere posta.
A me piacerebbe tanto se l'interfaccia di gestione dei domini/utenti potesse essere integrata in Horde, in modo da avere una sola applicazione di cui preoccuparsi invece che due... hummm...
I commenti sono aggiunti quando e soprattutto se ho il tempo di guardarli e dopo aver eliminato le cagate, spam, tentativi di phishing et similia. Quindi non trattenete il respiro.
subject Di Luca Bertoncello postato il 22/03/2009 18:19
-- Luca Bertoncello
-AT- Luca Bertoncello Di Davide Bianchi postato il 22/03/2009 19:17
-- Davide Bianchi
webmail Di lucac81 postato il 23/03/2009 09:12
-- lucac81
-AT- lucac81 Di Daniele postato il 23/03/2009 10:53
-- Daniele
Procmail Di Gianluca postato il 17/12/2009 12:46
Di Roby postato il 23/11/2010 18:18
Ciao, ho provato a seguire questa guida e tutto sembra funzionare tranne per un dettaglio.
Il sistema non genera le dir fisiche nelle quali infilare le mail ed ovviamente non accetta i login.
Cavolo può essergli preso?
-- Roby
@ Roby Di Davide Bianchi postato il 23/11/2010 19:22
Il sistema non genera le dir fisiche nelle quali infilare le mail ed ovviamente non accetta i login.
Verifica i log, quasi sicuramente e' un problema di permessi.
-- Davide Bianchi
Davide Bianchi, lavora come Unix/Linux System Administrator presso una societa' di Hosting in Olanda.
Il presente sito e' frutto del sudore della mia fronte (e delle mie dita), se siete interessati a ripubblicare uno degli articoli, documenti o qualunque altra cosa presente in questo sito per cortesia datemene comunicazione (o all'autore dell'articolo se non sono io), cosi' il giorno che faccio delle aggiunte potro' avvisarvi e magari mandarvi il testo aggiornato.
Questo sito era composto con VIM, ora e' composto con VIM ed il famosissimo CMS FdT.
Questo sito non e' ottimizzato per la visione con nessun browser particolare, ne' richiede l'uso di font particolari o risoluzioni speciali. Siete liberi di vederlo come vi pare e piace, o come disse qualcuno: "Finalmente uno dei POCHI siti che ancora funzionano con IE5 dentro Windows 3.1".