Internet Service Provider con Debian: differenze tra le versioni

Vai alla navigazione Vai alla ricerca
nessun oggetto della modifica
Nessun oggetto della modifica
 
(95 versioni intermedie di 4 utenti non mostrate)
Riga 1: Riga 1:
{{Versioni compatibili|Lenny|Squeeze|Wheezy}}
{{Versioni compatibili|Lenny|Squeeze|Wheezy}}
{{Warningbox|La guida NON è compatibile con Jessie. E' in fase di realizzazione una nuova guida.}}
<br/>
== Introduzione ==
== Introduzione ==
In questa guida cercheremo di raccogliere tutte le informazioni per arrivare a un'installazione di Debian che fornisca i seguenti servizi, comuni presso qualsiasi Internet Service Provider:
In questa guida cercheremo di raccogliere tutte le informazioni per arrivare a un'installazione di Debian che fornisca i seguenti servizi, comuni presso qualsiasi Internet Service Provider:
Riga 19: Riga 21:
Può essere utile impostare anche un server NTP esterno per sincronizzare l'ora del nostro server con un'autorità nazionale: [[Impostare e modificare data e ora]].
Può essere utile impostare anche un server NTP esterno per sincronizzare l'ora del nostro server con un'autorità nazionale: [[Impostare e modificare data e ora]].
<br/>
<br/>
Poichè il server andrà quasi sicuramente gestito da remoto occorrerà installare e configurare anche l'accesso SSH ([[OpenSSH: configurazione di base]]) con autenticazione via chiave: [[Ssh e autenticazione tramite chiavi]].
Poichè il server andrà quasi sicuramente gestito da remoto occorrerà installare e configurare anche l'accesso SSH ([[SSH | guida su SSH]]) con autenticazione via chiave.


=== Installazione ambiente LAMP ===
=== Installazione ambiente LAMP ===
Riga 155: Riga 157:
<br/>
<br/>
<br/>
<br/>
{{Warningbox|DEPRECATO: al posto di Roundcube è possibile installare una diversa interfaccia webmail, Squirrelmail:}}
{{Warningbox|DEPRECATO: al posto di Squirrelmail è possibile installare una diversa interfaccia webmail, Roundcube:}}
<pre>
<pre>
# aptitude install squirrelmail
# aptitude install squirrelmail
Riga 185: Riga 187:
e proteggiamolo:
e proteggiamolo:
<pre>
<pre>
# chmod 600= /etc/ssl/private/mailserver.pem
# chmod 600 /etc/ssl/private/mailserver.pem
</pre>
</pre>


Riga 316: Riga 318:
query = SELECT 1 FROM virtual_domains WHERE name='%s'
query = SELECT 1 FROM virtual_domains WHERE name='%s'
</pre>
</pre>
{{Box|NOTA|Potrebbe venirvi la tentazione di scrivere "localhost" al posto di "127.0.0.1" nel file precedente. Non va fatto!! "localhost" farà sì che Postfix cerchi il file socket MySQL, non trovandolo perchè gira in una chroot hail. Al contrario "127.0.0.1" utilizzerà una connessione TCP sulla porta 3306, che risponderà anche se Postfix funziona all'interno di una gabbia chroot}}
{{Box|NOTA|Potrebbe venirvi la tentazione di scrivere "localhost" al posto di "127.0.0.1" nel file precedente. Non va fatto!! "localhost" farà sì che Postfix cerchi il file socket MySQL, non trovandolo perchè gira in una chroot jail. Al contrario "127.0.0.1" utilizzerà una connessione TCP sulla porta 3306, che risponderà anche se Postfix funziona all'interno di una gabbia chroot}}
<br/>
<br/>
Adesso dobbiamo fare in modo che Postfix utilizzi questa mappatura:
Adesso dobbiamo fare in modo che Postfix utilizzi questa mappatura:
Riga 482: Riga 484:
<pre>
<pre>
dovecot  unix  -      n      n      -      -      pipe
dovecot  unix  -      n      n      -      -      pipe
    flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -d ${recipient}
  flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/dovecot-lda -f ${sender} -d ${recipient}
</pre>
</pre>
'''Nota''': la seconda riga deve essere indentata con degli spazi e non con il TAB.
'''Nota''': la seconda riga deve essere indentata con degli spazi e non con il TAB.
Riga 488: Riga 490:
A questo punto non resta che riavviare Postfix:
A questo punto non resta che riavviare Postfix:
<pre>
<pre>
# postfix reload
# service postfix restart
</pre>
</pre>
e fare in modo che utilizzi il servizio appena creato per lo smistamento delle email, modificando il file <code>/etc/postfix/main.cf</code> nella maniera vista in precedenza:
e fare in modo che utilizzi il servizio appena creato per lo smistamento delle email, modificando il file <code>/etc/postfix/main.cf</code> nella maniera vista in precedenza:
Riga 516: Riga 518:
Siamo pronti per iniziare. I files di configurazione di Dovecot si trovano in <code>/etc/dovecot</code>.
Siamo pronti per iniziare. I files di configurazione di Dovecot si trovano in <code>/etc/dovecot</code>.
<br/>
<br/>
Fino a Debian Squeeze la configurazione di Dovecot era tutta contenuta in due file; da Debian Wheezy la configurazione è stata spezzata in una trentina di file, contenuti tutti nella directory <tt>/etc/dovecot/conf.d</tt>. Il file di configurazione principale <tt>/etc/dovecot/dovecot.conf</tt> non richiede alcuna modifica e attraverso la direttiva
Fino a Debian Squeeze la configurazione di Dovecot era tutta contenuta in due file; da Debian Wheezy la configurazione è stata spezzata in una trentina di file, contenuti tutti nella directory <code>/etc/dovecot/conf.d</code>. Il file di configurazione principale <code>/etc/dovecot/dovecot.conf</code> non richiede alcuna modifica e attraverso la direttiva
<pre>
<pre>
!include conf.d/*.conf
!include conf.d/*.conf
</pre>
</pre>
carica tutti i file presenti in <tt>/etc/dovecot/conf.d/</tt> che terminano in ".conf" in sequenza. Quindi "10-auth.conf" sarà caricato per primo e "90-quota.conf" per ultimo. Il grosso vantaggio di questa situazione è che potremo modificare o rimpiazzare parti della configurazione senza sovrascriverla interamente; lo svantaggio è che la migrazione da una versione precedente di Dovecot può diventare un'operazione difficoltosa.
carica tutti i file presenti in <code>/etc/dovecot/conf.d/</code> che terminano in ".conf" in sequenza. Quindi "10-auth.conf" sarà caricato per primo e "90-quota.conf" per ultimo. Il grosso vantaggio di questa situazione è che potremo modificare o rimpiazzare parti della configurazione senza sovrascriverla interamente; lo svantaggio è che la migrazione da una versione precedente di Dovecot può diventare un'operazione difficoltosa.


==== Fino a Debian Squeeze ====
==== Fino a Debian Squeeze ====
Riga 704: Riga 706:
mail_location = maildir:/var/vmail/%d/%n/Maildir
mail_location = maildir:/var/vmail/%d/%n/Maildir
</pre>
</pre>
Questa sarà la directory dove Dovecot cercherà le email di ogni specifico utente. Ad esempio l'utente <tt> john@example.org</tt> avrà le sue email archiviate in <tt>/var/vmail/example.org/john/Maildir</tt>.
Questa sarà la directory dove Dovecot cercherà le email di ogni specifico utente. Ad esempio l'utente <code> john@example.org</code> avrà le sue email archiviate in <code>/var/vmail/example.org/john/Maildir</code>.
<br/>
<br/>
Cambiamo la direttiva ''auth_socket_path'' in
<pre>
auth_socket_path = /var/run/dovecot/auth-master
</pre>
Cerchiamo la sezione ''namespace inbox''. Se abbiamo già archiviato email sul server e stiamo aggiornando il nostro sistema da Squeeze a Wheezy, allora dobbiamo modificare la direttiva ''separator'' in:
Cerchiamo la sezione ''namespace inbox''. Se abbiamo già archiviato email sul server e stiamo aggiornando il nostro sistema da Squeeze a Wheezy, allora dobbiamo modificare la direttiva ''separator'' in:
<pre>
<pre>
Riga 741: Riga 747:


===== /etc/dovecot/dovecot-sql.conf.ext =====
===== /etc/dovecot/dovecot-sql.conf.ext =====
Questo file è richiamato dal file <tt> /etc/dovecot/conf.d/auth-sql.conf.ext</tt> e dice a Dovecot come accedere al database MySQL e dove trovare le informazioni sugli account. Accertiamoci che contenga le linee:
Questo file è richiamato dal file <code> /etc/dovecot/conf.d/auth-sql.conf.ext</code> e dice a Dovecot come accedere al database MySQL e dove trovare le informazioni sugli account. Accertiamoci che contenga le linee:
<pre>
<pre>
driver = mysql
driver = mysql
Riga 755: Riga 761:
# chgrp vmail /etc/dovecot/dovecot.conf
# chgrp vmail /etc/dovecot/dovecot.conf
# chmod g+r /etc/dovecot/dovecot.conf
# chmod g+r /etc/dovecot/dovecot.conf
</pre>
per lo spool di Postfix:
<pre>
# chown postfix:postfix /var/spool/postfix/private/auth
# chmod 666 /var/spool/postfix/private/auth
</pre>
</pre>
e proteggiamo il file di configurazione SQL in modo che nessuno possa scoprire la password del database:
e proteggiamo il file di configurazione SQL in modo che nessuno possa scoprire la password del database:
Riga 772: Riga 783:


=== Test della configurazione ===
=== Test della configurazione ===
Apriamo un altro terminale e controlliamo i log della posta in tempo reale:
<pre>
# tail -f /var/log/mail.log
</pre>
Dal primo terminale aperto proviamo a inviare una semplice prima mail di prova:
<pre>
# echo test | mail john@example.org
</pre>
Nei log dovremmo trovare qualcosa di simile:
<pre>
Oct 20 17:42:32 sirius postfix/pickup[22273]: A6F8EB55: uid=0 from=<root>
Oct 20 17:42:32 sirius postfix/cleanup[22582]: A6F8EB55: message-id=<20131020154232.A6F8EB55@sirius.localdomain>
Oct 20 17:42:32 sirius postfix/qmgr[22274]: A6F8EB55: from=<root@sirius.workaround.org>, size=287, nrcpt=1 (queue active)
Oct 20 17:42:32 sirius dovecot: auth-worker(22635): mysql(127.0.0.1): Connected to database mailserver
Oct 20 17:42:32 sirius dovecot: lda(john@example.org): msgid=<20131020154232.A6F8EB55@sirius.localdomain>: saved mail to INBOX
Oct 20 17:42:32 sirius postfix/pipe[22586]: A6F8EB55: to=<john@example.org>, relay=dovecot, delay=0.14, delays=0.04/0/0/0.1, dsn=2.0.0, status=sent (delivered via dovecot service)
Oct 20 17:42:32 sirius postfix/qmgr[22274]: A6F8EB55: removed
</pre>
All'interno della directory principale di archiviazione, Dovecot dovrebbe aver creato tutta la struttura di directory per il dominio e per l'utente di test:
<pre>
# find /var/vmail
/var/vmail/
/var/vmail/example.org
/var/vmail/example.org/john
/var/vmail/example.org/john/Maildir
/var/vmail/example.org/john/Maildir/dovecot.index.log
/var/vmail/example.org/john/Maildir/cur
/var/vmail/example.org/john/Maildir/dovecot-uidvalidity.5263f9e8
/var/vmail/example.org/john/Maildir/new
/var/vmail/example.org/john/Maildir/new/1382283752.M737526P22632.sirius,S=352,W=362
/var/vmail/example.org/john/Maildir/dovecot-uidvalidity
/var/vmail/example.org/john/Maildir/tmp
/var/vmail/example.org/john/Maildir/dovecot-uidlist
/var/vmail/example.org/john/Maildir/dovecot.index.cache
</pre>


==== Invio di email tramite telnet ====
==== Invio di email tramite telnet ====
Riga 1 011: Riga 1 057:
# postconf -e smtpd_sasl_path=private/auth
# postconf -e smtpd_sasl_path=private/auth
# postconf -e smtpd_sasl_auth_enable=yes
# postconf -e smtpd_sasl_auth_enable=yes
# postconf -e smtpd_tls_security_level=may
# postconf -e smtpd_tls_auth_only=yes
# postconf -e smtpd_tls_cert_file=/etc/ssl/certs/mailserver.pem
# postconf -e smtpd_tls_key_file=/etc/ssl/private/mailserver.pem
# postconf -e smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination
# postconf -e smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination
</pre>
</pre>
Riga 1 018: Riga 1 068:
** <code>permit_sasl_authenticated</code>: l'utente si è autenticato, oppure
** <code>permit_sasl_authenticated</code>: l'utente si è autenticato, oppure
** <code>reject_unauth_destination</code>: la mail è destinata a un utente di un nostro dominio virtuale
** <code>reject_unauth_destination</code>: la mail è destinata a un utente di un nostro dominio virtuale
 
NOTA: la direttiva <code>postconf -e smtpd_tls_auth_only=yes</code> è da utilizzarsi '''solo''' se vogliamo che i nostri utenti siano costretti a utilizzare SSL per scaricare e inviare la loro posta.
<br/>
<br/>
Riavviamo infine Postfix:
Riavviamo infine Postfix:
<pre>
<pre>
Riga 1 113: Riga 1 165:
==== Configurazione di Spamassassin ====
==== Configurazione di Spamassassin ====


Cambiare o aggiungere i seguenti parametri nel file /etc/spamassassin/local.cf come segue:
Verifichiamo che il demone di SpamAssassin sia attivo, aprendo il file:
<pre>
<pre>
# permette di avere un unico database bayes anziché uno in ogni home degli  user
# nano /etc/default/spamassassin
bayes_path /etc/spamassassin/bayes/bayes
bayes_file_mode 0666
</pre>
</pre>
Successivamente creare la cartella specificata /etc/spamassassin/bayes con i permessi corretti:
e modificando la riga:
<pre>
<pre>
# mkdir /etc/spamassassin/bayes
ENABLED=0
# chmod 777 /etc/spamassassin/bayes
</pre>
</pre>
Controllare se ci sono problemi nella configurazione con il comando:
in
<pre>
ENABLED=1
</pre>
Avviamo SpamAssassin e abilitiamo l'aggiornamento automatico delle regole:
<pre>
# sa-update && service spamassassin restart
</pre>
Controlliamo che il servizio di aggiornamento automatico si sia abilitato, verificando che in <code>/etc/default/spamassassin</code> ci sia la riga:
<pre>
CRON=1
</pre>
Verifichiamo che SpamAssassin sia attivo:
<pre>
# netstat -ntpl | grep spamd
tcp 0 0 127.0.0.1:783 0.0.0.0:* LISTEN 2459/spamd.pid
</pre>
Cambiare o aggiungere i seguenti parametri nel file /etc/spamassassin/local.cf come segue:
<pre>
<pre>
# spamassassin --lint
# permette di avere un unico database bayes anziché uno in ogni home degli  user
bayes_path /etc/spamassassin/bayes/bayes
bayes_file_mode 0666
</pre>
</pre>
che dovrebbe restituire una riga vuota.<br/>
Successivamente creare la cartella specificata /etc/spamassassin/bayes con i permessi corretti:
Verifichiamo che il demone di SpamAssassin sia attivo, aprendo il file:
<pre>
<pre>
# nano /etc/default/spamassassin
# mkdir /etc/spamassassin/bayes
# chmod 777 /etc/spamassassin/bayes
</pre>
</pre>
e modificando la riga:
Controllare se ci sono problemi nella configurazione con il comando:
<pre>
<pre>
ENABLED=0
# spamassassin --lint
</pre>
</pre>
in
che dovrebbe restituire una riga vuota.<br/>
 
==== Configurazione di AMaViS ====
AMaViS (A Mail Virus Scanner) è un'interfaccia tra Postfix, SpamAssassin e un virus scanner come ClamAV.
<br/>
Installiamo i file necessari:
<pre>
<pre>
ENABLED=1
# apt-get install amavisd-new clamav-daemon clamav-testfiles clamav-freshclam
</pre>
</pre>
AMaViS (A Mail Virus Scanner) è un'interfaccia tra Postfix, SpamAssassin e un virus scanner come ClamAV. La configurazione si AMaViS è divisa in alcuni files nella directory <code>/etc/amavis/conf.d</code>.
La configurazione si AMaViS è divisa in alcuni files nella directory <code>/etc/amavis/conf.d</code>.
<br/>
<br/>
Il virus scanner ClamAV è già configurato per default e va solo abilitato modificando il file:
Il virus scanner ClamAV è già configurato per default e va solo abilitato modificando il file:
Riga 1 196: Riga 1 269:
aggiungendo le linee:
aggiungendo le linee:
<pre>
<pre>
smtp-amavis unix -      -      n    -      2 smtp
smtp-amavis unix -      -      n    -      5 smtp
     -o smtp_data_done_timeout=1200
     -o smtp_data_done_timeout=1200
     -o smtp_send_xforward_command=yes
     -o smtp_send_xforward_command=yes
    -o smtp_tls_note_starttls_offer=no
     -o disable_dns_lookups=yes
     -o disable_dns_lookups=yes
     -o max_use=20
     -o max_use=20
Riga 1 220: Riga 1 294:
     -o smtpd_client_connection_count_limit=0
     -o smtpd_client_connection_count_limit=0
     -o smtpd_client_connection_rate_limit=0
     -o smtpd_client_connection_rate_limit=0
     -o receive_override_options=no_header_body_checks,no_unknown_recipient_checks
     -o receive_override_options=no_header_body_checks,no_unknown_recipient_checks,no_milters
     -o local_header_rewrite_clients=
     -o local_header_rewrite_clients=
    -o smtpd_milters=
</pre>
</pre>
Quindi riavviamo Postfix:
Quindi riavviamo Postfix:
Riga 1 268: Riga 1 343:
Come ultima cosa modifichiamo i permessi del file in modo che nessun utente non autorizzato possa leggere la password del nostro database:
Come ultima cosa modifichiamo i permessi del file in modo che nessun utente non autorizzato possa leggere la password del nostro database:
<pre>
<pre>
# chmod o= /etc/amavis/conf.d/50-user
# chmod 640 /etc/amavis/conf.d/50-user
</pre>
Testiamo il funzionamento di ClamAV:
<pre>
# clamdscan /usr/share/clamav-testfiles/
/usr/share/clamav-testfiles/clam.pdf: ClamAV-Test-File FOUND
/usr/share/clamav-testfiles/clam.chm: ClamAV-Test-File FOUND
/usr/share/clamav-testfiles/clam.sis: ClamAV-Test-File FOUND
/usr/share/clamav-testfiles/clam.impl.zip: ClamAV-Test-File FOUND
/usr/share/clamav-testfiles/clam-nsis.exe: ClamAV-Test-File FOUND
/usr/share/clamav-testfiles/clam.tar.gz: ClamAV-Test-File FOUND
/usr/share/clamav-testfiles/clam.bz2.zip: ClamAV-Test-File FOUND
/usr/share/clamav-testfiles/clam.7z: ClamAV-Test-File FOUND
/usr/share/clamav-testfiles/clam-yc.exe: ClamAV-Test-File FOUND
/usr/share/clamav-testfiles/clam.ole.doc: ClamAV-Test-File FOUND
/usr/share/clamav-testfiles/clam.newc.cpio: ClamAV-Test-File FOUND
/usr/share/clamav-testfiles/clam-aspack.exe: ClamAV-Test-File FOUND
/usr/share/clamav-testfiles/clam.ppt: ClamAV-Test-File FOUND
/usr/share/clamav-testfiles/clam.ea05.exe: ClamAV-Test-File FOUND
/usr/share/clamav-testfiles/clam.ea06.exe: ClamAV-Test-File FOUND
/usr/share/clamav-testfiles/clam.exe: ClamAV-Test-File FOUND
/usr/share/clamav-testfiles/clam.exe.html: ClamAV-Test-File FOUND
/usr/share/clamav-testfiles/clam-upack.exe: ClamAV-Test-File FOUND
/usr/share/clamav-testfiles/clam.exe.bz2: ClamAV-Test-File FOUND
/usr/share/clamav-testfiles/clam.bin-be.cpio: ClamAV-Test-File FOUND
/usr/share/clamav-testfiles/clam.cab: ClamAV-Test-File FOUND
/usr/share/clamav-testfiles/clam.exe.mbox.base64: ClamAV-Test-File FOUND
/usr/share/clamav-testfiles/clam.arj: ClamAV-Test-File FOUND
/usr/share/clamav-testfiles/clam.exe.binhex: ClamAV-Test-File FOUND
/usr/share/clamav-testfiles/clam-fsg.exe: ClamAV-Test-File FOUND
/usr/share/clamav-testfiles/clam.exe.mbox.uu: ClamAV-Test-File FOUND
/usr/share/clamav-testfiles/clam.odc.cpio: ClamAV-Test-File FOUND
/usr/share/clamav-testfiles/clam_cache_emax.tgz: ClamAV-Test-File FOUND
/usr/share/clamav-testfiles/clam.tnef: ClamAV-Test-File FOUND
/usr/share/clamav-testfiles/clam-mew.exe: ClamAV-Test-File FOUND
/usr/share/clamav-testfiles/clam-upx.exe: ClamAV-Test-File FOUND
/usr/share/clamav-testfiles/clam-pespin.exe: ClamAV-Test-File FOUND
/usr/share/clamav-testfiles/clam_ISmsi_ext.exe: ClamAV-Test-File FOUND
/usr/share/clamav-testfiles/clam.mail: ClamAV-Test-File FOUND
/usr/share/clamav-testfiles/clam-wwpack.exe: ClamAV-Test-File FOUND
/usr/share/clamav-testfiles/clam_IScab_ext.exe: ClamAV-Test-File FOUND
/usr/share/clamav-testfiles/clam_ISmsi_int.exe: ClamAV-Test-File FOUND
/usr/share/clamav-testfiles/clam.zip: ClamAV-Test-File FOUND
/usr/share/clamav-testfiles/clam-petite.exe: ClamAV-Test-File FOUND
/usr/share/clamav-testfiles/clam.exe.szdd: ClamAV-Test-File FOUND
/usr/share/clamav-testfiles/clam.d64.zip: ClamAV-Test-File FOUND
/usr/share/clamav-testfiles/clam_IScab_int.exe: ClamAV-Test-File FOUND
/usr/share/clamav-testfiles/clam.bin-le.cpio: ClamAV-Test-File FOUND
/usr/share/clamav-testfiles/clam.exe.rtf: ClamAV-Test-File FOUND
----------- SCAN SUMMARY -----------
Infected files: 44
Time: 1.478 sec (0 m 1 s)
</pre>
 
Ora proviamo a inviare una mail infetta attraverso Postfix, per vedere se AMaViS e ClamAV si comportano come ci aspettiamo:
<pre>
# swaks -t john@example.org --attach - --server localhost --suppress-data < /usr/share/clamav-testfiles/clam.exe
</pre>
 
Tra le altre righe in <code>/var/log/mail.log</code> dovremmo trovare una cosa del genere:
<pre>
29 23:16:23 sirius amavis[4558]: (04558-02) Blocked INFECTED (ClamAV-Test-File) {DiscardedOutbound,Quarantined}, LOCAL [::1]:44226 [::1] <root@mailserver.example.org> -> <john@example.org>, quarantine: C/virus-ClS0k87Qzm4Q, Queue-ID: 6608ED6B, Message-ID: <20131029221623.6608ED6B@sirius.localdomain>, mail_id: ClS0k87Qzm4Q, Hits: -, size: 1547, 128 ms
</pre>
segno che ClamAV è intervenuto correttamente, bloccando l'email infetta.
<br/>
La mail infetta è stata spostata in <code>/var/lib/amavis/virusmails/C/virus-ClS0k87Qzm4Q</code> per essere eventualmente analizzata.
 
<br/>
Possiamo impostare uno script per pulire la quarantena attraverso <code>cron</code>:
<pre>
#!/bin/dash
[ -d /var/lib/amavis/virusmails ] && {
        find /var/lib/amavis/virusmails/. -type f -name 'virus-*' -ctime +7 -de$
        find /var/lib/amavis/virusmails/. -type f -ctime +30 -delete
}
exit 0
</pre>
</pre>


Riga 1 277: Riga 1 427:
=== Amministrare gli utenti virtuali ===
=== Amministrare gli utenti virtuali ===


====ISPwebAdmin (web interface): introduzione ====
==== GRSoft Mail Manager ====
E' disponibile un'interfaccia web per amministrare i domini virtuali, gli utenti virtuali e gli alias. L'interfaccia si chiama ISPWebAdmin ed è disponibile per il download all'indirizzo: [[http://workaround.org/sites/default/files/ispwebadmin-1.0.2.tar_.gz Download]]
A questo indirizzo: http://www.grs-service.ch/pub/grs_mminstallation.html è possibile trovare un'interfaccia per la gestione degli account mail. GRSoft Mail Manager è scritto in PHP e non richiede dipendenze per funzionare.
# Scaricate il file e scompattatelo in una sottodirectory di <code>/var/www/</code>, ad esempio <code>/var/www/mailmanager</code>
# Aprite un browser e navigate verso l'indirizzo: http://ip.del.nostro.server/mailmanager/install.php
# Seguite le istruzioni per l'installazione. Allo Step 3 viene richiesta una coppia di credenziali MySQL con privilegi sufficienti per scrivere una tabella all'interno del database utilizzato in questa guida
# Alla fine dell'installazione seguite le istruzioni per rimuovere i files non più necessari
L'interfaccia permette la definizione di un Super User e di uno o più amministratori per ogni dominio virtuale che verrà creato.
 
==== Mail Admin Tool ====
Un'interfaccia alternativa può essere scaricata a questo indirizzo: [http://mat.ssdata.dk/ Mail Admin Tool].
 
==== Broatcast Mail Administrator ====
La peculiarità di questa interfaccia alternativa è che rende possibile impostare il numero massimo di indirizzi email che ogni dominio può avere. In questo modo possiamo ad esempio avere un dominio con caselle email illimitate e un altro dominio con 5 caselle disponibili. L'interfaccia è scaricabile da qui: [http://www.blog.broatcast.de/broatcast-mail-administrator Broatcatst Mail Administrator]
 
==== ISPwebAdmin (web interface): introduzione ====
{{Warningbox|Interfaccia obsoleta e non più sviluppata. Si consiglia di utilizzare GRSoft Mail Manager}}
E' disponibile un'ulteriore interfaccia web per amministrare i domini virtuali, gli utenti virtuali e gli alias. L'interfaccia si chiama ISPWebAdmin ed è disponibile per il download all'indirizzo: [[http://workaround.org/sites/default/files/ispwebadmin-1.0.2.tar_.gz Download]]


==== Installazione ====
===== Installazione =====


Per poter utilizzare ISPWebAdmin è necessario aggiungere alcune tabelle SQL al database per poter archiviare gli username e le password degli amministratori abilitati alla gestione degli account. Apriamo quindi la shell di MySQL:
Per poter utilizzare ISPWebAdmin è necessario aggiungere alcune tabelle SQL al database per poter archiviare gli username e le password degli amministratori abilitati alla gestione degli account. Apriamo quindi la shell di MySQL:
Riga 1 369: Riga 1 534:
Il file di log si troverà in <code>/var/log/runit-ispwebadmin</code>.
Il file di log si troverà in <code>/var/log/runit-ispwebadmin</code>.


==== Configurazione del file <code>run.ini</code> ====
===== Configurazione del file <code>run.ini</code> =====


Il file creato con il comando <code>paster make-config run.ini</code> contiene alcune impostazioni che possono essere personalizzate per adattarle alla configurazione del nostro mail server. Prima di avviare la web interface è consigliato aprire il file e controllare queste impostazioni:
Il file creato con il comando <code>paster make-config run.ini</code> contiene alcune impostazioni che possono essere personalizzate per adattarle alla configurazione del nostro mail server. Prima di avviare la web interface è consigliato aprire il file e controllare queste impostazioni:
Riga 1 380: Riga 1 545:
mysql://root:seoroct3@mailserver.example.com/mailserver?charset=utf8
mysql://root:seoroct3@mailserver.example.com/mailserver?charset=utf8
</pre>
</pre>
=== Un'interfaccia alternativa ===
A questo indirizzo: http://www.grs-service.ch/pub/grs_mminstallation.html è possibile trovare un'interfaccia alternativa per la gestione degli account mail. GRSoft Mail Manager è scritto in PHP e non richiede dipendenze per funzionare.
# Scaricate il file e scompattatelo in una sottodirectory di <code>/var/www/</code>, ad esempio <code>/var/www/mailmanager</code>
# Aprite un browser e navigate verso l'indirizzo: http://ip.del.nostro.server/mailmanager/install.php
# Seguite le istruzioni per l'installazione. Allo Step 3 viene richiesta una coppia di credenziali MySQL con privilegi sufficienti per scrivere una tabella all'interno del database utilizzato in questa guida
# Alla fine dell'installazione seguite le istruzioni per rimuovere i files non più necessari


=== Impostazione dei record DNS ===
=== Impostazione dei record DNS ===
Riga 1 473: Riga 1 631:
</pre>
</pre>
In questo caso abbiamo bloccato alcuni domini e autorizzato il dominio ferdy.it a inviarci mail senza nessun ulteriore controllo.
In questo caso abbiamo bloccato alcuni domini e autorizzato il dominio ferdy.it a inviarci mail senza nessun ulteriore controllo.
Quindi facciamo in modo che Postfix si crei il database relativo:
<br/>
Inseriamo alcuni ulteriori controlli sull'header e sul body della mail, aggiungendo la sezione:
<pre>
<pre>
# postmap /etc/postfix/access
# Verifico correttezza header e body
header_checks = pcre:/etc/postfix/header_checks
body_checks = regexp:/etc/postfix/body_checks
</pre>
e creando i due file relativi:
<pre>
# nano /etc/postfix/header_checks
</pre>
con contenuto (da scrivere in una riga sola):
<pre>
/^Content-(Disposition|Type).*name\s*=\s*"?(.*(\.|=2E)(
ade|adp|asp|bas|bat|chm|cmd|com|cpl|crt|dll|exe|hlp|ht[at]|inf|ins|isp|jse?|lnk|md[betw]|ms[cipt]|nws|
\{[[:xdigit:]]{8}(?:-[[:xdigit:]]{4}){3}-[[:xdigit:]]{12}\}|
ops|pcd|pif|prf|reg|sc[frt]|sh[bsm]|swf|
vb[esx]?|vxd|ws[cfh]))(\?=)?"?\s*(;|$)/x
REJECT Allegato "$2" con estensione proibita ".$4"
</pre>
<pre>
# nano /etc/postfix/body_checks
</pre>
<pre>
/^<iframe src=(3D)?cid:.* height=(3D)?0 width=(3D)?0>$/
REJECT IFRAME vulnerability exploit
</pre>
Quindi facciamo in modo che Postfix si crei il database relativo:
<pre>
# postmap /etc/postfix/access
</pre>
</pre>
Questo comando andrà ripetuto ad ogni modifica del file.
Questo comando andrà ripetuto ad ogni modifica del file.


=== SPF per ridurre ancora di più lo spam ===
==== Un esempio di main.cf ====
''SPF'', acronimo per ''Sender Policy Framework'', è un sistema attraverso il quale il proprietario di un dominio può definire quali indirizzi IP sono autorizzati a inviare le sue mail.
<pre>
<pre>
$> dig +short workaround.org txt
###############################
"v=spf1 ip4:85.214.93.191 ip4:85.214.149.150 -all"
# Configurazioni iniziali
</pre>
###############################
Questa riga significa che se qualcuno invia una mail con mittente ...@workaround.org noi dovremmo accettarla solo se proviene da uno degli indirizzi IP specificati nel record TXT della zona del dominio in questione. Se la mail proviene da un atro IP significa che non è stata spedita da un server di workaround.org e che con tutta probabilità si tratta di spam.
 
<br/>
# Messaggio di benvenuto
Molte organizzazioni e molti siti hanno già i loro record SPF, che possiamo utilizzare per ridurre la quantità di spam in arrivo sui nostri server. Per utilizzare correttamente i record SPF dovremo quindi:
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
* impostare un record TXT nella nostra zona per definire quali indirizzi IP sono autorizzati a inviare mail a nome nostro
biff = no
* controllare le voci SPF dei server mittenti e respingere la mail in arrivo da IP non autorizzati


==== Impostare una voce SPF ====
# appending .domain is the MUA's job.
append_dot_mydomain = no


Per aggiungere un record TXT come mostrato nel paragrafo precedente dovremo ovviamente avere il pieno controllo della nostra zona DNS, oppure chiedere al nostro ISP che lo faccia per noi.
# Uncomment the next line to generate "delayed mail" warnings
<br/>
#delay_warning_time = 4h
Per creare una corretta stringa TXT è consigliabile andare sul sito di OpenSPF e utilizzare il wizard apposito; quindi copincolliamo la stringa risultante e utilizziamola come record TXT per il nostro dominio.


==== Verificare i record SPF degli altri mail server ====
readme_directory = no


Fortunatamente esiste un pacchetto Debian che rende il controllo dei record SPF una cosa molto semplice. Iniziamo con l'installazione del pacchetto:
<pre>
# apt-get install tumgreyspf
</pre>
<code>tumgreyspf</code> è un policy daemon scritto in Python che effettua sia il greylisting sia il controllo SPF delle email in entrata. Per attivarlo basta semplicemente aggiungere una linea alla nostra direttiva <code>smtpd_recipient_restrictions</code>. Ad esempio:
<pre>
smtpd_recipient_restrictions =
    permit_mynetworks,
    permit_sasl_authenticated,
    [ ... ]
    check_policy_service unix:private/tumgreyspf
    reject_unauth_destination
</pre>
Per definire il programma chiamato dalle policies occorre anche aggiungere due righe al file <code>/etc/postfix/master.cf</code>:
<pre>
tumgreyspf unix  -      n      n      -      -      spawn
    user=tumgreyspf argv=/usr/bin/tumgreyspf
</pre>
Ora riavviamo Postfix:
<pre>
# postfix reload
</pre>


==== Verifica del funzionamento di SPF ====


===== SPF okay =====
#############################
# Configurazione SSL
#############################


Controlliamo il file <code>/var/log/mail.log</code>. Ogni nuova mail in arrivo dovrebbe adesso avere una nuova riga aggiunta da <code>tumgreyspf</code>. Se il controllo SPF è risultato positivo, dovremmo avere qualcosa come:
# TLS parameters
<pre>
smtpd_tls_cert_file = /etc/ssl/certs/mailserver.pem
tumgreyspf[24672]: sender SPF authorized: QUEUE_ID=""; identity=mailfrom;
smtpd_tls_key_file = /etc/ssl/private/mailserver.pem
  client-ip=26.21.244.31; helo=squedge2.squ.edu.om;
smtpd_use_tls = yes
  envelope-from=…@squ.edu.om;
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
  receiver=…@workaround.org;
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
</pre>
smtpd_tls_security_level = may
Questo significa che il mittente <code>…@squ.edu.om</code> è stato autorizzato all'invio della mail dopo un controllo dei record SPF.
smtpd_tls_auth_only = no


===== SPF fail =====


Se il controllo SPF fallisce dovremmo ottenere qualcosa del genere:
<pre>
tumgreyspf[24672]: SPF fail - not authorized: QUEUE_ID=""; identity=mailfrom;
  client-ip=41.234.18.141; helo=gmx.de;
  envelope-from=…gmx.de;
  receiver=…christoph-haas.de;
</pre>
La mail è stata respinta.


===== SPF softfail =====
######################################
# Configurazione
######################################


Un altro caso è quando il record SPF del dominio del mittente non contiene la regola FAIL (-all), ma la regola SOFTFAIL (~all). Nei nostri log troveremo qualcosa del genere:
myhostname = mail01.xxxxx.org
<pre>
alias_maps = hash:/etc/aliases
tumgreyspf[20408]: domain owner discourages use of this host: QUEUE_ID="";
alias_database = hash:/etc/aliases
  identity=mailfrom; client-ip=220.245.2.67; helo=220-245-2-67.static.tpgi.com.au;
myorigin = /etc/mailname
  envelope-from=…@rollouts.com; receiver=…@workaround.org
mydestination = mail01.xxxxx.org, localhost.xxxxx.org, , localhost.xxxxxyy.com, localhost
</pre>
relayhost =
Purtroppo una regola SOFTFAIL non respinge la mail in arrivo, ma fa almeno in modo che il destinatario sia avvertito del problema, aggiungendo un'informazione all'header della mail:
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 10.0.0.0/24
<pre>
mailbox_command = procmail -a "$EXTENSION"
Received-SPF: Softfail (domain owner discourages use of this host) identity=mailfrom;
mailbox_size_limit = 0
  client-ip=61.146.93.243; helo=mail.163gd.com;
recipient_delimiter = +
  envelope-from=…@cantv.net; receiver=…@christoph-haas.de;
inet_interfaces = all
</pre>
inet_protocols = ipv4
In questo modo il mail client dell'utente finale può ancora filtrare la mail come spam.
queue_directory = /var/spool/postfix


===== No SPF information =====


Se il dominio remoto non ha record SPF, nei nostri log risulterà qualcosa del genere:
<pre>
Received-SPF: Neutral (access neither permitted nor denied) identity=mailfrom;
  client-ip=80.65.65.222; helo=mail.unze.ba;
  envelope-from=…@gmail.com; receiver=…@christoph-haas.de;
</pre>


=== Quote ===
#######################################
# Configurazione utenti virtuali MySQL
#######################################
 
virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf,mysql:/etc/postfix/mysql-email2email.cf


Il nostro mail server non ha spazio infinito, soprattutto se usiamo il protocollo IMAP e gli utenti apprezzano la comodità di avere le mail sempre a disposizione sul server. Perciò vorremo probabilmente limitare lo spazio che un utente può occupare. Dovecot può impostare la dimensione della mailbox di un utente e il numero di email della sue cartelle virtuali.
<br/>
La configurazione delle quote cambia a seconda che si stia utilizzando Debian Lenny o Debian Squeeze.


==== Debian Lenny ====
===== Lenny: Attivare il plugin quota di Dovecot =====


Ci sono tre punti nel file <code>/etc/dovecot/dovecot.conf</code> dove occorre specificare l'abilitazione del plugin:
###################
<pre>
# Regole Antispam
protocol imap {
###################
  mail_plugins = quota imap_quota
}
protocol pop3 {
  mail_plugins = quota
}
protocol lda {
  mail_plugins = quota
}
</pre>


===== Lenny: Impostare una quota globale =====
# Verifico correttezza header e body
header_checks = pcre:/etc/postfix/header_checks
body_checks = regexp:/etc/postfix/body_checks


Il caso più semplice è quello in cui si intende impostare una quota limite comune e uguale per tutti gli utenti, ad esempio 1GB di spazio con non più di 1000 email archiviabili.
# Abilito a spedire solo gli utenti presenti in MySQL
Nel file <code>/etc/dovecot/dovecot.conf</code> dovremo impostare:
smtpd_sender_login_maps = mysql:/etc/postfix/mysql-sender-login-maps.cf
<pre>
plugin {
  quota = maildir:storage=1000000:messages=1000
}
</pre>
ricordando che i valori per lo storage sono espressi in KB.


===== Lenny: Impostare una quota utente =====
# Restrizioni helo
smtpd_helo_required = yes
smtpd_helo_restrictions =
        permit_mynetworks
        #reject_unknown_client
        #reject_invalid_hostname
        #reject_unauth_pipelining
        #reject_unknown_hostname
        #reject_non_fqdn_hostname


Se intendiamo impostare per alcuni utenti delle quote diverse da quelle globali, allora dobbiamo impostare la quota all'interno della tabella dei virtual_users. Utilizziamo la seguente query per aggiungere due colonne alla nostra tabella virtual_users:
# Restrizioni sui mittenti abilitati
<pre>
smtpd_sender_restrictions =
mysql>
        permit_mynetworks
ALTER TABLE `virtual_users` ADD `quota_kb` INT NOT NULL,
        permit_sasl_authenticated
ADD `quota_messages` INT NOT NULL ;
        #reject_unknown_address
</pre>
        #reject_unauth_destination
Inoltre dovremo abilitare la direttiva <code>user sql</code> nel file <code>/etc/dovecot/dovecot.conf</code>, disabilitando la direttiva <code>user static</code> suggerita all'inizio del tutorial:
        reject_unauth_pipelining
<pre>
reject_unknown_sender_domain
#userdb static {
reject_non_fqdn_sender
# args = uid=5000 gid=5000 home=/var/vmail/%d/%n allow_all_users=yes
reject_sender_login_mismatch
#
 
# Blocco alcuni domini spammer
smtpd_client_restrictions =
permit_mynetworks
        #check_client_access hash:/etc/postfix/access
        #reject_invalid_hostname
        reject_rbl_client zen.spamhaus.org
        reject_rbl_client multi.uribl.com
        reject_rbl_client dsn.rfc-ignorant.org
        reject_rbl_client dul.dnsbl.sorbs.net
        reject_rbl_client list.dsbl.org
        reject_rbl_client sbl-xbl.spamhaus.org
        reject_rbl_client bl.spamcop.net
        reject_rbl_client dnsbl.sorbs.net
        reject_rbl_client cbl.abuseat.org
        reject_rbl_client ix.dnsbl.manitu.net
        reject_rbl_client combined.rbl.msrbl.net
        reject_rbl_client rabl.nuclearelephant.com
        #reject_unknown_client
        permit
# Restrizioni sui destinatari
smtpd_recipient_restrictions =  
permit_mynetworks
permit_sasl_authenticated
reject_unauth_destination
        check_client_access hash:/etc/postfix/access
        reject_rbl_client zen.spamhaus.org
        reject_rbl_client multi.uribl.com
        reject_rbl_client dsn.rfc-ignorant.org
        reject_rbl_client dul.dnsbl.sorbs.net
        reject_rbl_client list.dsbl.org
        reject_rbl_client sbl-xbl.spamhaus.org
        reject_rbl_client bl.spamcop.net
        reject_rbl_client dnsbl.sorbs.net
        reject_rbl_client cbl.abuseat.org
        reject_rbl_client ix.dnsbl.manitu.net
        reject_rbl_client combined.rbl.msrbl.net
        reject_rbl_client rabl.nuclearelephant.com
reject_rbl_client dnsbl-1.uceprotect.net
        reject_unknown_sender_domain
        reject_unauth_pipelining
        check_policy_service unix:private/tumgreyspf
        reject_non_fqdn_sender
        reject_non_fqdn_recipient
        reject_non_fqdn_hostname
        reject_invalid_hostname
 
# Non piu' di 200 destinatari al minuto
smtpd_client_recipient_rate_limit = 200
 
# Non piu' di 50 destinatari per ogni messaggio
smtpd_recipient_limit = 50


userdb sql {
# Numero di destinatari in eccesso prima che scatti il blocco
    args = /etc/dovecot/dovecot-sql.conf
smtpd_recipient_overshoot_limit = 21
}
</pre>
Infine dovremo aggiungere al file <code>/etc/dovecot/dovecot-sql.conf</code> la linea:
<pre>
user_query = SELECT CONCAT('/var/vmail/',CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1))) AS home, 5000 AS uid, 5000 AS gid, CONCAT('maildir:storage=',quota_kb,':messages=',quota_messages) AS quota FROM virtual_users WHERE email='%u';
</pre>


===== Lenny: Cosa succede se un utente supera la quota =====
# Numero di errori massimi di un client prima di essere disconnesso
smtpd_hard_error_limit = 20


La gestione delle quote in Dovecot non è molto user-friendly. Il mittente non riceve un avviso se è vicino a superare la quota limite; in compenso, quando l'ha superata, le sue mail torneranno indietro con oggetto "Automatically rejected mail" e corpo della mail "Your message to <john@example.com> was automatically rejected: Quota exceeded".
# Impedisco invio mail ad alcuni utenti locali
authorized_submit_users = !www-data, static:all


==== Debian Squeeze ====
A partire da Dovecot 1.1, di default su Squeeze, la gestione delle quote è cambiata notevolmente.


===== Squeeze: Impostazione delle Quote root =====
 
Dobbiamo innanzitutto aprire il file di configurazione di Dovecot:
#########################
<pre>
# Configurazione Dovecot
# nano /etc/dovecot/dovecot.conf
#########################
 
virtual_transport = dovecot
dovecot_destination_recipient_limit = 1
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
 
 
 
###############################
# Integrazione con AMaViS
###############################
 
content_filter = smtp-amavis:[127.0.0.1]:10024
receive_override_options = no_address_mappings
</pre>
</pre>
recarci alla sezione <code>plugin { }</code> e definire le quote root. Ad esempio:
 
=== SPF per ridurre ancora di più lo spam ===
''SPF'', acronimo per ''Sender Policy Framework'', è un sistema attraverso il quale il proprietario di un dominio può definire quali indirizzi IP sono autorizzati a inviare le sue mail.
<pre>
<pre>
plugin {
$> dig +short workaround.org txt
  quota = maildir:User quota
"v=spf1 ip4:85.214.93.191 ip4:85.214.149.150 -all"
  #quota2 = fs:Disk quota
  #quota3 = ...
}
</pre>
</pre>
In questa guida utilizzeremo solamente una gestione delle quote legata alle dimensioni delle maildir.
Questa riga significa che se qualcuno invia una mail con mittente ...@workaround.org noi dovremmo accettarla solo se proviene da uno degli indirizzi IP specificati nel record TXT della zona del dominio in questione. Se la mail proviene da un atro IP significa che non è stata spedita da un server di workaround.org e che con tutta probabilità si tratta di spam.
<br/>
Molte organizzazioni e molti siti hanno già i loro record SPF, che possiamo utilizzare per ridurre la quantità di spam in arrivo sui nostri server. Per utilizzare correttamente i record SPF dovremo quindi:
* impostare un record TXT nella nostra zona per definire quali indirizzi IP sono autorizzati a inviare mail a nome nostro
* controllare le voci SPF dei server mittenti e respingere la mail in arrivo da IP non autorizzati
 
==== Impostare una voce SPF ====


===== Squeeze: Quote rules =====
Per aggiungere un record TXT come mostrato nel paragrafo precedente dovremo ovviamente avere il pieno controllo della nostra zona DNS, oppure chiedere al nostro ISP che lo faccia per noi.
A questo punto, nella stessa sezione del file di configurazione possiamo definire le nostre regole di quota:
<br/>
<pre>
Per creare una corretta stringa TXT è consigliabile andare sul sito di OpenSPF e utilizzare il wizard apposito; quindi copincolliamo la stringa risultante e utilizziamola come record TXT per il nostro dominio.
plugin {
 
  # Quota root
==== Verificare i record SPF degli altri mail server ====
  quota = maildir:User quota
 
  # Quote rules
Fortunatamente esiste un pacchetto Debian che rende il controllo dei record SPF una cosa molto semplice. Iniziamo con l'installazione del pacchetto:
  # 1 - Dimensione massima 2 GB
  quota_rule = *:storage=2GB
  # 2 - Dimensione Cestino 200 MB
  quota_rule2 = Trash:storage=200MB
  # 3 - Dimensione cartella Spam 200MB
  quota_rule3 = Spam:storage=200MB
}
</pre>
===== Squeeze: Cosa succede se un utente supera la quota =====
In Squeeze possiamo finalmente configurare Dovecot in modo che invii un messaggio personalizzato agli utenti che hanno superato la loro quota disco. All'interno della solita sezione del file di configurazione di Dovecot aggiungiamo la riga:
<pre>
<pre>
plugin {
# apt-get install tumgreyspf
  quota_exceeded_message = Spazio su disco esaurito. Contattare il webmaster per ricevere istruzioni.
</pre>
</pre>
 
<code>tumgreyspf</code> è un policy daemon scritto in Python che effettua sia il greylisting sia il controllo SPF delle email in entrata. Per attivarlo basta semplicemente aggiungere una linea alla nostra direttiva <code>smtpd_recipient_restrictions</code>. Ad esempio:
===== Squeeze: messaggio di avvertimento =====
In Squeeze possiamo anche configurare Dovecot in modo che avvii un comando esterno quando la quota di un certo utente supera una certa percentuale. Come al solito dobbiamo recarci nella sezione <code>plugin { }</code> del file di configurazione di Dovecot e aggiungere le seguenti linee:
<pre>
<pre>
plugin {
smtpd_recipient_restrictions =
  quota_warning = storage=95%% /usr/local/bin/quota-warning.sh 95
    permit_mynetworks,
  quota_warning2 = storage=80%% /usr/local/bin/quota-warning.sh 80
    permit_sasl_authenticated,
}
    [ ... ]
    check_policy_service unix:private/tumgreyspf
    reject_unauth_destination
</pre>
</pre>
Nell'esempio precedente, lo script <code>quota-warning.sh</code> è eseguito una prima volta quando l'utente raggiunge l'80% del suo spazio disco e una seconda volta quando raggiunge il 95%.
Per definire il programma chiamato dalle policies occorre anche aggiungere due righe al file <code>/etc/postfix/master.cf</code>:
<br/>
Lo script va creato a mano:
<pre>
<pre>
# nano /usr/local/bin/quota-warning.sh
tumgreyspf unix  -      n      n      -      -      spawn
    user=tumgreyspf argv=/usr/bin/tumgreyspf
</pre>
</pre>
con contenuto:
Ora riavviamo Postfix:
<pre>
<pre>
#!/bin/sh
# postfix reload
</pre>


PERCENT=$1
==== Verifica del funzionamento di SPF ====
FROM="webmaster@example.com"
qwf="/tmp/quota.warning.$$"


echo "From: $FROM
===== SPF okay =====
To: $USER
To: postmaster@domain.org
Subject: Hai raggiunto il $PERCENT% del tuo spazio su disco!
Content-Type: text/plain; charset="UTF-8"


La tua mailbox ha raggiunto il $PERCENT% dello spazio disponibile. Sei pregato di eliminare le mail che non ti occorrono." >> $qwf
Controlliamo il file <code>/var/log/mail.log</code>. Ogni nuova mail in arrivo dovrebbe adesso avere una nuova riga aggiunta da <code>tumgreyspf</code>. Se il controllo SPF è risultato positivo, dovremmo avere qualcosa come:
<pre>
tumgreyspf[24672]: sender SPF authorized: QUEUE_ID=""; identity=mailfrom;
  client-ip=26.21.244.31; helo=squedge2.squ.edu.om;
  envelope-from=…@squ.edu.om;
  receiver=…@workaround.org;
</pre>
Questo significa che il mittente <code>…@squ.edu.om</code> è stato autorizzato all'invio della mail dopo un controllo dei record SPF.


cat $qwf | /usr/sbin/sendmail -f $FROM "$USER"
===== SPF fail =====
rm -f $qwf


exit 0
Se il controllo SPF fallisce dovremmo ottenere qualcosa del genere:
</pre>
Rendiamo lo script eseguibile:
<pre>
<pre>
# chmod 750 /usr/local/bin/quota-warning.sh
tumgreyspf[24672]: SPF fail - not authorized: QUEUE_ID=""; identity=mailfrom;
  client-ip=41.234.18.141; helo=gmx.de;
  envelope-from=…gmx.de;
  receiver=…christoph-haas.de;
</pre>
</pre>
e siamo a posto.
La mail è stata respinta.
 
===== SPF softfail =====


=== Accesso tramite Webmail ===
Un altro caso è quando il record SPF del dominio del mittente non contiene la regola FAIL (-all), ma la regola SOFTFAIL (~all). Nei nostri log troveremo qualcosa del genere:
==== Squirrelmail ====
<pre>
Questo passaggio è facoltativo, ma ormai praticamente tutti i provider offrono ai loro utenti un mezzo per poter controllare le email da un browser.
tumgreyspf[20408]: domain owner discourages use of this host: QUEUE_ID="";
<br/>
  identity=mailfrom; client-ip=220.245.2.67; helo=220-245-2-67.static.tpgi.com.au;
Per questo motivo durante l'iniziale installazione dei pacchetti abbiamo scelto anche il pacchetto <code>squirrelmail</code>: ''SquirrelMail è un pacchetto per posta via web aderente agli standard, scritto in PHP. Include supporto integrato in PHP puro per i protocolli IMAP e SMTP ed è progettato per una massima compatibilità con i vari browser. SquirrelMail non richiede molte cose ed è facile da configurare ed installare. Gira sopra qualsiasi server IMAP''. SquirrelMail ha tutte le funzioni che si possono desiderare in un client di posta elettronica, incluso un forte supporto MIME, gestione di rubriche e cartelle (Fonte: [http://packages.debian.org/search?keywords=squirrelmail Debian package]).
  envelope-from=…@rollouts.com; receiver=…@workaround.org
<br/>
Per impostarlo dobbiamo inannzitutto aggiungere la sua configurazione a quella di Apache:
<pre>
$> ln -s /etc/squirrelmail/apache.conf /etc/apache2/conf.d/squirrelmail.conf
$> apache2ctl restart
</pre>
</pre>
Inoltre dobbiamo variare un parametro; lo facciamo utilizzando il tool di configurazione di Squirrelmail:
Purtroppo una regola SOFTFAIL non respinge la mail in arrivo, ma fa almeno in modo che il destinatario sia avvertito del problema, aggiungendo un'informazione all'header della mail:
<pre>
<pre>
$> squirrelmail-configure
Received-SPF: Softfail (domain owner discourages use of this host) identity=mailfrom;
  client-ip=61.146.93.243; helo=mail.163gd.com;
  envelope-from=…@cantv.net; receiver=…@christoph-haas.de;
</pre>
</pre>
Selezioniamo l'opzione 3 (Folder Defaults) e impostiamo l'opzione 1 (Default Folder Prefix) a 'none'. Già che ci siamo possiamo anche navigare all'interno del menu di configurazione e impostare anche il nome corretto per la nostra organizzazione.
In questo modo il mail client dell'utente finale può ancora filtrare la mail come spam.
<br/>
A questo punto visitando il sito: http://ip.del.nostro.server/squirrelmail possiamo effettuare il login con le credenziali di uno dei nostri virtual user e iniziare ad usare la webmail.


===== No SPF information =====


===== Permettere il cambio password all'utente =====
Se il dominio remoto non ha record SPF, nei nostri log risulterà qualcosa del genere:
Può essere molto comodo dare all'utente la possibilità di cambiarsi la password per conto suo, senza stressare il sistemista di turno. La cosa più semplice è permetterglielo attraverso la webmail. Squirrelmail di default non prevede questa funzione, ma per fortuna esiste un ottimo plugin che fa al caso nostro. Andiamo quindi alla pagina del plugin (http://squirrelmail.org/plugin_view.php?id=25) e scarichiamolo. Quindi copiamolo nella directory:
<pre>
<pre>
/usr/share/squirrelmail/plugins
Received-SPF: Neutral (access neither permitted nor denied) identity=mailfrom;
  client-ip=80.65.65.222; helo=mail.unze.ba;
  envelope-from=…@gmail.com; receiver=…@christoph-haas.de;
</pre>
</pre>
e scompattiamolo:
 
=== Quote ===
 
Il nostro mail server non ha spazio infinito, soprattutto se usiamo il protocollo IMAP e gli utenti apprezzano la comodità di avere le mail sempre a disposizione sul server. Perciò vorremo probabilmente limitare lo spazio che un utente può occupare. Dovecot può impostare la dimensione della mailbox di un utente e il numero di email della sue cartelle virtuali.
<br/>
La configurazione delle quote cambia a seconda che si stia utilizzando Debian Lenny o Debian Squeeze.
 
==== Debian Lenny ====
===== Lenny: Attivare il plugin quota di Dovecot =====
 
Ci sono tre punti nel file <code>/etc/dovecot/dovecot.conf</code> dove occorre specificare l'abilitazione del plugin:
<pre>
<pre>
# tar zxvf change_sqlpass-3.3-1.2.tar.gz
protocol imap {
  mail_plugins = quota imap_quota
}
protocol pop3 {
  mail_plugins = quota
}
protocol lda {
  mail_plugins = quota
}
</pre>
</pre>
Prima di modificarne la configurazione dobbiamo compiere alcune operazioni propedeutiche:
 
===== Lenny: Impostare una quota globale =====
 
Il caso più semplice è quello in cui si intende impostare una quota limite comune e uguale per tutti gli utenti, ad esempio 1GB di spazio con non più di 1000 email archiviabili.
Nel file <code>/etc/dovecot/dovecot.conf</code> dovremo impostare:
<pre>
<pre>
# apt-get install php-mdb2 squirrelmail-compatibility
plugin {
# pear install DB
  quota = maildir:storage=1000000:messages=1000
}
</pre>
</pre>
Ora siamo pronti per configurare il plugin appena scaricato:
ricordando che i valori per lo storage sono espressi in KB.
 
===== Lenny: Impostare una quota utente =====
 
Se intendiamo impostare per alcuni utenti delle quote diverse da quelle globali, allora dobbiamo impostare la quota all'interno della tabella dei virtual_users. Utilizziamo la seguente query per aggiungere due colonne alla nostra tabella virtual_users:
<pre>
<pre>
# cd /usr/share/squirrelmail/plugins/change_sqlpass
mysql>
# cp config.php.sample config.php 
ALTER TABLE `virtual_users` ADD `quota_kb` INT NOT NULL,
# vi config.php
ADD `quota_messages` INT NOT NULL ;
</pre>
</pre>
* Modifichiamo la riga:
Inoltre dovremo abilitare la direttiva <code>user sql</code> nel file <code>/etc/dovecot/dovecot.conf</code>, disabilitando la direttiva <code>user static</code> suggerita all'inizio del tutorial:
<pre>
<pre>
$csp_dsn = 'mysql://root:password@localhost/mailserver';
#userdb static {
#  args = uid=5000 gid=5000 home=/var/vmail/%d/%n allow_all_users=yes
#
 
userdb sql {
    args = /etc/dovecot/dovecot-sql.conf
}
</pre>
</pre>
inserendo le credenziali per l'accesso al database mailserver.
Infine dovremo aggiungere al file <code>/etc/dovecot/dovecot-sql.conf</code> la linea:
* Modifichiamo la riga:
<pre>
<pre>
$lookup_password_query = 'SELECT count(*) FROM virtual_users WHERE email = "%1" AND password = %4';
user_query = SELECT CONCAT('/var/vmail/',CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1))) AS home, 5000 AS uid, 5000 AS gid, CONCAT('maildir:storage=',quota_kb,':messages=',quota_messages) AS quota FROM virtual_users WHERE email='%u';
</pre>
</pre>
inserendo la query corretta per la ricerca dell'utente virtuale.
 
* Modifichiamo la riga:
===== Lenny: Cosa succede se un utente supera la quota =====
 
La gestione delle quote in Dovecot non è molto user-friendly. Il mittente non riceve un avviso se è vicino a superare la quota limite; in compenso, quando l'ha superata, le sue mail torneranno indietro con oggetto "Automatically rejected mail" e corpo della mail "Your message to <john@example.com> was automatically rejected: Quota exceeded".
 
==== Debian Squeeze ====
A partire da Dovecot 1.1, di default su Squeeze, la gestione delle quote è cambiata notevolmente.
 
===== Squeeze: Impostazione delle Quote root =====
Dobbiamo innanzitutto aprire il file di configurazione di Dovecot:
<pre>
<pre>
'UPDATE virtual_users SET password = %4 WHERE email = "%1"',
# nano /etc/dovecot/dovecot.conf
</pre>
</pre>
inserendo la query corretta per la modifica della password dell'utente virtuale.
recarci alla sezione <code>plugin { }</code> e definire le quote root. Ad esempio:
* Inseriamo il corretto metodo di crittazione usato dal nostro database:
<pre>
<pre>
$password_encryption = 'MD5';
plugin {
  quota = maildir:User quota
  #quota2 = fs:Disk quota
  #quota3 = ...
}
</pre>
</pre>
* Correggiamo la stringa:
In questa guida utilizzeremo solamente una gestione delle quote legata alle dimensioni delle maildir.
 
===== Squeeze: Quote rules =====
A questo punto, nella stessa sezione del file di configurazione possiamo definire le nostre regole di quota:
<pre>
<pre>
$csp_salt_static = '';
plugin {
</pre>
  # Quota root
e salviamo il file.
  quota = maildir:User quota
<br/>
  # Quote rules
Quindi riconfiguriamo Squirrelmail:
  # 1 - Dimensione massima 2 GB
  quota_rule = *:storage=2GB
  # 2 - Dimensione Cestino 200 MB
  quota_rule2 = Trash:storage=200MB
  # 3 - Dimensione cartella Spam 200MB
  quota_rule3 = Spam:storage=200MB
}
</pre>
===== Squeeze: Cosa succede se un utente supera la quota =====
In Squeeze possiamo finalmente configurare Dovecot in modo che invii un messaggio personalizzato agli utenti che hanno superato la loro quota disco. All'interno della solita sezione del file di configurazione di Dovecot aggiungiamo la riga:
<pre>
<pre>
# cd ../../config/
plugin {
# ./conf.pl
  quota_exceeded_message = Spazio su disco esaurito. Contattare il webmaster per ricevere istruzioni.
</pre>
</pre>
e attiviamo il plugin:
<pre> 
8. Plugins
x. change_sqlpass
Save S and exit Q.
</pre>
Effettuando il login nella nostra webmail, sotto la voce "Opzioni" troveremo la funzione "Cambia password".


==== Roundcube ====
===== Squeeze: messaggio di avvertimento =====
In alternativa (o affiancato) a Squirrelmail possiamo offrire il più moderno e eye-candy Roundcube, anch'esso presente nei repository di Debian. Per installarlo basta un comando:
In Squeeze possiamo anche configurare Dovecot in modo che avvii un comando esterno quando la quota di un certo utente supera una certa percentuale. Come al solito dobbiamo recarci nella sezione <code>plugin { }</code> del file di configurazione di Dovecot e aggiungere le seguenti linee:
* '''Lenny''':
<pre>
<pre>
# apt-get -t lenny-backports install roundcube
plugin {
  quota_warning = storage=95%% /usr/local/bin/quota-warning.sh 95
  quota_warning2 = storage=80%% /usr/local/bin/quota-warning.sh 80
}
</pre>
</pre>
* '''Squeeze''':
Nell'esempio precedente, lo script <code>quota-warning.sh</code> è eseguito una prima volta quando l'utente raggiunge l'80% del suo spazio disco e una seconda volta quando raggiunge il 95%.
<pre>
# apt-get install roundcube
</pre>
Rispondiamo di sì alla domanda dell'installer se configurare o meno un database con ''dbconfig-common'' e scegliamo come database il solito MySQL. Ci verrà poi richiesta la password di amministratore di MySQL e l'installazione terminerà.
<br/>
<br/>
Ora modifichiamo il file di configurazione:
Lo script va creato a mano:
<pre>
<pre>
# nano /etc/roundcube/main.inc.php
# nano /usr/local/bin/quota-warning.sh
</pre>
</pre>
modificando la linea:
con contenuto:
<pre>
<pre>
$rcmail_config['default_host'] = 'localhost';
#!/bin/sh
</pre>
 
Quindi modifichiamo il file che definisce il Virtual Host di Roundcube:
PERCENT=$1
<pre>
FROM="webmaster@example.com"
# nano /etc/roundcube/apache.conf
qwf="/tmp/quota.warning.$$"
</pre>
 
e decommentiamo le linee:
echo "From: $FROM
<pre>
To: $USER
    Alias /roundcube/program/js/tiny_mce/ /usr/share/tinymce/www/
To: postmaster@domain.org
    Alias /roundcube /var/lib/roundcube
Subject: Hai raggiunto il $PERCENT% del tuo spazio su disco!
Content-Type: text/plain; charset="UTF-8"
 
La tua mailbox ha raggiunto il $PERCENT% dello spazio disponibile. Sei pregato di eliminare le mail che non ti occorrono." >> $qwf
 
cat $qwf | /usr/sbin/sendmail -f $FROM "$USER"
rm -f $qwf
 
exit 0
</pre>
</pre>
Installiamo i driver MDB2:
Rendiamo lo script eseguibile:
<pre>
<pre>
# pear install MDB2_Driver_mysql
# chmod 750 /usr/local/bin/quota-warning.sh
</pre>
</pre>
Riavviamo Apache:
e siamo a posto.
<pre>
 
/etc/init.d/apache2 restart
==== Debian Wheezy ====
</pre>
A partire da Debian Wheezy, la configurazione (può essere identica a quella per Squeeze) deve essere inserita nel file <code>/etc/dovecot/conf.d/90-quota.conf</code>.
e facciamo login nella nostra webmail all'indirizzo: <code>http:// your-domain/roundcube</code>


=== Filtri server-side: Sieve ===
=== Accesso tramite Webmail ===
Arrivati a questo punto siamo in possesso di un mail server completamente funzionale, che tagga addirittura le mail di spam; però il compito di filtrare le mail taggate come spam è lasciato al client di posta dell'utente finale.
==== Squirrelmail ====
Questo passaggio è facoltativo, ma ormai praticamente tutti i provider offrono ai loro utenti un mezzo per poter controllare le email da un browser.
<br/>
<br/>
Utilizzando Sieve, un mail filter simile a procmail (che non utilizziamo perchè non lavora con le mailbox virtuali) possiamo fare in modo che le mail taggate da SpamAssassin come "spam" vengano spostate automaticamente in un folder chiamato "Spam".
Per questo motivo durante l'iniziale installazione dei pacchetti abbiamo scelto anche il pacchetto <code>squirrelmail</code>: ''SquirrelMail è un pacchetto per posta via web aderente agli standard, scritto in PHP. Include supporto integrato in PHP puro per i protocolli IMAP e SMTP ed è progettato per una massima compatibilità con i vari browser. SquirrelMail non richiede molte cose ed è facile da configurare ed installare. Gira sopra qualsiasi server IMAP''. SquirrelMail ha tutte le funzioni che si possono desiderare in un client di posta elettronica, incluso un forte supporto MIME, gestione di rubriche e cartelle (Fonte: [http://packages.debian.org/search?keywords=squirrelmail Debian package]).
<br/>
<br/>
Iniziamo creando un file di configurazione per Sieve:
Per impostarlo dobbiamo inannzitutto aggiungere la sua configurazione a quella di Apache:
<pre>
<pre>
# nano /var/vmail/globalsieverc
$> ln -s /etc/squirrelmail/apache.conf /etc/apache2/conf.d/squirrelmail.conf
$> apache2ctl restart
</pre>
</pre>
contenente:
Inoltre dobbiamo variare un parametro; lo facciamo utilizzando il tool di configurazione di Squirrelmail:
<pre>
<pre>
require ["fileinto"];
$> squirrelmail-configure
# Move spam to spam folder
if header :contains "X-Spam-Flag" ["YES"] {
  fileinto "spam";
  stop;
}
</pre>
</pre>
e verifichiamo che sia leggibile dall'utente <code>vmail</code>:
Selezioniamo l'opzione 3 (Folder Defaults) e impostiamo l'opzione 1 (Default Folder Prefix) a 'none'. Già che ci siamo possiamo anche navigare all'interno del menu di configurazione e impostare anche il nome corretto per la nostra organizzazione.
<br/>
A questo punto visitando il sito: http://ip.del.nostro.server/squirrelmail possiamo effettuare il login con le credenziali di uno dei nostri virtual user e iniziare ad usare la webmail.
 
 
===== Permettere il cambio password all'utente =====
Può essere molto comodo dare all'utente la possibilità di cambiarsi la password per conto suo, senza stressare il sistemista di turno. La cosa più semplice è permetterglielo attraverso la webmail. Squirrelmail di default non prevede questa funzione, ma per fortuna esiste un ottimo plugin che fa al caso nostro. Andiamo quindi alla pagina del plugin (http://squirrelmail.org/plugin_view.php?id=25) e scarichiamolo. Quindi copiamolo nella directory:
<pre>
<pre>
# chown vmail /var/vmail/globalsieverc
/usr/share/squirrelmail/plugins
</pre>
</pre>
Quindi modifichiamo la configurazione di Dovecot e inseriamo un plugin per il global filtering delle mail:
e scompattiamolo:
<pre>
<pre>
# nano /etc/dovecot/dovecot.conf
# tar zxvf change_sqlpass-3.3-1.2.tar.gz
</pre>
</pre>
cercando la sezione <code>plugin { }</code> e inserendo:
Prima di modificarne la configurazione dobbiamo compiere alcune operazioni propedeutiche:
<pre>
<pre>
sieve_global_path = /var/vmail/globalsieverc
# apt-get install php-mdb2 squirrelmail-compatibility
# pear install DB
</pre>
</pre>
Riavviamo Dovecot:
Ora siamo pronti per configurare il plugin appena scaricato:
<pre>
<pre>
# /etc/init.d/dovecot restart
# cd /usr/share/squirrelmail/plugins/change_sqlpass
# cp config.php.sample config.php 
# vi config.php
</pre>
</pre>
 
* Modifichiamo la riga:
==== Test del filtro antispam ====
Inviamo al nostro utente una mail di spam:
<pre>
<pre>
# sendmail john@example.com < /usr/share/doc/spamassassin/examples/sample-spam.txt
$csp_dsn = 'mysql://root:password@localhost/mailserver';
</pre>
</pre>
Nei log di Doecot dovremmo trovare una linea simile alla seguente:
inserendo le credenziali per l'accesso al database mailserver.
* Modifichiamo la riga:
<pre>
<pre>
deliver(john@example.com): 2009-07-01 01:00:22 Info: msgid=<GTUBE1.1010101@example.net>: saved mail to spam
$lookup_password_query = 'SELECT count(*) FROM virtual_users WHERE email = "%1" AND password = %4';
</pre>
</pre>
E' da notare il folder "Spam" sarà visibile solo agli utenti che gestiscono la posta tramite IMAP, dato che il protocollo POP3 non è un grado di gestire folder differenti da "Inbox". Gli utenti che utilizzano il protocollo POP3 avranno tre alternative:
inserendo la query corretta per la ricerca dell'utente virtuale.
# sottoscrivere manualmente anche il folder "Spam"
* Modifichiamo la riga:
# modificare il file <code>/var/vmail/example.com/john/Maildir/subscriptions</code> aggiungendo "spam" tra i folder disponibili
# utilizzare Squirrelmail periodicamente per controllare il folder Spam
 
==== Managesieve ====
Managesieve è un'interfaccia low-level per amministrare gli script di Sieve. Per abilitarla è necessario aggiungere <code>managesieve</code> alla linea <code>protocols</code> del nostro file <code>/etc/dovecot/dovecot.conf</code>; nella sezione <code>protocol managesieve</code> dovremmo trovare la linea <code>sieve=~/.dovecot.sieve</code> già impostata. Con questa impostazione il filtro Sieve per il nostro utente sarà posizionato in <code>/var/mail/example.com/john/.dovecot.sieve</code>.
 
=== Managesieve client ===
Sicuramente i nostri utenti non avranno voglia di impararsi il linguaggio di filtering di Sieve e avranno quindi bisogno di una maniera comoda di amministrare i loro filtri. Questo può essere fatto attraverso il plugin ''avelsieve'' di Squirrelmail:
<pre>
<pre>
# aptitude install avelsieve
'UPDATE virtual_users SET password = %4 WHERE email = "%1"',
</pre>
</pre>
Il pacchetto di Debian ha in alcune versioni un errore sulla porta di ascolto del demone Sieve; se la vostra versione è affetta da questo bug, al primo tentativo di login su Squirrelmail vi troverete davanti al messaggio:
inserendo la query corretta per la modifica della password dell'utente virtuale.
* Inseriamo il corretto metodo di crittazione usato dal nostro database:
<pre>
<pre>
Could not log on to timsieved daemon on your IMAP server localhost:4190
$password_encryption = 'MD5';
</pre>
</pre>
Il plugin avelsieve si è messo in ascolto sulla porta sbagliata... Apriamo il suo file di configurazione:
* Correggiamo la stringa:
<pre>
<pre>
# nano /usr/share/squirrelmail/plugins/avelsieve/config/config.php
$csp_salt_static = '';
</pre>
</pre>
e modifichiamo come segue la sezione incriminata:
e salviamo il file.
<br/>
Quindi riconfiguriamo Squirrelmail:
<pre>
<pre>
/* ======================================================================== */
# cd ../../config/
/* =================== ManageSieve Backend Options ======================== */
# ./conf.pl
/* ======================================================================== */
</pre>
/* Port where timsieved listens on the Cyrus IMAP server. Default is 2000. */
e attiviamo il plugin:
 
<pre> 
/** DEBIAN CHANGE: Despite upstream's intention Debian changed this default
8. Plugins
*  distribution wide to 4190 which is thus default here.
x. change_sqlpass
*/
Save S and exit Q.
global $sieveport;
$sieveport = 4190;
</pre>
</pre>
Effettuando ora il login su Squirrelmail noteremo una nuova voce di menu chiamata "Filters" da cui potremo impostare tutte le regole che vogliamo.
Effettuando il login nella nostra webmail, sotto la voce "Opzioni" troveremo la funzione "Cambia password".


=== Eliminare le email vecchie ===
==== Roundcube ====
Con il protocollo IMAP è possibile che alcuni client marchino le email come "cancellate" senza però eliminarle fisicamente dal server. L'utente non le vede più, ma queste continuano a occupare spazio sul nostro server. E' conveniente perciò impostare uno script che elimini queste mail in maniera automatica:
In alternativa (o affiancato) a Squirrelmail possiamo offrire il più moderno e eye-candy Roundcube, anch'esso presente nei repository di Debian. Per installarlo basta un comando:
* '''Lenny''':
<pre>
<pre>
find /var/vmail -type f -ctime +7 -name '*,ST' -delete
# apt-get -t lenny-backports install roundcube
</pre>
</pre>
Con questo comando, che possiamo inserire nel crontab del server, vengono eliminate tutte le email cancellate e più vecchie di 7 giorni.
* '''Da Squeeze in poi''':
 
<pre>
=== Ulteriori armi contro lo Spam ===
# apt-get install roundcube
Possiamo aggiungere altri due filtri collaborativi contro lo spam seguendo queste due guide:
</pre>
Rispondiamo di sì alla domanda dell'installer se configurare o meno un database con ''dbconfig-common'' e scegliamo come database il solito MySQL. Ci verrà poi richiesta la password di amministratore di MySQL e l'installazione terminerà.
<br/>
<br/>
* [[Pyzor]]
Ora modifichiamo il file di configurazione:
* [[Razor]]
<pre>
 
# nano /etc/roundcube/main.inc.php
=== Troubleshooting ===
</pre>
Se abbiamo problemi nell'inviare o ricevere mail possiamo:
modificando le linee:
* controllare il file di log <code>/var/log/mail.log</code>; quasi tutti i problemi sono elencati in questo file, con messaggi di errore più o meno chiari
<pre>
* eseguire il comando <code>postfix check</code>: se l'output è vuoto significa che Postfix è configurato bene
$rcmail_config['default_host'] = 'localhost';
* verificare la coda delle mail con il comando <code>postqueue -p -v</code>
$rcmail_config['force_https'] = true;
* impostare l'immediata spedizione di tutte le mail in coda: <code>mailq -q</code>
</pre>
* verificare il funzionamento di Amavis:
{{Suggerimento|Se il server su cui è installato Roundcube è diverso da quello su cui girano Postfix e Dovecot, dovrete impostare correttamente Roundcube affinchè possa connettersi al server remoto: <nowiki>$rcmail_config['smtp_server'] = 'tls://12.34.56.78';</nowiki>}}
Quindi modifichiamo il file che definisce il Virtual Host di Roundcube:
<pre>
# nano /etc/roundcube/apache.conf
</pre>
e decommentiamo le linee:
<pre>
<pre>
# /etc/init.d/amavisd-new stop
    Alias /roundcube/program/js/tiny_mce/ /usr/share/tinymce/www/
    Alias /roundcube /var/lib/roundcube
</pre>
Installiamo i driver MDB2:
<pre>
# pear install MDB2_Driver_mysql
</pre>
Riavviamo Apache:
<pre>
/etc/init.d/apache2 restart
</pre>
e facciamo login nella nostra webmail all'indirizzo: <code>http:// your-domain/roundcube</code>
 
===== Personalizzazione di Roundcube =====
Per essere più professionali nella nostra offerta, possiamo personalizzare alcune voci di Roundcube. Apriamo il suo file di configurazione:
<pre>
# nano /etc/roundcube/main.inc.php
</pre>
e modifichiamo le righe:
<pre>
#$rcmail_config['product_name'] = ‘RoundCube Webmail’;
$rcmail_config['product_name'] = ‘Il mio nome Webmail’;
</pre>
Quindi andiamo in <code>/var/lib/roundcube/skins/classic <oppure larry>/images</code> e sostituiamo il file <code>roundcube_logo.png</code> con una PNG contenente il nostro logo.
 
=== Filtri server-side: Sieve per Roundcube ===
Arrivati a questo punto siamo in possesso di un mail server completamente funzionale, che tagga addirittura le mail di spam; però il compito di filtrare le mail taggate come spam è lasciato al client di posta dell'utente finale.
<br/>
Utilizzando Sieve, un mail filter simile a procmail (che non utilizziamo perchè non lavora con le mailbox virtuali) possiamo fare in modo che i nostri utenti riescano a impostare dei filtri e delle regole ''server-side''.
<br/>
Roundcube è già pienamente compatibile con Sieve, dobbiamo solo informarlo della sua installazione:
<pre>
# cp /usr/share/roundcube/plugins/managesieve/config.inc.php.dist /etc/roundcube/plugins/managesieve/config.inc.php
</pre>
Ora apriamo il file di configurazione del plugin:
<pre>
# nano /etc/roundcube/plugins/managesieve/config.inc.php
</pre>
e impostiamo la corretta porta TCP dove Dovecot si aspetta le connessioni da Sieve:
<pre>
$rcmail_config['managesieve_port'] = 4190;
</pre>
Quindi abilitiamo il plugin ''managesieve'' in RoundCube:
<pre>
# nano /etc/roundcube/main.inc.php
</pre>
<pre>
$rcmail_config['plugins'] = array('managesieve');
</pre>
A questo punto, dalla schermata ''Impostazioni'' di ''Roundcube'' ogni utente troverà una nuova scheda chiamata ''Filtri'', dove potrà impostare tutti i filtri che gli interessano.
<br/>
Creiamo un file di configurazione per Sieve:
<pre>
# nano /var/vmail/globalsieverc
</pre>
contenente:
<pre>
require ["fileinto"];
 
# Sposto lo spam in un folder apposito
if header :contains "X-Spam-Flag" ["YES"] {
fileinto "Junk";
stop;
}
</pre>
e verifichiamo che sia leggibile dall'utente <code>vmail</code>:
<pre>
# chown vmail /var/vmail/globalsieverc
</pre>
Quindi modifichiamo la configurazione di Dovecot e inseriamo un plugin per il global filtering delle mail:
<pre>
# nano /etc/dovecot/conf.d/15-lda.conf
</pre>
e decommentando la voce:
<pre>
  mail_plugins = $mail_plugins sieve
</pre>
<pre>
# nano /etc/dovecot/conf.d/90-sieve.conf
</pre>
<pre>
plugin {
sieve = ~/.dovecot.sieve
sieve_dir = ~/sieve
sieve_before = /var/vmail/globalsieverc
}
</pre>
Riavviamo Dovecot:
<pre>
# /etc/init.d/dovecot restart
</pre>
 
=== Filtri server-side: Sieve per Squirrelmail ===
Managesieve è un'interfaccia low-level per amministrare gli script di Sieve. Per abilitarla è necessario aggiungere <code>managesieve</code> alla linea <code>protocols</code> del nostro file <code>/etc/dovecot/dovecot.conf</code>; nella sezione <code>protocol managesieve</code> dovremmo trovare la linea <code>sieve=~/.dovecot.sieve</code> già impostata. Con questa impostazione il filtro Sieve per il nostro utente sarà posizionato in <code>/var/mail/example.com/john/.dovecot.sieve</code>.
 
<br/>
Sicuramente i nostri utenti non avranno voglia di impararsi il linguaggio di filtering di Sieve e avranno quindi bisogno di una maniera comoda di amministrare i loro filtri. Questo può essere fatto attraverso il plugin ''avelsieve'' di Squirrelmail:
<pre>
# aptitude install avelsieve
</pre>
Il pacchetto di Debian ha in alcune versioni un errore sulla porta di ascolto del demone Sieve; se la vostra versione è affetta da questo bug, al primo tentativo di login su Squirrelmail vi troverete davanti al messaggio:
<pre>
Could not log on to timsieved daemon on your IMAP server localhost:4190
</pre>
Il plugin avelsieve si è messo in ascolto sulla porta sbagliata... Apriamo il suo file di configurazione:
<pre>
# nano /usr/share/squirrelmail/plugins/avelsieve/config/config.php
</pre>
e modifichiamo come segue la sezione incriminata:
<pre>
/* ======================================================================== */
/* =================== ManageSieve Backend Options ======================== */
/* ======================================================================== */
/* Port where timsieved listens on the Cyrus IMAP server. Default is 2000. */
 
/** DEBIAN CHANGE: Despite upstream's intention Debian changed this default
*  distribution wide to 4190 which is thus default here.
*/
global $sieveport;
$sieveport = 4190;
</pre>
Effettuando ora il login su Squirrelmail noteremo una nuova voce di menu chiamata "Filters" da cui potremo impostare tutte le regole che vogliamo.
 
=== Eliminare le email vecchie ===
Con il protocollo IMAP è possibile che alcuni client marchino le email come "cancellate" senza però eliminarle fisicamente dal server. L'utente non le vede più, ma queste continuano a occupare spazio sul nostro server. E' conveniente perciò impostare uno script che elimini queste mail in maniera automatica:
<pre>
find /var/vmail -type f -ctime +7 -name '*,ST' -delete
</pre>
Con questo comando, che possiamo inserire nel crontab del server, vengono eliminate tutte le email cancellate e più vecchie di 7 giorni.
 
=== Ulteriori armi contro lo Spam ===
Possiamo aggiungere altri due filtri collaborativi contro lo spam seguendo queste due guide:
<br/>
* [[Pyzor]]
* [[Razor]]
 
== Il mio server è stato blacklistato! ==
Ci siamo prodigati per proteggere il nostro mailserver, ma è accaduto lo stesso: il nostro indirizzo IP è stato inserito in una o più blacklist.
<br/>
Che cosa possiamo fare?
# Verificare in quali blacklist siamo stati inseriti; possiamo utilizzare alcuni tool online che in pochi attimi ci daranno il responso:
* [http://mxtoolbox.com/blacklists.aspx MxToolbox]
* [http://whatismyipaddress.com/blacklist-check What Is my IP address]
# Scrivere ai gestori della blacklist chiedendo la rimozione del nostro IP: non funzionerà, ma almeno potremo dire di averci provato!
# Verificare come è successo, analizzando tutta la configurazione e scandagliando i log
# Avvertire i clienti dell'inconveniente, invitandoli a controllare a loro volta le loro configurazioni e le loro postazioni
# In attesa che il nostro IP venga sbloccato, se possediamo più indirizzi IP possiamo configurare un secondo IP virtuale sulla nostra scheda di rete e inoltrare tutto il traffico di posta verso questo nuovo indirizzo, con il comando:
<pre>
# iptables -t nat -A POSTROUTING -p tcp --dport 25 -j SNAT --to-source NUOVO.INDIRIZZO.IP.ALIAS
</pre>
{{Warningbox|Se non abbiamo risolto il problema alla radice, in breve tempo anche il nuovo indirizzo IP finirà blacklistato}}
<br/>
Se abbiamo localizzato il dominio che sta inviando spam dal nostro mailserver, possiamo temporaneamente disabilitarlo dall'invio di nuove mail, dopo averlo comunicato agli intestatari.
<br/>
Per farlo dobbiamo modificare il file di configurazione di Postfix:
<pre>
# nano /etc/postfix/main.cf
</pre>
aggiungendo la sezione:
<pre>
smtpd_sender_restrictions =
      check_sender_access hash:/etc/postfix/sender_access
</pre>
Quindi creiamo il file:
<pre>
# nano /etc/postfix/sender_access
</pre>
di contenuto simile a questo:
<pre>
janedoe@acme.local REJECT
acme.com REJECT
bugsbunny@acme.com OK
</pre>
Infine informiamo Postfix:
<pre>
# postmap /etc/postfix/sender_access
</pre>
e riavviamo il demone:
<pre>
# /etc/init.d/postfix restart
</pre>
 
== Troubleshooting ==
Se abbiamo problemi nell'inviare o ricevere mail possiamo:
* controllare il file di log <code>/var/log/mail.log</code>; quasi tutti i problemi sono elencati in questo file, con messaggi di errore più o meno chiari
* eseguire il comando <code>postfix check</code>: se l'output è vuoto significa che Postfix è configurato bene
* verificare la coda delle mail con il comando <code>postqueue -p -v</code>
* impostare l'immediata spedizione di tutte le mail in coda: <code>mailq -q</code>
* verificare il funzionamento di Amavis:
<pre>
# /etc/init.d/amavisd-new stop
# /etc/init.d/amavisd-new debug
# /etc/init.d/amavisd-new debug
</pre>
</pre>


=== Credits ===
== Statistiche e report ==
Questa guida è basata sull'originale di Christoph Haas pubblicata sul sito [http://http://workaround.org/ Workaround.org].
Il pacchetto <code>pflogsumm</code> (Postfix Log Summary) è comodo per avere un sommario di ciò che succede sul nostro mailserver:
<pre>
# apt-get install pflogsumm
</pre>
Per utilizzarlo basta indicargli il percorso del file di log di Postfix:
<pre>
# pflogsumm /var/log/mail.log
 
messages
 
    129  received
    331  delivered
      1  forwarded
      8  deferred  (59  deferrals)
      3  bounced
    586  rejected (63%)
      0  reject warnings
      0  held
      0  discarded (0%)
 
  3108k  bytes received
  3967k  bytes delivered
    36  senders
    28  sending hosts/domains
    229  recipients
    147  recipient hosts/domains
</pre>
 
== Gestire una Mailing List ==
Nel caso volessimo installare anche un servizio per la gestione di mailing list, possiamo appoggiarci a <code>Mailman</code>, probabilmente il più diffuso mailing list manager open-source.
<br/>
Configureremo un virtual host con hostname <code>lists.example.com</code> in cui installeremo Mailman. <code>lists.example.com</code> sarà anche la parte destra dell'indirizzo delle mailing list che creeremo in Mailman, quindi ogni mailing list avrà un indirizzo del tipo <code><nome_lista>@lists.example.com</code>.
 
=== Installazione di Mailman ===
Mailman si appoggerà a Apache per il suo frontend.
<br>
Installiamo il software:
<pre>
# apt-get install mailman
</pre>
Durante l'installazione ci verranno poste le seguenti domande:
<pre>
Languages to support: <-- it (Italian)
</pre>
<pre>
Missing site list
Mailman needs a so-called "site list", which is the list from which password reminders and such are sent out from.
This list needs to be created before mailman will start.
To create the list, run "newlist mailman" and follow the instructions on-screen.
Note that you also need to start mailman after that, using /etc/init.d/mailman start. <-- Ok
</pre>
 
=== Configurazione di Mailman ===
Mailman ha già un suo file di configurazione per Apache quasi pronto. Dobbiamo solo copiarlo nella directory corretta:
<pre>
# cp /etc/mailman/apache.conf /etc/apache2/sites-available/mailman.conf
</pre>
e modificare alcune cose:
<pre>
# nano /etc/apache2/sites-available/mailman.conf
</pre>
Alla fine del file, dopo la sezione commentata del virtual host già presente (da lasciare commentata!), aggiungiamo la configurazione del nostro virtual host:
<pre>
[...]
<VirtualHost *:80>
ServerName lists.example.com
DocumentRoot /var/www/lists
ErrorLog /var/log/apache2/lists-error.log
CustomLog /var/log/apache2/lists-access.log combined
 
<Directory /var/lib/mailman/archives/>
    Options FollowSymLinks
    AllowOverride None
</Directory>
 
Alias /pipermail/ /var/lib/mailman/archives/public/
Alias /images/mailman/ /usr/share/images/mailman/
ScriptAlias /admin /usr/lib/cgi-bin/mailman/admin
ScriptAlias /admindb /usr/lib/cgi-bin/mailman/admindb
ScriptAlias /confirm /usr/lib/cgi-bin/mailman/confirm
ScriptAlias /create /usr/lib/cgi-bin/mailman/create
ScriptAlias /edithtml /usr/lib/cgi-bin/mailman/edithtml
ScriptAlias /listinfo /usr/lib/cgi-bin/mailman/listinfo
ScriptAlias /options /usr/lib/cgi-bin/mailman/options
ScriptAlias /private /usr/lib/cgi-bin/mailman/private
ScriptAlias /rmlist /usr/lib/cgi-bin/mailman/rmlist
ScriptAlias /roster /usr/lib/cgi-bin/mailman/roster
ScriptAlias /subscribe /usr/lib/cgi-bin/mailman/subscribe
ScriptAlias /mailman/ /usr/lib/cgi-bin/mailman/
ScriptAlias / /usr/lib/cgi-bin/mailman/listinfo
</VirtualHost>
</pre>
L'ultima direttiva <code>ScriptAlias / /usr/lib/cgi-bin/mailman/listinfo</code> è opzionale; ha senso se non abbiamo nessun file index nella root del virtual host e vogliamo che digitando <code>http://lists.example.com/</code> si venga diretti automaticamente verso <code>http://lists.example.com/listinfo</code>.
<br/>
Quindi creiamo la document root <code>/var/www/lists</code>, abilitiamo il nuovo Virtual Host e riavviamo Apache:
<pre>
# mkdir /var/www/lists
# a2ensite mailman.conf
# /etc/init.d/apache2 restart
</pre>
Dato che stiamo usando un Virtual Host, dobbiamo sistemare alcune variabili nella configurazione di Mailman in <code>/etc/mailman/mm_cfg.py</code>:
<pre>
# nano /etc/mailman/mm_cfg.py
</pre>
<pre>
[...]
DEFAULT_URL_PATTERN = 'http://%s/'
[...]
DEFAULT_EMAIL_HOST = 'lists.example.com'
[...]
DEFAULT_URL_HOST = 'lists.example.com'
[...]
</pre>
 
=== Configurazione di Postfix ===
Ora dobbiamo configurare Postfix. Impostiamo alcune direttive per Mailman:
<pre>
# postconf -e 'relay_domains = lists.example.com'
# postconf -e 'mailman_destination_recipient_limit = 1'
</pre>
Quindi apriamo il file:
<pre>
# nano /etc/postfix/master.cf
</pre>
e controlliamo che siano presenti le seguenti linee (di default dovrebbero esserci):
<pre>
[...]
mailman  unix  -      n      n      -      -      pipe
  flags=FR user=list argv=/usr/lib/mailman/bin/postfix-to-mailman.py
  ${nexthop} ${user}
[...]
</pre>
Ora dobbiamo associare il dominio <code>lists.example.com</code> al corretto ''transport'' <code>mailman:</code>. Questa operazione è possibile in diversi modi: nel nostro setup non abbiamo configurato i transport di Postfix all'interno del database MySQL degli utenti virtuali, quindi procederemo con la configurazione attraverso un file di testo.
<br/>
Iniziamo con introdurre la direttiva seguente nella configurazione di Postfix:
<pre>
# postconf -e 'transport_maps = hash:/etc/postfix/transport'
</pre>
Quindi creiamo il file
<pre>
# nano /etc/postfix/transport
</pre>
e diamogli il contenuto:
<pre>
lists.example.com      mailman:
</pre>
Creiamo l'hash del file:
<pre>
# postmap -v /etc/postfix/transport
</pre>
e riavviamo Postfix:
<pre>
# /etc/init.d/postfix restart
</pre>
 
=== Creazione della prima lista ===
Prima di avviare Mailman, è necessario creare una lista chiamata <code>mailman</code>; è obbligatoria, senza di questa Mailman non partirà:
<pre>
# newlist --urlhost=lists.example.com --emailhost=lists.example.com mailman
</pre>
Solitamente gli switch <code>--urlhost</code> e <code>--emailhost</code> non sono necessari, dal momento che abbiamo già configurato il file <code>/etc/mailman/mm_cfg.py</code>, ma per sicurezza sono solito indicarli esplicitamente.
<br/>
Dovremo rispondere ad alcune domande:
<pre>
Enter the email of the person running the list: <-- Indicare l'amministratore della lista, ad esempio amministratore@example.com
Initial mailman password: <-- La password per amministrare la lista
</pre>
Prima di poter utilizzare la lista dovremo modificare il file <code>/etc/aliases</code> come indicato da Mailman, cioè aggiungendo le seguenti linee:
<pre>
## mailman mailing list
mailman:              "|/var/lib/mailman/mail/mailman post mailman"
mailman-admin:        "|/var/lib/mailman/mail/mailman admin mailman"
mailman-bounces:      "|/var/lib/mailman/mail/mailman bounces mailman"
mailman-confirm:      "|/var/lib/mailman/mail/mailman confirm mailman"
mailman-join:        "|/var/lib/mailman/mail/mailman join mailman"
mailman-leave:        "|/var/lib/mailman/mail/mailman leave mailman"
mailman-owner:        "|/var/lib/mailman/mail/mailman owner mailman"
mailman-request:      "|/var/lib/mailman/mail/mailman request mailman"
mailman-subscribe:    "|/var/lib/mailman/mail/mailman subscribe mailman"
mailman-unsubscribe:  "|/var/lib/mailman/mail/mailman unsubscribe mailman"
</pre>
Infine premiamo Enter e chiudiamo la procedura di creazione della lista:
<pre>
Hit enter to notify mailman owner... <-- ENTER
</pre>
Apriamo quindi <code>/etc/aliases</code> e modifichiamolo come suggerito:
<pre>
# nano /etc/aliases
</pre>
<pre>
[...]
## mailman mailing list
mailman:              "|/var/lib/mailman/mail/mailman post mailman"
mailman-admin:        "|/var/lib/mailman/mail/mailman admin mailman"
mailman-bounces:      "|/var/lib/mailman/mail/mailman bounces mailman"
mailman-confirm:      "|/var/lib/mailman/mail/mailman confirm mailman"
mailman-join:        "|/var/lib/mailman/mail/mailman join mailman"
mailman-leave:        "|/var/lib/mailman/mail/mailman leave mailman"
mailman-owner:        "|/var/lib/mailman/mail/mailman owner mailman"
mailman-request:      "|/var/lib/mailman/mail/mailman request mailman"
mailman-subscribe:    "|/var/lib/mailman/mail/mailman subscribe mailman"
mailman-unsubscribe:  "|/var/lib/mailman/mail/mailman unsubscribe mailman"
</pre>
Quindi aggiorniamo la configurazione degli alias e riavviamo Postfix:
<pre>
# newaliases
# /etc/init.d/postfix restart
</pre>
Ora siamo pronti per avviare Mailman:
<pre>
# /etc/init.d/mailman start
</pre>
 
=== Amministrazione di Mailman ===
Da questo momento possiamo amministrare le liste attraverso l'interfaccia web di Mailman, raggiungibile all'indirizzo:
<pre>
http://lists.example.com/admin
</pre>
 
=== Creazione di nuove liste ===
Possiamo creare nuove mailing list con questa procedura:
<pre>
# newlist --urlhost=lists.example.com --emailhost=lists.example.com testlist2
</pre>
<pre>
Enter the email of the person running the list: <-- amministratore2@example.com
Initial testlist2 password: <-- Password dell'amministratore
To finish creating your mailing list, you must edit your /etc/aliases (or
equivalent) file by adding the following lines, and possibly running the
`newaliases' program:
 
## testlist2 mailing list
testlist2:              "|/var/lib/mailman/mail/mailman post testlist2"
testlist2-admin:        "|/var/lib/mailman/mail/mailman admin testlist2"
testlist2-bounces:      "|/var/lib/mailman/mail/mailman bounces testlist2"
testlist2-confirm:      "|/var/lib/mailman/mail/mailman confirm testlist2"
testlist2-join:        "|/var/lib/mailman/mail/mailman join testlist2"
testlist2-leave:        "|/var/lib/mailman/mail/mailman leave testlist2"
testlist2-owner:        "|/var/lib/mailman/mail/mailman owner testlist2"
testlist2-request:      "|/var/lib/mailman/mail/mailman request testlist2"
testlist2-subscribe:    "|/var/lib/mailman/mail/mailman subscribe testlist2"
testlist2-unsubscribe:  "|/var/lib/mailman/mail/mailman unsubscribe testlist2"
 
Hit enter to notify testlist2 owner... <-- ENTER
</pre>
Quindi modifichiamo:
<pre>
# nano /etc/aliases
</pre>
aggiungendo
<pre>
[...]
## testlist2 mailing list
testlist2:              "|/var/lib/mailman/mail/mailman post testlist2"
testlist2-admin:        "|/var/lib/mailman/mail/mailman admin testlist2"
testlist2-bounces:      "|/var/lib/mailman/mail/mailman bounces testlist2"
testlist2-confirm:      "|/var/lib/mailman/mail/mailman confirm testlist2"
testlist2-join:        "|/var/lib/mailman/mail/mailman join testlist2"
testlist2-leave:        "|/var/lib/mailman/mail/mailman leave testlist2"
testlist2-owner:        "|/var/lib/mailman/mail/mailman owner testlist2"
testlist2-request:      "|/var/lib/mailman/mail/mailman request testlist2"
testlist2-subscribe:    "|/var/lib/mailman/mail/mailman subscribe testlist2"
testlist2-unsubscribe:  "|/var/lib/mailman/mail/mailman unsubscribe testlist2"
</pre>
Infine:
<pre>
# newaliases
# /etc/init.d/postfix restart
</pre>
 
== Credits ==
Questa guida è basata sull'originale di Christoph Haas pubblicata sul sito [http://workaround.org/ Workaround.org].
<br/>
<br/>
<br/>
<br/>
Riga 1 942: Riga 2 660:
{{Autori
{{Autori
|Autore = [[Utente:Ferdybassi|Ferdybassi]] 22:22, 2 apr 2011 (CEST)
|Autore = [[Utente:Ferdybassi|Ferdybassi]] 22:22, 2 apr 2011 (CEST)
|Verificata_da =
: risca 10:52, 6 apr 2014 (CEST)
|Numero_revisori = 1
}}
}}


Menu di navigazione