Piero V.

Parte VI muletto: i server Postfix e Dovecot

Introduzione

Ultima revisione: Settembre 2010

(Ovviamente) questa guida non è farina del mio sacco ma è l’insieme di più guide.

Una guida completa è Congiuriamo un server di posta completo se Debian etch (postfix) di Il portalinux.

Poi ho consultato anche questa guida su postfix su XS4ALL

Un’altra fonte sono i readme di Postfix Admin.

Per la configurazione di Dovecot ho consulato Johnny Chadda .se, anche se in realtà è solo da decommentare.

Attenzione:Per questo tutorial si userà la shell come root.

Alcune cose le darò per scontato, per esempio la modifica di un file di testo.

Questa, con l’editor nano si fa così: nano nomefile, per salvare un file si usa CTRL+O mentre per uscire dall’editor si fa CTRL+X.

Siamo sotto Debian GNU Linux (vedere le guide precedenti) ma dovrebbe funzionare anche su altre distribuzioni, al massimo adattate il gestore di pacchetti o compilate voi il software.

Per decommentare la maggior parte delle volte basta levare il # all’inizio di una riga.

Ecco la lista del software (tutto software libero):

  • Debian (Lenny ma anche su Unstable dovrebbe funzionare)
  • Postfix
  • Dovecot
  • MySQL
  • Postgrey
  • Spamassassin
  • FQDL Check
  • RDL
  • Pyzor
  • Razor
  • ClamAV
  • Apache 2
  • PHP 5
  • Postfix Admin
  • Roundcube webmail

Per il server LAMP vi rimando alla guida precedente. Inoltre sempre da quella guida verrà usato il Virtual Host creato appositamente per gli strumenti di amministrazione.

Per il resto possiamo pure dare:

apt-get install postfix postfix-mysql libsasl2-modules libsasl2-modules-sql sasl2-bin libpam-mysql amavisd-new \
spamassassin clamav clamav-daemon razor pyzor postgrey dovecot-imapd dovecot-pop3d

Questa guida poi non è assolutamente seria. Va bene per un muletto, ma non per altro.

Vi avviso poi che serve un dominio a postfix… Al massimo potete operare con il file hosts ma poi non funzionerà verso l’esterno.

Io ho usato inizialmente no-ip.com perché tempo fa mi ero registrato, poi non l’avevo più usato ma poi ho usato DotTk con uno script python che aggiorna da solo l’indirizzo IP.

La configurazione di postfix-mysql

Il database usato si chiamerà postfix e così anche l’utente, tuttavia le tabelle le costruirà postfix admin.

File mysql_virtual_alias_maps.cf::

user = postfix
password = password
hosts = localhost
dbname = postfix
query = SELECT goto FROM alias WHERE address='%s' AND active = '1'

File /etc/postfix/mysql_virtual_alias_domain_maps.cf:

user = postfix
password = password
hosts = localhost
dbname = postfix
query = SELECT goto FROM alias,alias_domain WHERE alias_domain.alias_domain = '%d' and alias.address = CONCAT('%u', '@', alias_domain.target_domain) AND alias.active = 1 AND alias_domain.active='1'

File /etc/postfix/mysql_virtual_alias_domain_catchall_maps.cf:

user = postfix
password = password
hosts = localhost
dbname = postfix
query = SELECT goto FROM alias,alias_domain WHERE alias_domain.alias_domain = '%d' and alias.address = CONCAT('@', alias_domain.target_domain) AND alias.active = 1 AND alias_domain.active='1'

File /etc/postfix/mysql_virtual_domains_maps.cf:

user = postfix
password = password
hosts = localhost
dbname = postfix
query = SELECT domain FROM domain WHERE domain='%s' AND active = '1'

File /etc/postfix/mysql_virtual_mailbox_maps.cf:

user = postfix
password = password
hosts = localhost
dbname = postfix
query = SELECT maildir FROM mailbox WHERE username='%s' AND active = '1'

File /etc/postfix/mysql_virtual_alias_domain_mailbox_maps.cf:

user = postfix
password = password
hosts = localhost
dbname = postfix
query = SELECT maildir FROM mailbox,alias_domain WHERE alias_domain.alias_domain = '%d' and mailbox.username = CONCAT('%u', '@', alias_domain.target_domain) AND mailbox.active = 1 AND alias_domain.active='1'

