<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>BgLUG &#187; postfix</title>
	<atom:link href="http://bglug.it/tag/postfix/feed/" rel="self" type="application/rss+xml" />
	<link>http://bglug.it</link>
	<description>Bergamo Linux Users Group</description>
	<lastBuildDate>Sun, 04 Dec 2011 22:50:33 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Postfix nirvana &#8211; Parte II</title>
		<link>http://bglug.it/2008/08/05/postfix-nirvana-parte-ii/</link>
		<comments>http://bglug.it/2008/08/05/postfix-nirvana-parte-ii/#comments</comments>
		<pubDate>Tue, 05 Aug 2008 11:27:46 +0000</pubDate>
		<dc:creator>jimmi</dc:creator>
				<category><![CDATA[Documentazione]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[amavis]]></category>
		<category><![CDATA[clamav]]></category>
		<category><![CDATA[dovecot]]></category>
		<category><![CDATA[fetchmail]]></category>
		<category><![CDATA[horde]]></category>
		<category><![CDATA[mailserver]]></category>
		<category><![CDATA[postfix]]></category>
		<category><![CDATA[postfixadmin]]></category>
		<category><![CDATA[postgrey]]></category>
		<category><![CDATA[spamassassin]]></category>

		<guid isPermaLink="false">http://bglug.it/?p=73</guid>
		<description><![CDATA[Ecco la seconda parte della guida al buon server mail. Come preannunciato nella prima parte, qui parleremo dei programmi accessori che permettono di creare facilmente mailbox virtuali e di rendere la posta (e non solo) disponibile all&#8217;utente tramite una interfaccia web avanzata. Voglio anche qui ringraziare Manuel per il decisivo contributo alla realizzazione della guida. [...]]]></description>
			<content:encoded><![CDATA[<p><em>Ecco la seconda parte della guida al buon server mail. Come preannunciato nella <a title="BgLUG" href="http://bglug.it/2008/07/24/postfix-nirvana-parte-i/" target="_blank">prima parte</a>, qui parleremo dei programmi accessori che permettono di creare facilmente mailbox virtuali e di rendere la posta (e non solo) disponibile all&#8217;utente tramite una interfaccia web avanzata. Voglio anche qui ringraziare Manuel per il decisivo contributo alla realizzazione della guida.</em></p>
<p><span id="more-73"></span></p>
<h3>Sommario</h3>
<ul>
<li><a href="#htoc1">Postfixadmin</a></li>
<li><a href="#htoc2">Postfix: domini e mailbox virtuali</a></li>
<li><a href="#htoc3">Dovecot</a></li>
<li><a href="#htoc4">Dovecot LDA</a></li>
<li><a href="#htoc5">Horde</a></li>
<li><a href="#htoc6">Fetchmail e Gmail server relay</a></li>
</ul>
<h3><a name="htoc1">Postfixadmin</a></h3>
<p>È giunto il momento di installare Postfixadmin, che permette di gestire domini virtuali, mailboxes e alias tramite una interfaccia web costruita in PHP. Postifxadmin è pacchettizzato in Debian Etch, quindi l&#8217;installazione dei file avviene con un semplice &#8220;<code>apt-get install postfixadmin</code>&#8220;.</p>
<p>L&#8217;operazione successiva è la creazione del database e dell&#8217;utente amministratore. È possibile farlo semplicemente con <a title="phpMyAdmin" href="http://www.phpmyadmin.net" target="_blank">phpMyAdmin</a>, oppure direttamente tramite il prompt di MySQL con i comandi:</p>
<pre>CREATE DATABASE postfix;
CREATE USER 'postfix'@'localhost' IDENTIFIED BY 'choose_a_password';
GRANT ALL PRIVILEGES ON `postfix` . * TO 'postfix'@'localhost';</pre>
<p>sostituendo gli opportuni valori, ed inserendo poi gli stessi valori nel file di configurazione <code>/etc/postfixadmin/config.inc.php</code>. Nello stesso file, oltre ai dati del database, è necessario cambiare il valore di <code>$CONF['configured']</code> da <em>false</em> a <em>true</em> per poter inizializzare l&#8217;applicazione.  Io preferisco avere le varie maidir degli utenti suddivise in directory separate per dominio, per cui imposto:</p>
<pre>$CONF['domain_path'] = 'YES';</pre>
<p>A questo punto imposto un VirtualHost sul server web che punti alla directory del programma, nel caso di Debian <code>/usr/share/postfixadmin/</code>, dirigo il browser su <code>http://INDIRIZZO_DI_POSTFIXADMIN/setup.php</code> e, dopo la creazione delle tabelle, mi appare una lista di &#8216;OK&#8217; e il form per la creazione dell&#8217;utente amministratore. Lo inserisco e posso eseguire il login.</p>
<p>Postfixadmin offre all&#8217;utente la possibilità di impostare gli inoltri automatici dei messaggi e un autorisponditore (Vacation). Mentre il primo è già abilitato, per abilitare il secondo dobbiamo effettuare alcune modifiche.</p>
<p>Creo innanzitutto un utente ed un gruppo <em>vacation</em>, aggiungendo a <code>/etc/passwd</code> la riga:</p>
<pre>vacation:*:65501:65501::0:0:Virtual Vacation:/nonexistent:/usr/sbin/nologin</pre>
<p>ed a /etc/group la riga:</p>
<pre>vacation:*:65501:</pre>
<p>Quindi creo una directory di base per l&#8217;autorisponditore, vi copio il file <code>vacation.pl</code>, che in Debian si trova in <code>/usr/share/doc/postfixadmin/VIRTUAL_VACATION/</code>, e cambio i permessi di tutto:</p>
<pre># mkdir /var/spool/vacation
# cd /usr/share/doc/postfixadmin/VIRTUAL_VACATION/
# cp vacation.pl /var/spool/vacation/
# chown vacation:vacation -R /var/spool/vacation</pre>
<p>Nel file <code>vacation.pl</code> devo inserire gli estremi del database modificando le righe:</p>
<pre>my $db_type = 'mysql';
my $db_username = 'postfix';
my $db_password = 'password';
my $db_name     = 'postfix';</pre>
<p>ed infine abilitare il modulo modificando nel file<br />
<code>/etc/postfixadmin/config.inc.php</code> le righe:</p>
<pre>$CONF['vacation'] = 'YES';
$CONF['vacation_domain'] = 'vacation.nomedominio';</pre>
<p>Per far funzionare l&#8217;autorisponditore sono necessari tre moduli Perl. Due di questi li posso installare con:</p>
<pre>apt-get install libemail-valid-perl libmail-sendmail-perl</pre>
<p>mentre il terzo non è incluso nei repository di <em>Debian Etch</em>. È però possibile scaricare il pachetto dai repository di <em>Debian Lenny</em> (testing) ed installarlo senza incontrare problemi di dipendenze con:</p>
<pre># wget http://ftp.it.debian.org/debian/pool/main/libm/libmime-encwords-perl/libmime-encwords-perl_1.010.101-1_all.deb
# dpkg -i libmime-encwords-perl_1.010.101-1_all.deb</pre>
<p>In ultimo dobbiamo definire il servizio <em>vacation</em> e fare in modo che i messaggi indirizzari al domino <em>vacation.nomedominio</em> vi siano girati. Per fare questo aggiungo al file <code>/etc/postfix/master.cf</code> le righe:</p>
<pre>vacation    unix  -       n       n       -       -       pipe
  flags=Rq user=vacation argv=/var/spool/vacation/vacation.pl -f ${sender} -- ${recipient}</pre>
<p>creo poi un file <code>/etc/postfix/transport</code> contenente la riga:</p>
<pre>vacation.nomedominio        vacation:</pre>
<p>compilo il database con:</p>
<pre>#postmap /etc/postfix/transport</pre>
<p>ed aggiungo a <code>/etc/postfix/main.cf</code> la riga:</p>
<pre>transport_maps = hash:/etc/postfix/transport</pre>
<p>Il tutto è ora pronto a funzionare, ma per utilizzarlo devo modificare la configurazione di Postfix.</p>
<h3><a name="htoc2">Postfix: domini e mailbox virtuali</a></h3>
<p>Per fare in modo che Postfix veda i domini virtuali creati da Postfixadmin devo aggiungere le seguenti righe in <code>/etc/postfix/main.cf</code>:</p>
<pre>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_base = /home/mail
virtual_uid_maps = static:6000
virtual_gid_maps = static:6000</pre>
<p>che indicano rispettivamente gli indirizzi delle mappe del database, l&#8217;indirizzo della directory dove verrannno create le mailbox virtuali, e l&#8217;utente e gruppo proprietari delle mailbox. L&#8217;utente e il gruppo devono esistere nel file /etc/passwd:</p>
<pre>vmail:x:6000:6000::/home/mail:/bin/sh</pre>
<p>e in /etc/group:</p>
<pre>vmail:x:6000:</pre>
<p>e devo creare la directory con i giusti permessi</p>
<pre># mkdir /home/mail
# chown vmail:vmail /home/mail</pre>
<p>Le mappe sono file di testo composti come segue:</p>
<p>mysql_virtual_alias_maps.cf:</p>
<pre>user = postfix
password = password
hosts = 127.0.0.1
dbname = postfix
table = alias
select_field = goto
where_field = address</pre>
<p>mysql_virtual_domains_maps.cf:</p>
<pre>user = postfix
password = password
hosts = 127.0.0.1
dbname = postfix
table = domain
select_field = description
where_field = domain</pre>
<p>mysql_virtual_mailbox_maps.cf:</p>
<pre>user = postfix
password = password
hosts = 127.0.0.1
dbname = postfix
table = mailbox
select_field = maildir
where_field = username</pre>
<p>Ora sono pronto a inserire, tramite l&#8217;interfaccia di Postfixadmin, il mio primo dominio virtuale e i relativi alias e mailboxes. Dopo averlo riavviato Postfix è pronto a ricevere mail per gli account impostati. Posso testare il tutto in locale con telnet:</p>
<pre># telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 nomemacchina.nomedominio ESMTP Postfix (Debian/GNU)

ehlo nomemacchina.nomedominio
250-nomemacchina.nomedominio
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-AUTH PLAIN LOGIN
250-AUTH=PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN

mail from:&lt;jimmi@server.com&gt;
250 2.1.0 Ok

rcpt to:&lt;jimmi@nomedominio&gt;
250 2.1.5 Ok

data
354 End data with &lt;CR&gt;&lt;LF&gt;.&lt;CR&gt;&lt;LF&gt;

prova mail
.
250 2.0.0 Ok: queued as 718BE15DF78

quit
221 2.0.0 Bye
Connection closed by foreign host.</pre>
<p>Se tutto è a posto troverò la mail nell&#8217;Inbox dell&#8217;utente.</p>
<h3><a name="htoc3">Dovecot</a></h3>
<p>Passo ad occuparmi ora del server IMAP. Anche Dovecot è pacchettizato da Debian, e si installa con:</p>
<pre>apt-get install dovecot-imapd dovecot-pop3d</pre>
<p>È possibile attivare facilmente i server imap, imaps, pop3 e pop3s aggiungendo a <code>/etc/dovecot/dovecot.conf</code>:</p>
<pre>protocols = imap imaps pop3 pop3s</pre>
<p>ed eventualmente modificando le sezioni dedicate nello stesso file. Per fare in modo che Dovecot utilizzi le mailbox virtuali modifico seguenti righe di<br />
<code>/etc/dovecot/dovecot.conf</code>:</p>
<pre>mail_location = maildir:/home/mail/%d/%n
auth default {
mechanisms = plain login
passdb sql {
args = /etc/dovecot/dovecot-mysql.conf
}
userdb sql {
args = /etc/dovecot/dovecot-mysql.conf
}
user = postfix
client {
path = /var/spool/postfix/private/auth
mode = 0660
user = postfix
group = postfix
}
}</pre>
<p>La sezione &#8220;<code>client</code>&#8221; serve per abilitare l&#8217;autenticazione SASL in postfix, che si attiva aggiungendo le seguenti righe in <code>/etc/postfix/main.cf</code>:</p>
<pre>smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $myhostname
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth</pre>
<p>Per ottenere i dati dell&#8217;utente dal database aggiungo poi il file<br />
<code>/etc/dovecot/dovecot-mysql.conf</code>:</p>
<pre>driver = mysql
password_query = SELECT password FROM mailbox WHERE username = '%u'
user_query = SELECT maildir, 6000 AS uid, 6000 AS gid FROM mailbox WHERE username = '%u'
connect = host=127.0.0.1 port=3306 dbname=postfix user=postfix password=password default_pass_scheme = CRYPT</pre>
<p>Al riavvio di Dovecot se tutto funziona posso leggere le seguenti righe nei log:</p>
<pre>dovecot: 2008-07-13 19:40:42 Info: Dovecot v1.0.rc15 starting up
dovecot: 2008-07-13 19:40:43 Info: auth-worker(default): mysql: Connected to 127.0.0.1 (postfix)</pre>
<h3><a name="htoc4">Dovecot LDA</a></h3>
<p>Dovecot fornisce anche un programma per la consegna dei messaggi agli utenti virtuali, chiamato Dovecot <strong>L</strong>ocal <strong>D</strong>elivery <strong>A</strong>gent, che può sostituire <em>virtual</em> fornito dal Postfix, con alcune funzionalità aggiuntive, come l&#8217;indicizzazione delle mailbox, l&#8217;utilizzo di quote utente e di Sieve tramite appositi plugin. Per abilitarlo devo aggiungere al file <code>/etc/dovecot/dovecot.conf</code> le righe:</p>
<pre>protocol lda {
..
  # UNIX socket path to master authentication server to find users.
  #auth_socket_path = /var/run/dovecot/auth-master
}
auth default {
..
  socket listen {
    # Note that we're setting a master socket. SMTP AUTH for Postfix uses client sockets.
    master {
      path = /var/run/dovecot/auth-master
      # Auth master socket can be used to look up userdb information for
      # given usernames. This probably isn't very sensitive information
      # for most systems, but still try to restrict the socket access if possible.
      mode = 0600
      user = vmail # User running deliver
      group = vmail # Or alternatively mode 0660 + deliver user in this group
    }
  }
..
}</pre>
<p>Posso ora aggiungere il servizio in Postfix, aggiungendo a<br />
<code>/etc/postfix/master.cf</code>:</p>
<pre>dovecot   unix  -       n       n       -       -       pipe
    flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -d ${recipient}</pre>
<p>e indicargli di utilizzarlo inserendo in <code>/etc/postfix/main.cf</code> le righe:</p>
<pre>virtual_transport = dovecot
dovecot_destination_recipient_limit = 1</pre>
<p>Con queste impostazioni <em>deliver</em>, che funziona da utente non privilegiato, genera un errore. Per evitarlo nella <a title="Dovecot MarkMail" href="http://dovecot.markmail.org/" target="_blank">mailing list</a> di Dovecot consigliano di impostare <em>deliver</em> a SUID con il comando:</p>
<pre># chmod u+s /usr/lib/dovecot/deliver</pre>
<p>Riavvio Dovecot e Postfix, e alla prima ricezione posso trovare nei log qualcosa di simile a questo:</p>
<pre>server postfix/pipe[23496]: 23FD715DF87: to=&lt;utente@nomedominio&gt;, relay=dovecot, delay=0.4, delays=0.07/0.02/0/0.31, dsn=2.0.0, status=sent (delivered via dovecot service)</pre>
<h3><a name="htoc5">Horde</a></h3>
<p>Manca ora l&#8217;ultimo pezzo, l&#8217;interfaccia web per gli utenti tramite Horde, un framework con numerosi moduli in PHP. Anche questa applicazione è pacchettizzata da Debian, e l&#8217;installazione è banale se si seguono le indicazioni del <a title="Debian" href="http://wiki.debian.org/Horde" target="_blank">Wiki</a>.</p>
<p>Installo per primo il framework con:</p>
<pre># apt-get install horde3</pre>
<p>abilito un VirtualHost che punti alla sua directory, aggiungendo ad esempio in <code>/etc/apache2/sites-available/default</code>:</p>
<pre>Alias /horde3 /usr/share/horde3
Options FollowSymLinks
AllowOverride Limit
deny from all
allow from TUO_IP</pre>
<p>che mi permetterà di accedere localmente, e inizializzo il database. Quest&#8217;ultima operazione può avvenire da riga di comando con:</p>
<pre>#gunzip &lt; /usr/share/doc/horde3/examples/scripts/sql/create.mysql.sql.gz | mysql -u MYSQL_ADMIN -p</pre>
<p>Avendo cura di modificare in <code>create.mysql.sql.gz</code> i dati di accesso dell&#8217;amministratore di Horde. Fatto ciò puntando il browser su <code>http://nomemacchina.nomedominio/horde3</code> compare la maschera iniziale di Horde. Per il debug di eventuali problemi posso puntare il browser su: <code>http://nomemacchina.nomedominio/horde3/test.php</code></p>
<p>La configurazione di Horde3 avviene creando nelle directory sotto <code>/etc/horde/horde3</code> i file config.php e config.php.bak con maschera dei permessi 777, configurando poi tramite intefaccia web le opzioni nella maschera in <code>Amministrazione--&gt;Impostazione--&gt;Horde</code>, salvando e riportando i permessi dei due file a 644 e 700 rispettivamente.</p>
<p>Per un corretto funzionamento è indispensabile impostare correttamente i parametri nelle maschere <em>Database</em>, <em>Authentication</em> e <em>Preference System</em></p>
<p>Horde mette a disposizione, tra gli altri, i seguenti moduli:</p>
<ul>
<li><strong>IMP </strong> &#8211; Cliente Webmail</li>
<li><strong>Ingo</strong> &#8211; Filtro per le mail</li>
<li><strong>Turba</strong> &#8211; Gestione rubrica</li>
<li><strong>Kronolith</strong> &#8211; Calendario</li>
<li><strong>Nag</strong> &#8211; Gestione attività</li>
<li><strong>Mnemo</strong> &#8211; Gestione note</li>
<li><strong>Passwd</strong> &#8211; Gestione password</li>
<li><strong>MIMP</strong> &#8211; Interfaccia per dispositivi mobili</li>
</ul>
<p>Tutti questi moduli sono presenti nei repository Debian ad eccezione di MIMP, che può essere facilmente installato per Debian con le seguenti operazioni:</p>
<pre># wget http://ftp.horde.org/pub/mimp/mimp-h3-1.1.tar.gz
# tar -xvzf mimp-h3-1.1.tar.gz
# mv mimp-h3-1.1/config /etc/horde/mimp
# mv mimp-h3-1.1 /usr/share/horde3/mimp
# cd /usr/share/horde3/mimp
# ln -s /etc/horde/mimp config</pre>
<p>La configurazione dei vari moduli avviene, analogalmente a quella del framework, in tre operazioni:</p>
<ul>
<li> Creo nelle directory sotto <code>/etc/horde/[nomemodulo]</code> i file config.php e config.php.bak con maschera dei permessi 777</li>
<li> Configuro e salvo tramite intefaccia web le opzioni nella maschera in <code>Amministrazione--&gt;Impostazione--&gt;[nomemodulo]</code></li>
<li> Cambio i permessi dei due file a 644 e 700 rispettivamente.</li>
</ul>
<p>Ovviamente le operazioni dovranno essere ripetute per ogni modulo.</p>
<p>Oltre alle impostazioni più <em>banali</em> possono essere importanti le seguenti impostazioni per i vari moduli:</p>
<p><strong>Horde</strong></p>
<p>Maschera <em>General</em>:</p>
<p>- <em>Determines how we generate   full URLs (for location headers and such)</em></p>
<pre>Assume that we are using SSL and always generate https URLs</pre>
<p>-  <em>What port number is the webserver running on?</em></p>
<pre>443</pre>
<p>Questo mi serve perchè la mia webmail è disponibile su una connessione criptata <em>https</em></p>
<p>Maschera <em>Authentication</em>:</p>
<p>- <em>What backend should we use for authenticating users to Horde?</em></p>
<pre>Let a Horde application handle authentication</pre>
<p>- <em>The application which is providing authentication</em></p>
<pre>imp</pre>
<p>Queste due scelte permettono di autenticarsi con le credenziali create in <em>Postfixadmin</em> ed effettualre il <em>Login</em> una sola volta anzichè dover inserire due volte i dati per leggere la posta. In questo caso è importante creare un utente amministratore e inserire il suo nome nella prima casella.</p>
<p><strong>IMP</strong></p>
<p>Modifico il file <code>/etc/horde/imp4/servers.php</code> inserendo i dati del o dei server mail. Nel file originale sono contenuti diversi esempi, ricordatevi di commentare o cancellare quelli non necessari.</p>
<p>Nel file <code>/etc/horde/imp4/mime_drivers.php</code> modifico la linea:</p>
<pre>$mime_drivers['imp']['html']['inline'] = true;</pre>
<p>Questo mi permette di vedere in linea le mail composte in HTML, anche se non meriterebbero <img src='http://bglug.it/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  È una scelta giustamente sconsigliata, ma altrimenti le mail HTML vengono formattate in modo impossibile da leggere.</p>
<p><strong>Ingo</strong></p>
<p>Nel file <code>/etc/horde/ingo1/backends.php</code> specifico quale backend utilizzare per i filtri. Le scelte possibili sono <em>null</em> (applica le regole su richiesta), o regole per <em>Maildrop</em>, <em>Procmail</em> o <em>Sieve</em>. La scelta più semplice è:</p>
<pre>/* IMAP Example */
$backends['imap'] = array(
    'driver' =&gt; 'null',
    'preferred' =&gt; 'example.com',
    'hordeauth' =&gt; true,
    'params' =&gt; array(),
    'script' =&gt; 'imap',
    'scriptparams' =&gt; array()
);</pre>
<p>Anche in questo caso le altre scelte vanno commentate o cancellate.</p>
<p><strong>Turba</strong></p>
<p>Nel file <code>/etc/horde/turba2/sources.php</code> specifico quale backend utilizzare. Per utilizzare MySQL la configurazione tipica è:</p>
<pre>$cfgSources['localsql'] = array(
    'title' =&gt; _("My Address Book"),
    'type' =&gt; 'sql',
    'params' =&gt; array_merge($conf['sql'], array('table' =&gt; 'turba_objects')),
    'map' =&gt; array(
        '__key' =&gt; 'object_id',
        '__owner' =&gt; 'owner_id',
        '__type' =&gt; 'object_type',
        '__members' =&gt; 'object_members',
        '__uid' =&gt; 'object_uid',
        'name' =&gt; 'object_name',
        'email' =&gt; 'object_email',
        'alias' =&gt; 'object_alias',
        'homeAddress' =&gt; 'object_homeaddress',
        'workAddress' =&gt; 'object_workaddress',
        'homePhone' =&gt; 'object_homephone',
        'workPhone' =&gt; 'object_workphone',
        'cellPhone' =&gt; 'object_cellphone',
        'fax' =&gt; 'object_fax',
        'title' =&gt; 'object_title',
        'company' =&gt; 'object_company',
        'notes' =&gt; 'object_notes',
        'pgpPublicKey' =&gt; 'object_pgppublickey',
        'smimePublicKey' =&gt; 'object_smimepublickey',
        'freebusyUrl' =&gt; 'object_freebusyurl'
    ),
    'search' =&gt; array(
        'alias',
        'email'
    ),
    'strict' =&gt; array(
        'object_id',
        'owner_id',
        'object_type',
    ),
    'export' =&gt; true,
    'browse' =&gt; true,
    'use_shares' =&gt; true,
);</pre>
<p>ed è inoltre necessario creare la tabella in MySQL, utilizzando il comando:</p>
<pre># mysql -u MYSQL_ADMIN -p DATABASE &lt; /usr/share/doc/turba2/examples/scripts/sql/turba_objects.mysql.sql</pre>
<p><strong>Kronolith</strong></p>
<p>Se si sceglie il driver SQL è necessario creare la tabella con il comando:</p>
<pre># mysql -u MYSQL_ADMIN -p DATABASE &lt; /usr/share/doc/kronolith2/examples/scripts/sql/kronolith.mysql.sql</pre>
<p><strong>Nag</strong></p>
<p>Se si sceglie il driver SQL è necessario creare la tabella con il comando:</p>
<pre># mysql -u MYSQL_ADMIN -p DATABASE &lt; /usr/share/doc/nag2/examples/scripts/sql/nag.sql</pre>
<p><strong>Passwd</strong><br />
Nel file <code>/etc/horde/passwd3/backends.php</code> ho modificato le linee:</p>
<pre>driver' =&gt; 'sql',
'params' =&gt; array(
'phptype'    =&gt; 'mysql',
'hostspec' =&gt; '127.0.0.1',
'port' =&gt; '3306',
'protocol' =&gt; 'tcp',
'username'   =&gt; 'postfix',
'password'   =&gt; 'password',
'encryption' =&gt; 'crypt-md5',
'database'   =&gt; 'postfix',
'table'      =&gt; 'mailbox',
'user_col'   =&gt; 'username',
'pass_col'   =&gt; 'password',
'show_encryption' =&gt; false)</pre>
<p>Per poter modificare la password nel database creato da Postfixadmin.</p>
<h3><a name="htoc6">Fetchmail e Gmail server relay</a></h3>
<p>Vi sono altri due add-ons non strettamente collegati alla configurazione di un server mail ma molto utili specialmente per server fatti in casa.</p>
<p><strong>Fetchmail</strong></p>
<p>È un ottimo programma per ritirare mail da server POP3 o IMAP e consegnarla al server locale. Sia Postfixadmin che Horde hanno dei plugin che gestiscono fetchmail in modi leggermente diversi. Con Horde l&#8217;utente inserisce i dettagli del server remoto e scarica la posta mentre è collegato, mentre con Postfixadmin in base ai dati inseriti dall&#8217;amministratore nel database vengono creati dei file <code>~/.fetchmailrc</code> al volo che possono essere usati inserendo in crontab lo script <code>fetchmail.pl</code>.</p>
<p>Purtroppo entrambi hanno due limitazioni che me ne impediscono l&#8217;utilizzo: non implementano <a title="Freepops" href="http://www.freepops.org/it/">Freepops</a> e non permettono l&#8217;uso di autenticazioni SSL. Freepops è un programmino che permette di scaricare le mail diretamente dalla webmail, aggirando la limitazione all&#8217;uso del server POP per gli abbonamenti free adottato, ad esempio, da Libero e Inwind. L&#8217;uso del protocollo SSL è indispensabile invece per scaricare mail dai server di Gmail o Autistici/Inventati.</p>
<p>La versione di Fetchmail pacchettizzata da Debian ci permette di avviare il programma in modalità demone con il tipico script <code>/etc/init.t/fetchmail</code>. Il pacchetto di Freepops purtroppo fa riferimento ad una versione troppo datata e non più funzionante, e bisogna quindi installare la versione offerta dai <a title="Backports" href="http://backports.org/">Backports</a>. Una volta installati entrambi avremo il demone <em>freepopsd</em> in ascolto alla porta 2000 (di default), e possiamo modificare il file <code>/etc/fetchmailrc</code> aggiungendo le sezioni relative ai vari server. Alcuni utilizzi tipici sono:</p>
<p>Server POP3</p>
<pre>poll SERVER_POP with proto pop3 auth password
user "NOMEUTENTE.REMOTO" there
with password "password"
is NOMEUTENTE.LOCALE here options fetchall</pre>
<p>Server che richiedono Freepops</p>
<pre>poll SERVER_POP with proto pop3 port 2000
user "NOMEUTENTE.REMOTO" there
with password "password"
is NOMEUTENTE.LOCALE here options fetchall</pre>
<p>Server Gmail</p>
<pre>poll SERVER_POP with proto pop3 port 995
user "NOMEUTENTE.REMOTO" there
with password "password"
is NOMEUTENTE.LOCALE here options ssl sslcertck fetchall</pre>
<p><strong>Gmail Server Relay</strong></p>
<p>Normalmente le mail spedite da un server casalingo con IP dinamico vengono rifiutate per motivi di sicurezza, e si è quindi costretti ad usare un server che vi faccia da <em>relay</em>, che vi permetta cioè di spedire mail attraverso il suo servizio. Vi dovesse capitare di non avere a disposizione un relay, o di volerne utilizzare uno alternativo, potete usufruire del servizio offerto da Gmail, il quale però richiede un&#8217;autenticazione sicura via SSL. Per implementarla aggiungo o modifico le seguenti righe di <code>/etc/postfix/main.cf</code>:</p>
<pre>smtpd_tls_CAfile = /etc/postfix/cacert.pem
smtpd_tls_cert_file=/etc/postfix/gmail.pem
smtpd_tls_key_file=/etc/postfix/gmail.key
smtpd_sasl_application_name = smtpd
smtp_tls_per_site = hash:/etc/postfix/smtp_tls_per_site
smtp_use_tls=yes
smtp_tls_CAfile = /etc/postfix/cacert.pem
smtp_tls_cert_file=/etc/postfix/gmail.pem
smtp_tls_key_file=/etc/postfix/gmail.key
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_sasl_tls_security_options = noanonymous
relayhost = [smtp.gmail.com]:587</pre>
<p>creo il file <code>/etc/postfix/sasl_passwd</code>, vi aggiungo le righe:</p>
<pre># Contents of sasl_passwd
#
[smtp.gmail.com]              NOMEUTENTE@gmail.com:PASSWORD</pre>
<p>e lo compilo con:</p>
<pre># postmap /etc/postfix/sasl_passwd</pre>
<p>Infine, se non li possiedo già, creo il mio certificato auto firmato con i seguenti passaggi:</p>
<pre># /usr/local/ssl/misc/CA.pl -newca
  CA certificate filename (or enter to create)
   Making CA certificate ...
  Generating a 1024 bit RSA private key
  .......++++++
  ...................++++++
  writing new private key to './demoCA/private/cakey.pem'
  Enter PEM pass phrase: <strong>password</strong>
  Verifying - Enter PEM pass phrase: <strong>password</strong>
  -----
  You are about to be asked to enter information that will be incorporated
  into your certificate request.
  What you are about to enter is what is called a Distinguished Name or a DN.
  There are quite a few fields but you can leave some blank
  For some fields there will be a default value,
  If you enter '.', the field will be left blank.
  -----
  Country Name (2 letter code) [US]:<strong>IT</strong>
  State or Province Name (full name) [Pennsylvania]:<strong>Italia</strong>
  Locality Name (eg, city) []:<strong>Bergamo</strong>
  Organization Name (eg, company) [Internet Widgits Pty Ltd]:<strong>Casa</strong>
  Organizational Unit Name (eg, section) []:<strong>Server</strong>
  Common Name (eg, YOUR name) []:<strong>nomemacchina.nomedominio</strong>
  Email Address []:<strong>mioindirizzoposta</strong>
  Please enter the following 'extra' attributes
  to be sent with your certificate request
  A challenge password []:
  An optional company name []:
  Using configuration from /usr/lib/ssl/openssl.cnf
  Enter pass phrase for ./demoCA/private/cakey.pem:<strong>password</strong>
  ...
  # openssl req -new -nodes -subj '/CN=nomemacchina.nomedominio/O=Casa/C=IT/ST=Italia/L=Bergamo/emailAddress=mioindirizzoposta' -keyout gmail.key -out gmail.req -days 3650
  # openssl ca -out gmail.pem -infiles gmail.req
  Using configuration from /usr/lib/ssl/openssl.cnf
  Enter pass phrase for ./demoCA/private/cakey.pem:<strong>password</strong>
  ...</pre>
<p>Al riavvio di Postfix dovrei poter inviare messaggi tramite Gmail, che risulterà dai log con un messaggio di questo tipo:</p>
<pre>Jul 25 11:36:52 server postfix/smtp[28745]: 8C31415DF79: to=&lt;pippo@pippo.com&gt;, relay=smtp.gmail.com[64.233.183.109]:587, delay=6.5, delays=0.0 5/0.05/3.8/2.7, dsn=2.0.0, status=sent (250 2.0.0 OK 1216978613 i4sm31861110nfh.1)</pre>
]]></content:encoded>
			<wfw:commentRss>http://bglug.it/2008/08/05/postfix-nirvana-parte-ii/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Postfix nirvana &#8211; Parte I</title>
		<link>http://bglug.it/2008/07/24/postfix-nirvana-parte-i/</link>
		<comments>http://bglug.it/2008/07/24/postfix-nirvana-parte-i/#comments</comments>
		<pubDate>Thu, 24 Jul 2008 04:29:37 +0000</pubDate>
		<dc:creator>jimmi</dc:creator>
				<category><![CDATA[Documentazione]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[amavis]]></category>
		<category><![CDATA[clamav]]></category>
		<category><![CDATA[dovecot]]></category>
		<category><![CDATA[fetchmail]]></category>
		<category><![CDATA[horde]]></category>
		<category><![CDATA[mailserver]]></category>
		<category><![CDATA[postfix]]></category>
		<category><![CDATA[postfixadmin]]></category>
		<category><![CDATA[postgrey]]></category>
		<category><![CDATA[spamassassin]]></category>

		<guid isPermaLink="false">http://bglug.it/?p=71</guid>
		<description><![CDATA[Questa è la prima parte della guida, e tratta delle impostazioni di base di Postfix. Nella seconda parte verranno affrontati i programmi accessori. Questo documento, scritto a quattro mani con Manuel, spiega come configurare un server di posta in modo da avere nel proprio sistema utenti, sia reali sia virtuali, che possono accedere tramite interfaccia [...]]]></description>
			<content:encoded><![CDATA[<p><em>Questa è la prima parte della guida, e tratta delle impostazioni di base di Postfix. Nella <a title="BgLUG" href="http://bglug.it/2008/08/05/postfix-nirvana-parte-ii/" target="_blank">seconda parte</a> verranno affrontati i programmi accessori.</em></p>
<p>Questo documento, scritto a quattro mani con Manuel, spiega come configurare un server di posta in modo da avere nel proprio sistema utenti, sia reali sia virtuali, che possono accedere tramite interfaccia web alle loro caselle e-mail, con protezione da virus, worm e spam.</p>
<p><span id="more-71"></span></p>
<h3>Sommario</h3>
<ul>
<li><a href="#htoc1">Introduzione</a></li>
<li><a href="#htoc2">Postfix: configurazione di base</a></li>
<li><a href="#htoc3">Amavisd-new, Spamassassin, ClamAV</a></li>
<li><a href="#htoc4">Postgrey</a></li>
<li><a href="#htoc5">Postfix e i suoi controlli anti-UCE</a></li>
</ul>
<h3><a name="htoc1">Introduzione</a></h3>
<p>Per utente virtuale si intende qualcuno che non ha un account fisico sulla macchina (non c’è alcun suo riferimento nel file /etc/passwd) ed esiste solo per il sistema di posta. La gestione di questi utente avviene tramite interfaccia web e i loro dati sono registrati su un database SQL.</p>
<p>I mezzi scelti per conseguire lo scopo sono:</p>
<ul>
<li><a title="Postfix" href="http://www.postfix.org/" target="_blank">Postfix 2.3.8<br />
</a></li>
<li><a title="Amavisd-new" href="http://www.ijs.si/software/amavisd/" target="_blank">Amavisd-new 2.4.2</a></li>
<li><a title="Clamav" href="http://clamav.net/" target="_blank">Clamav 0.93.1</a></li>
<li><a title="Spamassassin" href="http://spamassassin.apache.org/" target="_blank">Spamassassin 3.2.3</a></li>
<li><a title="Postgrey" href="http://postgrey.schweikert.ch/" target="_blank">Postgrey 1.27</a></li>
<li><a title="Postfixadmin" href="http://postfixadmin.sourceforge.net/" target="_blank">Postfixadmin 2.2.0</a></li>
<li><a title="Dovecot" href="http://dovecot.org/" target="_blank">Dovecot 1.0<br />
</a></li>
<li><a title="Horde" href="http://horde.org/" target="_blank">Horde 3.1.3<br />
</a></li>
<li><a title="Fetchmail" href="http://www.fetchmail.info/" target="_blank">Fetchmail 6.3.6<br />
</a></li>
</ul>
<p>Per questa installazione ho inoltre utilizzato:</p>
<ul>
<li><a title="Apache" href="http://apache.org/" target="_blank">Apache 2.2.3 </a></li>
<li><a title="MySQL" href="http://www.mysql.com/" target="_blank">MySQL 5.0.32</a></li>
<li><a title="PHP" href="http://www.php.net/" target="_blank">PHP 4.4.4</a></li>
</ul>
<p>la cui configurazione va però oltre gli scopi di questo howto. Tutti questi software sono stati installati partendo dai pacchetti offerti dalla distribuzione Debian Etch. Le principali fonti di ispirazione sono stati un howto precedentemente scritto da Manuel, <a title="Howtoforge" href="http://www.howtoforge.com/virtual_postfix_mysql_quota_courier" target="_blank">Howtoforge</a>, i wiki di <a title="Dovecot" href="http://wiki.dovecot.org/" target="_blank">Dovecot</a>, <a title="Horde" href="http://wiki.horde.org/WikiHome?referrer=WikiHome" target="_blank">Horde</a>, <a title="Debian" href="http://wiki.debian.org/Horde" target="_blank">Debian</a> e <a title="Debian Administration" href="http://www.debian-administration.org/articles/259" target="_blank">Debian Administration</a>.</p>
<h3><a name="htoc2">Postfix: configurazione di base</a></h3>
<p>Prima di procedere all&#8217;installazione di Postfix occorre assicurarsi che la propria macchina sia FQDN, cioè abbia un nome corretto (per intenderci, al comando hostname deve rispondere qualsiasi cosa che non sia localhost o localhost.localdomain). Per questo occorre impostare il nome macchina e settare il file <code>/etc/hosts</code> correttamente.</p>
<p>I principali file di configurazione sono due: <code>main.cf</code> in cui stanno tutti i parametri della parte MTA e <code>master.cf</code> in cui stanno i parametri del demone, ed entrambi si trovano in <code>/etc/postfix</code>.</p>
<p>Il <code>main.cf</code> ha moltissime opzioni (potete trovare <a title="Postfix" href="http://www.postfix.org/postconf.5.html">qui</a> un elenco completo); vediamo le più importanti (che vanno modificate rispetto al default):</p>
<pre># questa sezione riguarda le mail 'rimbalzate' :
# si specifica cosa notificare e a quale account

soft_bounce = no
notify_classes = resource, software, bounce, policy, protocol
2bounce_notice_recipient = postmaster

myhostname = nomemacchina.nomedominio
mydomain = nomedominio

# qui si dice a postfix da quali interfacce
# accettare posta

inet_interfaces = all

# myorigin è il dominio che viene aggiunto alle mail inviate
# dagli utenti locali, mentre mydestination è l'elenco dei
# domini che postfix identifica come locali. NON vanno
# elencati qui i domini virtuali.

myorigin = $myhostname
mydestination = $myhostname

# mynetworks è importantissimo: si deve settare in maniera
# corretta altrimenti si può diventare degli open-relay: in
# questa situazione chiunque da internet può usare il nostro
# postfix per inviare posta e si rischia la blacklist
# (e quindi essere di fatto tagliati fuori in partenza)
# un buon test di open-relay sul proprio MTA è questo:
# $telnet relay-test.mail-abuse.org

mynetworks = 127.0.0.0/8, ip.della.rete
relay_domains = $mydestination

# qui abbiamo indicato alcune 'mappe' necessarie per il
# funzionamento dell' MTA. Si noti che hash: indica che
# quella mappa deve essere messa sotto forma di
# database Berkeley (vedremo poi come).

alias_maps = hash:/etc/postfix/aliases
alias_database = hash:/etc/postfix/aliases
sender_canonical_maps = hash:/etc/postfix/sender_canonical</pre>
<p>per ora il <code>master.cf</code> non va toccato.</p>
<p>Sono da controllare anche il file <code>aliases</code> e il <code>sender_canonical</code>.</p>
<p>Nel file <code>aliases</code> ci sono i riferimenti ai vari utenti e serve per decidere chi è il destinatario delle mail: va modificato specificando a chi va recapitata la posta di root, solitamente l&#8217;utente di &#8216;manutenzione&#8217; che utilizzate nel vostro sistema (non usate root per queste cose, vero?). Ad ogni modifica del file aliases deve seguire il comando:</p>
<pre># postalias /etc/postfix/aliases</pre>
<p>per aggiornare il database aliases, che viene scritto nel file <code>aliases.db</code>.</p>
<p>Attenzione perché può esistere anche un file <code>/etc/aliases</code>: è quello che utilizza sendmail, e per il nostro sistema di posta non serve (ogni modifica a quel file risulta ininfluente).</p>
<p>Il <code>sender_canonical</code> invece serve per tradurre gli account degli utenti locali in indirizzi di posta elettronica. Una volta modificato occorre dare:</p>
<pre># postmap /etc/postfix/sender_canonical</pre>
<p>se tutto è ok si può far partire postfix e testarlo con:</p>
<pre># telnet 127.0.0.1 25
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
220  ESMTP Postfix</pre>
<h3><a name="htoc3">Amavisd-new, Spamassassin, ClamAV</a></h3>
<p>La configurazione che ho effettuato fino ad ora è sufficiente per un valido, robusto e sicuro sistema di posta. Purtroppo però si sente sempre più l&#8217;esigenza di proteggere da virus e spam gli utenti: in prima battuta non ci si pensa, ma se un nostro cliente ha un virus che invia mail a raffica la cosa si ripercuote anche su di noi, sovraccaricando il nostro MTA e rischiando di farlo finire in qualche black-list da cui è poi difficile uscire&#8230;</p>
<p>Amavisd-new è una delle versioni demone di amavis-perl; gli aspetti più interessanti sono:<br />
- un&#8217;ottima integrazione con postfix<br />
- può utilizzare diversi software antivirus (anche più di uno sulla stessa macchina)<br />
- può invocare direttamente spamd (il demone di spamassassin) e</p>
<p>Sia Spamassassin che ClamAV  devono essere costantemente aggiornati per essere efficaci, cosa che non è sempre garantita con i repository di Debian. Per questa ragione è consigliabile scaricarli dai repository di volatile, aggiungendo a <code>/etc/apt/sources.list</code> la riga:</p>
<pre>deb http://ftp2.de.debian.org/debian-volatile sarge/volatile main</pre>
<p>per installare il tutto eseguo da riga di comando:</p>
<pre># apt-get update
# apt-get install amavisd-new spamassassin clamav clamav-daemon clamav-freshclam zoo unzip bzip2 unzoo nomarch lzop pax</pre>
<p>Passo quindi alla configurazione. È necessario abilitare ClamAV e Spamassassin in <code>/etc/amavis/conf.d/15-content_filter_mode</code>, che dovrà avere questo aspetto:</p>
<pre>use strict;

# You can modify this file to re-enable SPAM checking
# through spamassassin and to re-enable antivirus checking.

#
# Default antivirus checking mode
# Uncomment the two lines below to enable it back
#

@bypass_virus_checks_maps = (
   \%bypass_virus_checks, \@bypass_virus_checks_acl, \$bypass_virus_checks_re);

#
# Default SPAM checking mode
# Uncomment the two lines below to enable it back
#

@bypass_spam_checks_maps = (
   \%bypass_spam_checks, \@bypass_spam_checks_acl, \$bypass_spam_checks_re);
1;  # ensure a defined return</pre>
<p>ed è consigliabile aggiungere la riga</p>
<pre>$pax='pax';</pre>
<p>nel file <code>/etc/amavis/conf.d/50-user</code>. Normalmente le impostazioni di default contenute in <code>/etc/amavis/conf.d/20-debian_defaults</code> non devono essere modificate. Riavvio i demoni con:</p>
<pre>/etc/init.d/amavis restart
/etc/init.d/clamav-daemon restart
/etc/init.d/clamav-freshclam restart</pre>
<p>e posso proseguire nella configurazione di Postfix. Per fare in modo che le mail vengano inoltrate al demone di amavisd-new aggiungo le seguenti righe a <code>/etc/postfix/main.cf</code>:</p>
<pre>content_filter = amavis:[127.0.0.1]:10024
receive_override_options = no_address_mappings</pre>
<p>e poi aggiungo le seguenti in <code>/etc/postfix/master.cf</code>:</p>
<pre>amavis unix - - - - 2 smtp
        -o smtp_data_done_timeout=1200
        -o smtp_send_xforward_command=yes

127.0.0.1:10025 inet n - - - - smtpd
        -o content_filter=
        -o local_recipient_maps=
        -o relay_recipient_maps=
        -o smtpd_restriction_classes=
        -o smtpd_client_restrictions=
        -o smtpd_helo_restrictions=
        -o smtpd_sender_restrictions=
        -o smtpd_recipient_restrictions=permit_mynetworks,reject
        -o mynetworks=127.0.0.0/8
        -o strict_rfc821_envelopes=yes
        -o receive_override_options=\
        no_unknown_recipient_checks,no_header_body_checks
        -o smtpd_bind_address=127.0.0.1</pre>
<p>Faccio ripartire postfix e con &#8220;<code>netstat -tap</code>&#8221; vedo Postfix (master) in ascolto sulle porte 25 (smtp) e 10025 e amavisd-new sulla porta 10024. Dopo aver spedito o ricevuto alcune e-mail posso verificare il funzionamento di tutto nei log.</p>
<p>ClamAV non ha solitamente bisogno di alcuna impostazione particolare. Il demone <em>freshclam</em> provvederà a tenere sempre aggiornato il database dei virus. Debian durante l&#8217;installazione crea già gli utenti e i gruppi necessari. Sarà sufficiente aggiungere l&#8217;utente <em>clamav</em> al gruppo <em>amavis</em> e riavviare i demoni con i comandi:</p>
<pre># adduser clamav amavis
# /etc/init.d/amavis restart
# /etc/init.d/clamav-daemon restart
# /etc/init.d/clamav-freshclam restart</pre>
<p>Spamassassin è un software scritto in Perl in grado di identificare e bloccare la posta indesiderata (chiamata spam, UCE &#8211; unsollicited commercial e-mail oppure anche UBE &#8211; unsollicited bulk e-mail) con una buona accuratezza tramite una serie di test euristici sugli headers e sul corpo della mail.</p>
<p>Come impostazioni di base, è richiesto a Spamassassin di raggiungere un punteggio pari a 6.3 per identificare la mail come spam; io ho abbassato la soglia fino a 5 impostando in <code>/etc/spamassassin/local.cf</code>:</p>
<pre>required_score           5.0</pre>
<p>e fino ad ora non mi è mai capitato che abbia bloccato una mail che non fosse spam, ed ha lasciato passare alcune e-mail che invece lo erano. Ovviamente non si può garantire un’ accuratezza del 100% perché si rischierebbe di stringere troppo i controlli ed avere troppi falsi positivi.</p>
<p>A questo punto per Debian modifico il file /etc/default/spamassassin con:</p>
<pre>ENABLED=1</pre>
<p>Ed avvio il demone:</p>
<pre># /etc/init.d/spamassassin start</pre>
<p>Una delle caratteristiche più utili di Spamassassin sono i filtri &#8220;bayesiani&#8221; che filtrano le mail sulla base di sequenze di caratteri che compaiono spesso nello spam, e che vengono abilitati in <code>/etc/spamassassin/local.cf</code> dalle righe:</p>
<pre># Enable the Bayes system
use_bayes               1

bayes_path /var/lib/amavis/.spamassassin/bayes

# Enable Bayes auto-learning
bayes_auto_learn              1</pre>
<p>la seconda riga dice dove si trova il database, l&#8217;indirizzo è quello della configurazione standard di Debian, e l&#8217;ultima attiva l&#8217;autoapprendimento, che inizierà al riavvio Spamassassin. Per fargli apprendere più velocemente è possibile dargli in pasto delle directory contenenti spam o mail &#8220;pulite&#8221;, loggandosi come utente amavis e dando i comandi:</p>
<pre>sa-learn --spam -C /var/lib/amavis/.spamassassin/ --showdots [directorySPAM]
sa-learn --ham -C /var/lib/amavis/.spamassassin/ --showdots [directoryHAM]</pre>
<p>Per tenere le regole sempre aggiornate posso scaricare periodicamente i file configurazione (rules, scores, etc.) inserendo in crontab una riga tipo:</p>
<pre>0 4 * * * sa-update &amp;&amp; /etc/init.d/spamd restart</pre>
<p>È anche possibile aggiungere a Spamassassin moduli come Razor2, Pyzor, DCC, ma questo va un poco oltre lo scopo di questo howto, quindi vi rimando alla <a title="HowtoForge" href="http://www.howtoforge.com/virtual-users-domains-postfix-courier-mysql-squirrelmail-ubuntu8.04-p3" target="_blank">documentazione specifica</a>.</p>
<h3><a name="htoc4">Postgrey</a></h3>
<p>I filtri tipo greylist sono uno dei recenti metodi di lotta allo SPAM, e si basano sul fatto che la maggior parte degli spammer inviano i messaggi attraverso server che non gestiscono una coda per la ritrasmissione dei messaggi falliti. Quando una mail viene ricevuta per la prima volta viene registrata la tripletta server/mittente/destinatario e viene respinta con un messaggio 450 di errore temporaneo. I server di cui sopra non riproveranno, mentre un server regolare dovrebbe riprovare l&#8217;invio dopo qualche minuto, quando il nostro server, dopo aver verificato la tripletta, lo accetterà. Questo provoca un ritardo nella ricezione di tutte le e-mail, ma evita la ricezione di gran parte dello spam.</p>
<p>Debian mette a disposizione Posgrey, che implementa una greylist in Postfix. L&#8217;installazione si esegue come sempre con:</p>
<pre># apt-get install postgrey</pre>
<p>dopo l&#8217;installazione trovo il demone in ascolto sulla porta 60000, come posso verificare con:</p>
<pre># netstat -anp | grep 60000
tcp        0      0 127.0.0.1:60000         0.0.0.0:*               LISTEN     18478/postgrey.pid</pre>
<p>Per fare in modo che Postfix usi il demone devo aggiungere la seguente riga in /etc/postfix/main.cf, tra le &#8220;smtpd_recipient_restrictions&#8221;:</p>
<pre>check_policy_service inet:127.0.0.1:60000</pre>
<p>Controllando il log posso vedere il tutto funzionare alla prima ricezione</p>
<h3><a name="htoc5">Postfix e i suoi controlli anti-UCE</a></h3>
<p>Postfix prevede la possibilità di effettuare un certo numero di test sulle mail in transito: è possibile controllare gli headers e il corpo del messaggio, mittenti e i destinatari, parti mime ed allegati. Lo svantaggio è che tutto questo causa un forte appesantimento del sistema di posta, e l&#8217;accuratezza non è molto elevata (c&#8217;è il rischio di avere molti falsi positivi e falsi negativi).</p>
<p>Nel main.cf possiamo specificare questi controlli (che sono una piccola parte rispetto a quelli disponibili):</p>
<pre># vengono specificate le tavole con cui confrontare le mail
# in transito. Se sul vostro sistema è installato pcre è
# consigliabile utilizzare questo al posto delle regexp per
# questioni di velocità.
#header_checks = regexp:/etc/postfix/header_checks
#body_checks = regexp:/etc/postfix/body_checks
header_checks = pcre:/etc/postfix/header_checks
body_checks = pcre:/etc/postfix/body_checks

# si controlla la parte mime degli headers del messaggio
#mime_header_checks = regexp:/etc/postfix/mime_header_checks
mime_header_checks = pcre:/etc/postfix/mime_header_checks

# si richiede che chi si collega al nostro server smtp
# invii un helo/ehlo (alcuni spammer non lo fanno...)
smtpd_helo_required = yes

# il controllo lo si può fare sul mittente, sul destinatario
# o sul recipient (che è l'ultimo ad essere specificato
# nella mail) è preferibile fare il controllo sul recipient e
# non sul sender per poter avere il maggior numero di
# informazioni sulla mail che viene bloccata e’ anche
# possibile inserire, tra i vari server che mantengono le
# black-list, la riga reject_rbl_client dnsbl.sorbs.net,
# Il problema e’ che in questo database sono elencati
# alcuni server smtp italiani molto usati, tra i quali quello
# di libero ed alcuni di telecom italia...
#smtpd_client_restrictions =
#smtpd_sender_restrictions =
smtpd_recipient_restrictions =  permit_mynetworks,
                                check_sender_access hash:/etc/postfix/access,
                                check_recipient_access hash:/etc/postfix/access,
                                check_client_access hash:/etc/postfix/access,
                                reject_invalid_hostname,
                                reject_non_fqdn_sender,
                                reject_unknown_sender_domain,
                                reject_unauth_destination,
                                reject_rhsbl_client blackhole.securitysage.com,
                                reject_rhsbl_sender blackhole.securitysage.com,
                                reject_rbl_client bl.spamcop.net,
                                reject_rbl_client l1.spews.dnsbl.sorbs.net,
                                reject_rbl_client dul.spews.dnsbl.sorbs.net,
                                reject_rbl_client sbl-xbl.spamhaus.org,
                                reject_rbl_client combined.njabl.org

# non è esattamente un controllo anti-UCE, ma se ci sono
# utenti non più attivi che ricevono e-mail valide può essere
# utile avvisare il mittente che l’indirizzo non è più
# valido, ed eventualmente comunicare il nuovo indirizzo.
relocated_maps = hash:/etc/postfix/relocated</pre>
<p>Vediamo più da vicino queste mappe (e come si compilano): alcune sono di tipo <em>hash</em> ed altre di tipo <em>pcre</em> (o regexp). Per quelle di tipo hash occorre dare il comando postmap prima di riavviare postfix per aggiornare il database, mentre per le altre basta solamente riavviare il demone postfix.</p>
<p><strong>/etc/postfix/body_checks  (pcre o regexp)</strong></p>
<p>la forma in cui devono essere messe le regole è:</p>
<pre>/pattern/      AZIONE	MOTIVAZIONE</pre>
<p>Tra pattern, azione e motivazione ci deve essere almeno uno spazio; per questioni di chiarezza visiva mi piace impaginare il file utilizzando vari [tab] in maniera da avere tutto incolonnato.</p>
<p>Un esempio di body_checks è:</p>
<pre># il testo che vogliamo intercettare va messo tra / /, e può
# contenere spazi. La clausola REJECT indica il rifiuto del
# messaggio (ce ne sono altre: OK, WARN, ecc..)
# [A10] è un codice univoco che utilizzo io per capire quale
# testo ha causato il rifiuto del messaggio (utile ad
# esempio per testare le regole) il mittente riceverà in
# questo caso un messaggio di bounce con la motivazione:
# [A10] Your email had spam-like body contents.
# Si può leggere il file sample-pcre-body.cf.

/sono spammer/ 	REJECT [A10] Your email had spam-like body contents.</pre>
<p>si può anche andare sul complicato utilizzando le espressioni regolari:</p>
<pre># così io impedisco il recapito di mail con allegati dei file aventi
# estensioni che fanno supporre  la presenza di virus; come visto
# prima si può mettere un testo dopo il reject che spiega la
# motivazione e suggerisce di zippare l'allegato per poterlo inviare.

/name=".*\.(com|exe|bat|cmd)"/            REJECT [1] Filetype not permitted, please ZIP them
/name=".*\.(hta|vb[esx]|wsf|wsh|js|jse)"/ REJECT [2] Filetype not permitted, please ZIP them
/name=".*\.(shb|shs|lnk|chm|pif|scr)"/    REJECT [3] Possible virus attachment
/^TVqQAAMAAAAEAAAA\/\/8AALgAAAAAAAAAQAAA/ REJECT [4] Possible virus attachment</pre>
<p><strong>/etc/postfix/header_checks  (pcre o regexp)</strong></p>
<p>la forma è la medesima di body_ckecks, ma in questo caso dobbiamo specificare gli headers:</p>
<pre># si lavora ad esempio sul programma con cui è stata creata
# la mail, sul soggetto, ma ci si può sbizzarrire...

/^X-Mailer: Floodgate/  REJECT [A19] Spam-like header contents.
/^Subject: .*Super Viagra/  	REJECT [B09] Spam-like Subject.

# possiamo anche bloccare mittenti e destinatari, in modo molto
# similare a quel che fa /etc/postfix/access
# per maggiori informazioni si veda il file sample-pcre-header.cf

/^From:.*utente@dominio*$/      	REJECT This account sends spam.
/^To:.*utente@dominio.locale*$/ 	REJECT This account isn't active.</pre>
<p><strong>/etc/postfix/mime_header_checks  (pcre o regexp)</strong></p>
<p>è una tavola specifica per le estensioni mime, che possono sfuggire ai controlli sul body e sugli headers; la sintassi è del tutto simile ai due file precedenti.<br />
Io utilizzo clausole molto simili a questa:</p>
<pre># blocco i file .pif (e allo stesso modo qualsiasi file con
# estensione pericolosa).

/name=[^&gt;]*\.pif/ 			REJECT Files .pif may contain viruses.</pre>
<p><strong>/etc/postfix/access  (hash)</strong></p>
<p>Come detto, serve specificamente per intercettare mittenti o destinatari indesiderati.<br />
La sintassi prevede 3 categorie su cui effettuare i confronti: un utente ben determinato, un certo utente di qualsiasi dominio o tutti gli utenti di un certo dominio.</p>
<p>Ad esempio:</p>
<pre># occorre specificare il codice e la risposta che postfix restituisce
# al mittente. Nei primi due casi andiamo in match su indirizzi e-mail
# completi nel terzo esempio il confronto lo si fa sull’utente e nel
# quarto sul dominio per altre informazioni man 5 access
# oppure sample-pcre-access.cf

utente1@dominio1  			550 You are a spammer!
pippo@dominio2				550 This account is no longer active
utente@      				550 Your email comes from a blacklisted address
dominio      				550 Your email comes from a blacklisted domain</pre>
<p>Il file access e’ anche importante per effettuare delle whitelist sugli indirizzi da accettare, anche se provengono da utenti, domini o indirizzi IP elencati in qualche black-list.</p>
<p>In particolare dobbiamo, nel rispetto delle RFC, accettare qualsiasi cosa indirizzato alla casella postmaster ed eventualmente alla abuse.</p>
<p>Quindi inseriamo:</p>
<pre>postmaster@nomedominio		OK
abuse@nomedominio		OK</pre>
<p>Se qualche nostro utente vuole ricevere posta da utenti in BL, possiamo elencare qui i mittenti specifici o l’intero dominio di appartenenza:</p>
<pre>utente@dominioinbl		OK
dominioinbl			OK</pre>
<p style="text-align: right;"><a title="BgLUG" href="http://bglug.it/2008/08/05/postfix-nirvana-parte-ii/" target="_blank"><em>Continua&#8230;</em></a></p>
]]></content:encoded>
			<wfw:commentRss>http://bglug.it/2008/07/24/postfix-nirvana-parte-i/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

