Andiamo Virtuali


Home Page | Commenti | Articoli | Faq | Documenti | Ricerca | Archivio | Storie dalla Sala Macchine | Contribuire | 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:

  1. Postfix come MTA
  2. Dovecot come IMAP/POP server
  3. MySQL come backend
  4. Procmail come "delivery agent"
  5. PostfixAdmin come interfaccia di gestione per i domini
  6. Horde come WebMail
  7. Vsftpd (che non sarebbe strettamente necessario)

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 = procmail
Pregasi 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.

7 messaggi this document does not accept new posts
Luca Bertoncellosubject Di Luca Bertoncello - postato il 22/03/2009 18:19
> 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...

Questo lo puoi fare scrivendoti un Plugin per Horde (che pero' non e' immediato e, nel tuo caso, richiederebbe praticamente la riscrittura di PostfixAdmin).
PERO'! Posso suggerirti un piccolo barbatrucco: Horde ti permette di creare un Link a pagine esterne (lo feci dal Provider dove lavoravo proprio per avere, da Horde, un pulsante per accedere alle configurazioni).
Purtroppo non ricordo esattamente la sintassi, ma la lessi e presi paro-paro dalle FAQ di Horde.
Un po' di CSS tagliati su misura per Horde e PostfixAdmin e l'utente non si accorge di niente!

Ciao

--
Luca Bertoncello


Davide Bianchi-AT- Luca Bertoncello Di Davide Bianchi - postato il 22/03/2009 19:17

> > 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...
>
> Questo lo puoi fare scrivendoti un Plugin per Horde (che pero' non e' immediato e, nel tuo caso, richiederebbe praticamente la riscrittura di PostfixAdmin).

Era il senso del mio 'hummm'...

--
Davide Bianchi


lucac81webmail Di lucac81 - postato il 23/03/2009 09:12

Bella guida D. io ho una configurazione simile ed effettivamente di howto ce ne sono tantissimi, ma spesso incompleti o non piu validi.
Per la questione webmail e gestione utenti io sto usando con successo Roundcube[1], è ancora in beta, ma è abbastanza stabile, ed esiste una semplice patch, rcpfa[2] per integrare la gestione utente di postfixadmin, quindi vacation/forward/autoreply

[1] http://www.roundcube.net/
[2] http://nejc.skoberne.net/projects/rcpfa/

--
lucac81


Daniele-AT- lucac81 Di Daniele - postato il 23/03/2009 10:53

> Per la questione webmail e gestione utenti io sto usando con successo >Roundcube[1], è ancora in beta, ma è abbastanza stabile, ed esiste una semplice >-Patch, rcpfa[2] per integrare la gestione utente di postfixadmin, quindi >vacation/forward/autoreply

Peccato che roundcube sta collezionando più exploit di phpbb in un tempo relativamente molto più breve, basta vedere i log di un qualsiasi webserver (anche se non lo usa), per trovarsi 2^n (con n tendente a $cifrone) tentativi su roundcube...

--
Daniele


GianlucaProcmail Di Gianluca - postato il 17/12/2009 12:46

Grazie per questa tua guida.
Di recente mi sono accorto che invando una email a piu' destinatari appartenenti al dominio virtuale quest'email giungeva unicamente all'ultimo indirizzo email della lista dei destinatati (sia che essi fosseto 'to' o 'cc').
Indagando ho scoperto che il problema era legato a procmail e l'ho risolto aggiungento dalla configurazione di Postfix a riga/opzione:

procmail_destination_recipient_limit = 1

Ciao.
Gianluca

--
Gianluca


Roby 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


Davide Bianchi@ 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


7 messaggi this document does not accept new posts

Precedente Successivo

Davide Bianchi, lavora come Unix/Linux System Administrator presso una societa' di "sicurezza informatica" (aka: $networkgestapo) di Haarlem. Contatti: mail: davide AT onlyforfun.net , Jabber: davideyeahsure AT gmail.com,

Volete contribuire? Leggete come!.
 
 

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".

Web Interoperability Pleadge Support This Project
Powered By Gort