File /etc/postfix/mysql-virtual-mailbox-limit-maps.cf:

user = postfix
password = password
hosts = localhost
dbname = postfix
query = SELECT quota FROM mailbox WHERE username='%s' AND active = '1'

Ora cambiamo permessi ai file creati (hanno password!) e gruppo:

chmod o= /etc/postfix/mysql_virtual_*.cf
chgrp postfix /etc/postfix/mysql_virtual_*.cf

Ora creiamo l’utente vmail che sarà il proprietario dei vari file delle caselle:

groupadd -g 5000 vmail
useradd -g vmail -u 5000 vmail -d /home/vmail -m

Ora modifichiamo il file main.cf con dei comandi:

postconf -e 'myhostname = server.dominio.com'
postconf -e 'mydestination = localhost, localhost.localdomain'
postconf -e 'mynetworks = 127.0.0.0/8'
postconf -e 'virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql_virtual_domains_maps.cf'
postconf -e 'virtual_alias_maps = proxy:mysql:/etc/postfix/mysql_virtual_alias_maps.cf, proxy:mysql:/etc/postfix/mysql_virtual_alias_domain_maps.cf, proxy:mysql:/etc/postfix/mysql_virtual_alias_domain_catchall_maps.cf'
postconf -e 'virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf, proxy:mysql:/etc/postfix/mysql_virtual_alias_domain_mailbox_maps.cf'
postconf -e 'virtual_mailbox_base = /home/vmail'
postconf -e 'virtual_uid_maps = static:5000′
postconf -e 'virtual_gid_maps = static:5000′
postconf -e 'smtpd_sasl_auth_enable = yes'
postconf -e 'broken_sasl_auth_clients = yes'
postconf -e 'smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination'
postconf -e 'smtpd_use_tls = no'
postconf -e 'virtual_create_maildirsize = yes'
postconf -e 'virtual_mailbox_extended = yes'
postconf -e 'virtual_mailbox_limit_maps = proxy:mysql:/etc/postfix/mysql_virtual_mailbox_limit_maps.cf'
postconf -e 'virtual_mailbox_limit_override = yes'
postconf -e 'virtual_maildir_limit_message = "The user you are trying to reach is over quota."'
postconf -e 'virtual_overquota_bounce = yes'
postconf -e 'proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $virtual_mailbox_limit_maps'

Ora riavviamo postfix:

/etc/init.d/postfix restart

Configurazione di saslauthd

Poiché Postfix è in un ambiente di chroot, dobbiamo dare a SASL una directory dentro al chroot che non esiste ancora. Diamo questo comando:

mkdir -p /var/spool/postfix/var/run/saslauthd

Poi modifichiamo il file /etc/default/saslauthd:

# Should saslauthd run automatically on startup? (default: no)
START=yes
[...]
# Other options (default: -c)
# See the saslauthd man page for information about these options.
#
# Example for postfix users: “-c -m /var/spool/postfix/var/run/saslauthd”
# Note: See /usr/share/doc/sasl2-bin/README.Debian
OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd -r"

Creiamo il file /etc/pam.d/smtp:

auth required pam_mysql.so user=postfix passwd=password host=127.0.0.1 db=postfix table=mailbox usercolumn=username passwdcolumn=passsword crypt=1
account sufficient pam_mysql.so user=postfix passwd=password host=127.0.0.1 db=postfix table=mailbox usercolumn=username passwdcolumn=passsword crypt=1

Ora riavviamo i demoni interessati dai cambiamenti:

/etc/init.d/postfix restart
/etc/init.d/saslauthd restart

Configuriamo Amavisd-new, ClamaV e Spamassassin

Continuiamo il tutorial configurando Amavisd-new, ClamaV e Spamassassin.

Questi strumenti servono per proteggere la posta da virus e il server da Spam.

Nel file /etc/amavis/conf.d/15-content_filter_mode decommentiamo:

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

@bypass_spam_checks_maps = (
   \%bypass_spam_checks, \@bypass_spam_checks_acl, \$bypass_spam_checks_re);

Ora, al file /etc/amavis/conf.d/50-user aggiungiamo:

$pax='pax';

Ora digitiamo:

adduser clamav amavis

Il passo seguente è dire a postfix che deve controllare le mail con questi programmi:

postconf -e 'content_filter = amavis:[127.0.0.1]:10024'
postconf -e 'receive_override_options = no_address_mappings'

E poi modificando il file /etc/postfix/master.cf aggiungendo:

amavis    unix  -       -       -       -       -       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

Ora riavviamo alcuni servizi:

/etc/init.d/amavis restart
/etc/init.d/clamav-daemon restart
/etc/init.d/clamav-freshclam restart
/etc/init.d/postfix restart

Ora diamo netstat -tap. Ad un certo punto dovremmo vedere:

tcp        0      0 localhost:10024         *:*                     LISTEN      1656/amavisd (maste
tcp        0      0 localhost:10025         *:*                     LISTEN      2899/master

Configuriamo tutto in modo da combattere il phishing con pyzor e razor

Modifichiamo il file /etc/spamassassin/local.cf:

#pyzor
use_pyzor 1
pyzor_path /usr/bin/pyzor
pyzor_add_header 1

#razor
use_razor2 1
razor_config /etc/razor/razor-agent.conf

#bayes
use_bayes 1
use_bayes_rules 1
bayes_auto_learn 1

Poi riavviamo amavis:

/etc/init.d/amavis restart

Configuriamo FQDN Check e RBL

Aggiungiamo a /etc/postfix/main.cf:

### Checks to remove badly formed email
smtpd_helo_required = yes
strict_rfc821_envelopes = yes
disable_vrfy_command = yes
unknown_address_reject_code = 554
unknown_hostname_reject_code = 554
unknown_client_reject_code = 554
smtpd_helo_restrictions = permit_mynetworks, reject_invalid_hostname, regexp:/etc/postfix/helo.regexp, permit
### When changing sender_checks, this file must be regenerated using postmap , to generate a Berkeley DB
smtpd_recipient_restrictions =
  check_client_access hash:/etc/postfix/helo_client_exceptions
  check_sender_access hash:/etc/postfix/sender_checks,
  reject_invalid_hostname,
  reject_non_fqdn_hostname,
  reject_non_fqdn_sender,
  reject_non_fqdn_recipient,
  reject_unknown_sender_domain,
  reject_unknown_recipient_domain,
  permit_mynetworks,
  reject_unauth_destination,
  # Add RBL exceptions here, when changing rbl_client_exceptions, this
  #file must be regenerated using postmap , to generate a
  #Berkeley DB
  check_client_access hash:/etc/postfix/rbl_client_exceptions,
  reject_rbl_client cbl.abuseat.org,
  reject_rbl_client sbl-xbl.spamhaus.org,
  reject_rbl_client bl.spamcop.net,
  reject_rhsbl_sender dsn.rfc-ignorant.org,
  permit

Quindi create i file:

/etc/postfix/helo.regexp:

/^subdomain\.host\.com$/ 550 Don’t use my own hostname
/^xxx\.yyy\.zzz\.xxx$/ 550 Don’t use my own IP address
/^\[xxx\.yyy\.zzz\.xxx\]$/ 550 Don’t use my own IP address
/^[0-9.]+$/ 550 Your software is not RFC 2821 compliant
/^[0-9]+(\.[0-9]+){3}$/ 550 Your software is not RFC 2821 compliant

/etc/postfix/helo_client_exceptions:

#These client IP addresses are allowed to bypass fqdn checks
# Some Comment to identify IP address below
#www.xxx.yyy.zzz OK

/etc/postfix/rbl_client_exceptions:

## Some Random comment
#www.xxx.yyy.zzz OK

Gli ultimi due file servono per le eccezioni.

Quando li si modificano, bisogna ricaricarli con postmap nomefile:

postmap /etc/postfix/helo.regexp
postmap /etc/postfix/helo_client_exceptions
postmap /etc/postfix/rbl_client_exceptions

Configurazione di PostGrey

PostGrey è il demone che si occupa del greylisting per postfix.

Con il greylisting quando qualcuno cerca di inviare una mail, viene bannato per un tempo dal server e deve riprovare dopo un tot di tempo.

Solitamente gli spammer non si fermano a riprovare, perciò elimina un bel po’ di carico.

Ecco come configurarlo: modifichiamo il file /etc/default/postgrey:

POSTGREY_OPTS="--inet=127.0.0.1:60000 --delay=60"

Delay indica il tempo in secondi che uno deve aspettare. Il massimo che è anche il valore di default è 300 (5 minuti).

Ora riavviamo postgrey:

/etc/init.d/postgrey restart

Quindi aggiungamo al file /etc/postfix/main.cf:

### Postgrey
smtpd_recipient_restrictions = permit_sasl_authenticated,
  permit_mynetworks,
  reject_unauth_destination,
  check_policy_service inet:127.0.0.1:60000

Ora riavviamo per l’ultima volta postfix:

/etc/init.d/postfix restart

Per postfix abbiamo finito, quindi ora siamo (dovremmo, vedi dopo) essere in grado di spedire mail e accoglierle.

Configurazione di Dovecot

Tuttavia non possiamo leggere le mail ricevute, perciò ci occorre un server pop3/imap, nel nostro caso dovecot.

Dobbiamo decommentare delle linee e cambiarne alcune su /etc/dovecot/dovecot.conf:

Riga 19:
base_dir = /var/run/dovecot/
Riga 24:
protocols = imap pop3
Da linea 34 a linea 42:
protocol imap {
    listen = *:143
#     ssl_listen = *:10943
#     ..
}
protocol pop3 {
    listen = *:110
#     ..
}
Riga 78:
log_timestamp = "%Y-%m-%d %H:%M:%S "
Riga 83:
syslog_facility = mail
Riga 218:
mail_location = maildir:/home/vmail/%d/%n
Da riga 514:
protocol imap {
  login_executable = /usr/lib/dovecot/imap-login
  [...]
  mail_executable = /usr/lib/dovecot/imap
  [...]
  imap_max_line_length = 65536
}
Da riga 579:
protocol pop3 {
  login_executable = /usr/lib/dovecot/pop3-login
  [...]
  mail_executable = /usr/lib/dovecot/pop3
  [...]
  pop3_uidl_format = %08Xu%08Xv
}
Da riga 704:
protocol lda {
  postmaster_address = postmaster@miodominio.com
  sendmail_path = /usr/lib/sendmail
  auth_socket_path = /var/run/dovecot/auth-master
}
Da riga 788:
auth_verbose = no
[...]
auth_debug = no
[...]
auth_debug_passwords = no
Da riga 811:
auth default {
  mechanisms = plain
  [...]
  passdb sql {
    args = /etc/dovecot/dovecot-sql.conf
  }
  [...]
  userdb sql {
    args = /etc/dovecot/dovecot-sql.conf
  }
  [...]
  user = nobody
  socket listen {
    master {
      path = /var/run/dovecot/auth-master
      mode = 0660
      user = vmail
      group = vmail
    }
    client {
      path = /var/spool/postfix/private/auth
      mode = 0660
      user = postfix
      group = postfix
    }
  }
}

Aggiungiamo alla fine del file /etc/dovecot/dovecot-sql.conf:

driver = mysql
connect= host=localhost dbname=postfix user=postfix password=password
default_pass_scheme = MD5-CRYPT
user_query = SELECT maildir, 5000 AS uid, 5000 AS gid FROM mailbox WHERE username = '%u' AND active='1'
password_query = SELECT username AS user,password FROM mailbox WHERE username = '%u' AND active='1'

Anche a questi file dobbiamo dare dei permessi (contentono password):

chmod 600 /etc/dovecot/*.conf
chown vmail /etc/dovecot/*.conf

Installazione di postfix admin

Creeremo le tabelle e gli utenti con il tool Postfix Admin, un tool basato su PHP.

Io lo installerò nel virtualhost di cui avevo già parlato precedentemente, perciò ho aggiungo a /etc/apache2/sites-available/admin:

	<Directory /home/server/pfadmin/>
		Options FollowSymLinks MultiViews
		AllowOverride All
		Order deny,allow
		Deny from all
		php_flag magic_quotes_gpg off
		php_flag magic-quotes-runtime off
	</Directory>

In questo caso l’applicazione sarà salvata sotto /home/server/pfadmin.

Procediamo con l’installazione di Postfix Admin.

Seppure distribuiscano una versione in .deb ho preferito installarlo alla vecchia maniera.

Vi ho facilitato il compito con questi comandi:

cd /home/server
wget -q -O- http://sourceforge.net/projects/postfixadmin/files/postfixadmin/postfixadmin-2.3.2/postfixadmin-2.3.2.tar.gz/download | tar -xzvf -
mv postfixadmin-2.3.2/ pfadmin/
chown -R root:www-data pfadmin/
cd pfadmin
chmod 640 *.php
sed -i 's/EHLO/HELO/' functions.inc.php
sed -i 's/change-this-to-your.domain.tld/miodominio.com/' config.inc.php

Ovviamente l’ultima linea ve cambiata come va meglio per voi.

Prima di procedere con la configurazione di postfix admin, va creato l’utente e il database postfix. Io l’ho fatto con phpMyAdmin (vedi il post sulla configurazione di LAMP).

Ho creato l’user postfix creando anche un db dove ha tutti i permessi.

Mi sono fidato di darlo in pasto anche a postfix admin ma se volete potete creare l’utente postfixadmin con permessi di select, insert, update, delete, create, alter, drop e index sul db postfix.

Ora modificare il file config.inc.php mettendo le vostre configurazioni, dopodiché andate sul file setup.php col browser.

Per la configurazione potete benissimo cavarvela da soli, perché è tutto commentato e se masticate un po’ di inglese capite tutto.

Nel setup del browser vi dà anche la password per l’amministrazione di postfix admin che dovrà essere salvata nelle prime linee di config.inc.php.

Ora potete creare gli utenti del vostro database e potete già ricevere e (forse) inviare mail.

Installazione di Round Cube

Per avere qualcosa di completo, c’è bisogno anche di una webmail. Tuttavia se non vi interessa potete passare anche alle conclusioni.

Per la webmail ho fatto ricorso a Round Cube.

Possiamo tranquillamente installarla dai repo di Debian:

apt-get install roundcube php-mdb2-driver-mysql

Il database potete configurarlo in automatico e anche apache.

Una nota sul secondo pacchetto: seppure voi configuriate in automatico il database, lui non vi informerà che serve anche una libreria in più per mdb2 e io ci sono impazzito non poco!

Ora dobbiamo configurare apache per usarlo.

Questa è una tipica applicazione che richiede una connessione cifrata ma la mia voglia di fare certificati vari è sempre bassa.

Il virtualhost della mail l’ho messo sulla porta 8080, ma chissà che magari un giorno non arrivi un sottodominio per la mail 😊

Come abbiamo già fatto modifichiamo /etc/apache2/ports.conf e aggiungiamo:

NameVirtualHost *:8080
Listen 8080

Poi creiamo il file /etc/apache2/sites-available/mail:

<VirtualHost *:8080>
	ServerAdmin webmaster@miodominio.com
	DocumentRoot /var/lib/roundcube
	Alias /program/js/tiny_mce/ /usr/share/tinymce/www/
	ErrorLog /var/log/apache2/mail_error.log
	LogLevel warn
	CustomLog /var/log/apache2/mail_access.log combinated
</VirtualHost>

Ora dovrebbe funzionare tutto.

Conclusioni

Per prima cosa vi consiglio di disabilitare innoDb se usate vecchio hardware.

I log sono sempre vostri amici, quindi se qualcosa va male, guardateli!

Sotto mydestination, lasciate solo localhost o non funzionerà niente o se è lo stesso nome dell’utente del sistema le mail saranno sotto /var/spool/mail/utente.

Le maildir sono create in automatico, quindi no problem 😊

Il mio blog si diverte a cambiare caratteri, perciò attenti che se fate copia e incolla. E taglia anche alcuni spazi come i due spazi che servono nei file di configurazione di postfix se dovete mettere delle opzioni su più linee.

Ecco la nota di cui parlavo prima, mettendo il forse prima dell’inviare mail.

Ci sarebbe molto più spam se tutti gli indirizzi IP potessero inviare mail direttamente ai server, perciò è abbastanza normale che abbiate bisogno di un server che fa da “garante” chiamato relay host e va messo con la direttiva relayhost in /etc/postfix/main.cf.

Io ho provato solo con server che non richiedono autenticazione.

Quindi normalmente quello del vostro provider dovrebbe funzionare (almeno su Alice, provato e su NGI, teorico), mentre Yahoo, Gmail etc che hanno autenticazione e permessi non vi so dire.

Una volta impostato il relay host non dovreste avere più alcun tipo di problema anche perché la guida è stata testata direttamente sul mio muletto.

Non mi resta che augurarvi buona fortuna e se avete problemi commentate pure.

4 commenti