Virtual Users And Domains With Postfix, Courier, MySQL (Ubuntu 8.04 LTS 64bit)


Questa guida vuole essere una quick reference per installare un server di posta con antispam e gestione relativamente semplice di utenti e domini, tramite ubuntu 8.04 TLS 64bit.

Le feature principali sono:

SMTP-AUTH e TLS

password encrypted

Amavisd, SpamAssassin e ClamAV

La guida di riferimento principale la potete trovare all’indirizzo http://www.howtoforge.com/virtual-users-domains-postfix-courier-mysql-squirrelmail-ubuntu8.04, la scrivo per il semplice motivo che la versione di ubuntu a 64bit differisce per alcuni pacchetti rispetto alla versione equivalente a 32bit. A differenza della guida principale ho deciso di non utilizzare la quota, in quanto volevo un sistema che non necessitasse di alcun tipo di ricompilazione esterna.

1. Preliminari

Eseguiamo:
[email protected]: sudo su
[email protected]: ln -sf /bin/bash /bin/sh
[email protected]: /etc/init.d/apparmor stop
[email protected]: update-rc.d -f apparmor remove

2. Install Postfix, Courier, Saslauthd, MySQL, phpMyAdmin

Procediamo con l’installazione dei pacchetti che ci servono:

[email protected]: apt-get install postfix postfix-mysql postfix-doc mysql-client mysql-server courier-authdaemon courier-authlib-mysql courier-pop courier-pop-ssl courier-imap courier-imap-ssl libsasl2-2 libsasl2-modules libsasl2-modules-sql sasl2-bin libpam-mysql openssl phpmyadmin apache2 libapache2-mod-php5 php5 php5-mysql libpam-smbpass

A questo punto vi verranno fatte delle domande post installazione a cui dovrete risopndere come a seguire:

New password for the MySQL “root” user: <– yourrootsqlpassword
Repeat password for the MySQL “root” user: <– yourrootsqlpassword
Create directories for web-based administration? <– No
General type of mail configuration: <– Internet Site
System mail name: <– server1.example.com
SSL certificate required <– Ok
Web server to reconfigure automatically: <– apache2

A questo punto sulla guida originale si passava alla configurazione della quota, che noi non vogliamo usare, se voi volete farlo, prendete come riferimento la guida originale.

3. Creiamo il database MySQL per Postfix/Courier

Creiamo il database mail

[email protected]: mysqladmin -u root -p create mail

entriamo nella shell di mysql

[email protected]: mysql -u root -p

On the MySQL shell, we create the user mail_admin with the passwort mail_admin_password (replace it with your own password) who has SELECT,INSERT,UPDATE,DELETE privileges on the mail database. This user will be used by Postfix and Courier to connect to the mail database

Sulla shell di MySQL, creeremo l’utente mail_admin con la password “mail_admin_password“, che avrà diritti di SELECT,INSERT,UPDATE,DELETE sul database mail.

mysql> GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO 'mail_admin'@'localhost' IDENTIFIED BY 'mail_admin_password';
mysql> GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO 'mail_admin'@'localhost.localdomain' IDENTIFIED BY 'mail_admin_password';
mysql> FLUSH PRIVILEGES;

selezioniamo ora il database mail

mysql> USE mail;

Creiamo ora le tabelle che ci servono:

CREATE TABLE domains (
domain varchar(50) NOT NULL,
PRIMARY KEY (domain) )
TYPE=MyISAM;

CREATE TABLE forwardings (
source varchar(80) NOT NULL,
destination TEXT NOT NULL,
PRIMARY KEY (source) )
TYPE=MyISAM;

CREATE TABLE users (
email varchar(80) NOT NULL,
password varchar(20) NOT NULL,
PRIMARY KEY (email)
) TYPE=MyISAM;

CREATE TABLE transport (
domain varchar(128) NOT NULL default '',
transport varchar(128) NOT NULL default '',
UNIQUE KEY domain (domain)
) TYPE=MyISAM;

quit;

A questo punto avremo le seguenti tabelle:

domains : indica quali domini gestisce il nostro server di posta

forwardings : gestisce la lista dei forwarding di una determinata casella di posta verso un altra

users : le effettive caselle di posta, con tanto di nome utente e password

transport: serve a passare la gestione della singola email a un altro server, sintassi smtp:[1.2.3.4] le parentesi quadre indicano che non si deve fare nessuna query al dns, in questo caso va indicato l'indirizzo ip corretto.

Ora tramite phpmyadmin accessibile sul vostro webserver http://ip-del-server/phpmyadmin potrete gestire tutto quel che riguarda gli account di posta.

4- Configurazione Postfix

Editiamo

vi /etc/mysql/my.cnf

e configuriamo la voce

[...]
bind-address            = 127.0.0.1
[...]

se abbiamo modificato il file, eventualmente lanciamo il comando /etc/init.d/mysql restart

Creiamo il file
vi /etc/postfix/mysql-virtual_domains.cf

e inseriamo

user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT domain AS virtual FROM domains WHERE domain='%s'
hosts = 127.0.0.1

creiamo il file

vi /etc/postfix/mysql-virtual_forwardings.cf

user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT destination FROM forwardings WHERE source='%s'
hosts = 127.0.0.1

creiamo il file

vi /etc/postfix/mysql-virtual_mailboxes.cf

user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/') FROM users WHERE email='%s'
hosts = 127.0.0.1

creiamo il file

vi /etc/postfix/mysql-virtual_email2email.cf

user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT email FROM users WHERE email='%s'
hosts = 127.0.0.1

creiamo il file

nano /etc/postfix/mysql-virtual_transports.cf

user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT transport FROM transport WHERE domain='%s'
hosts = 127.0.0.1

Modifichiamo ora i permessi ai file

chmod o= /etc/postfix/mysql-virtual_*.cf
chgrp postfix /etc/postfix/mysql-virtual_*.cf

Creiamo ora il gruppo e l’utente vmail

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

Eseguiamo ora i comandi di configurazione di postfix, facendo cura di modificare il server server1.example.com con il nostro FQDN.

postconf -e 'myhostname = server1.example.com'
postconf -e 'mydestination = server1.example.com, localhost, localhost.localdomain'
postconf -e 'mynetworks = 127.0.0.0/8'
postconf -e 'virtual_alias_domains ='
postconf -e 'virtual_alias_maps = proxy:mysql:/etc/postfix/mysql-virtual_forwardings.cf, mysql:/etc/postfix/mysql-virtual_email2email.cf'
postconf -e 'virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql-virtual_domains.cf'
postconf -e 'virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql-virtual_mailboxes.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_sasl_authenticated_header = yes'
postconf -e 'smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination'
postconf -e 'smtpd_use_tls = yes'
postconf -e 'smtpd_tls_cert_file = /etc/postfix/smtpd.cert'
postconf -e 'smtpd_tls_key_file = /etc/postfix/smtpd.key'
postconf -e 'transport_maps = proxy:mysql:/etc/postfix/mysql-virtual_transports.cf'
#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'

Creiamo ora il certificato ssl

cd /etc/postfix
openssl req -new -outform PEM -out smtpd.cert -newkey rsa:2048 -nodes -keyout smtpd.key -keyform PEM -days 365 -x509

e completiamo le richieste del certificato come a seguire

Country Name (2 letter code) [AU]: <-- Enter your Country Name (e.g., "DE").
State or Province Name (full name) [Some-State]: <-- Enter your State or Province Name.
Locality Name (eg, city) []: <-- Enter your City.
Organization Name (eg, company) [Internet Widgits Pty Ltd]: <-- Enter your Organization Name (e.g., the name of your company).
Organizational Unit Name (eg, section) []: <-- Enter your Organizational Unit Name (e.g. "IT Department").
Common Name (eg, YOUR name) []: <-- Enter the Fully Qualified Domain Name of the system (e.g. "server1.example.com").
Email Address []: <-- Enter your Email Address.

e modifichiamo i permessi come segue

chmod o= /etc/postfix/smtpd.key

5. Configure Saslauthd

Creiamo la cartella per saslauthd

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

Editiamo ora il file /etc/default/saslauthd settando START a yes e cambiando OPTIONS=”-c -m /var/run/saslauthd” a OPTIONS=”-c -m /var/spool/postfix/var/run/saslauthd -r”:

vi /etc/default/saslauthd

il risultato sarà

#
# Settings for saslauthd daemon
# Please read /usr/share/doc/sasl2-bin/README.Debian for details.
#
# Should saslauthd run automatically on startup? (default: no)
START=yes
# Description of this saslauthd instance. Recommended.
# (suggestion: SASL Authentication Daemon)
DESC="SASL Authentication Daemon"
# Short name of this saslauthd instance. Strongly recommended.
# (suggestion: saslauthd)
NAME="saslauthd"
# Which authentication mechanisms should saslauthd use? (default: pam)
#
# Available options in this Debian package:
# getpwent  -- use the getpwent() library function
# kerberos5 -- use Kerberos 5
# pam       -- use PAM
# rimap     -- use a remote IMAP server
# shadow    -- use the local shadow password file
# sasldb    -- use the local sasldb database file
# ldap      -- use LDAP (configuration is in /etc/saslauthd.conf)
#
# Only one option may be used at a time. See the saslauthd man page
# for more information.
#
# Example: MECHANISMS="pam"
MECHANISMS="pam"
# Additional options for this mechanism. (default: none)
# See the saslauthd man page for information about mech-specific options.
MECH_OPTIONS=""
# How many saslauthd processes should we run? (default: 5)
# A value of 0 will fork a new process for each connection.
THREADS=5
# Other options (default: -c -m /var/run/saslauthd)
# Note: You MUST specify the -m option or saslauthd won't run!
#
# See /usr/share/doc/sasl2-bin/README.Debian for Debian-specific information.
# See the saslauthd man page for general information about these options.
#
# Example for postfix users: "-c -m /var/spool/postfix/var/run/saslauthd"
#OPTIONS="-c -m /var/run/saslauthd"
OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd -r"

Editiamo il file

vi /etc/pam.d/smtp

inseriamo

auth    required   pam_mysql.so user=mail_admin passwd=mail_admin_password host=127.0.0.1 db=mail table=users usercolumn=email passwdcolumn=password crypt=1
account sufficient pam_mysql.so user=mail_admin passwd=mail_admin_password host=127.0.0.1 db=mail table=users usercolumn=email passwdcolumn=password crypt=1

Creiamo il file

vi /etc/postfix/sasl/smtpd.conf

e inseriamo

pwcheck_method: saslauthd
mech_list: plain login
allow_plaintext: true
auxprop_plugin: mysql
sql_hostnames: 127.0.0.1
sql_user: mail_admin
sql_passwd: sysop
sql_database: mail
sql_select: select password from users where email = '%u'

aggiungiamo l’utente postfix al gruppo sals

[email protected]: adduser postfix sasl

e riavviamo postfix e sasl

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

Configuriamo ora courier

vi /etc/courier/authdaemonrc

e modifichiamo

[...]
authmodulelist="authmysql"
[...]

Creiamo un backup di /etc/courier/authmysqlrc e svuotiamo il vecchio file

cp /etc/courier/authmysqlrc /etc/courier/authmysqlrc_orig
cat /dev/null > /etc/courier/authmysqlrc

Editiamo ora il file

vi /etc/courier/authmysqlrc

e inseriamo

MYSQL_SERVER localhost
MYSQL_USERNAME mail_admin
MYSQL_PASSWORD mail_admin_password
MYSQL_PORT 0
MYSQL_DATABASE mail
MYSQL_USER_TABLE users
MYSQL_CRYPT_PWFIELD password
#MYSQL_CLEAR_PWFIELD password
MYSQL_UID_FIELD 5000
MYSQL_GID_FIELD 5000
MYSQL_LOGIN_FIELD email
MYSQL_HOME_FIELD "/home/vmail"
MYSQL_MAILDIR_FIELD CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/')
#MYSQL_NAME_FIELD

e riavviamo courier

/etc/init.d/courier-authdaemon restart
/etc/init.d/courier-imap restart
/etc/init.d/courier-imap-ssl restart
/etc/init.d/courier-pop restart
/etc/init.d/courier-pop-ssl restart

Controlliamo ora se il nostro server pop3 funziona

telnet localhost pop3

scrivete QUIT e dovrebbe darvi qualcosa di simile a

[email protected]: telnet localhost 110
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
+OK Hello there.
quit
+OK Better luck next time.
Connection closed by foreign host.
[email protected]:

7. Modifichiamo /etc/aliases

Modifichiamo /etc/aliases con qualcosa simile a

vi /etc/aliases

[...]
postmaster: root
root: [email protected]
[...]

dopo di che ad ogni modifica di /etc/aliases lanciamo

[email protected]: newaliases

e riavviamo postfix

[email protected]: /etc/init.d/postfix restart

8. Installiamo Amavisd-new, Spamassassin, Clamv

Lanciamo il comando:

apt-get install amavisd-new spamassassin clamav clamav-daemon zoo unzip bzip2 unzoo libnet-ph-perl libnet-snpp-perl libnet-telnet-perl nomarch lzop pax

Abilitamo Clamav e Spamassassin editando il file /etc/amavis/conf.d/15-content_filter_mode , decommentando le linee @bypass_virus_checks_maps e @bypass_spam_checks_maps

vi /etc/amavis/conf.d/15-content_filter_mode

Che diventerà una cosa simile a:

@bypass_virus_checks_maps = (
   \%bypass_virus_checks, \@bypass_virus_checks_acl, \$bypass_virus_checks_re);
#
# Default SPAM checking mode
# Uncomment the two lines below to enable it back
#
@bypass_spam_checks_maps = (
   \%bypass_spam_checks, \@bypass_spam_checks_acl, \$bypass_spam_checks_re);
1;  # ensure a defined return

Controlliamo inoltre i settaggi dell’antispam e dell’antivirus nel file /etc/amavis/conf.d/20-debian_defaults , dovrebbero andare bene per tutti e non necessitano di modifiche particolari.

Editiamo il file /etc/amavis/conf.d/50-user

vi /etc/amavis/conf.d/50-user

ed aggiungiamo

$pax='pax';

avendo come risultato qualcosa di simile a:

use strict;
#
# Place your configuration directives here.  They will override those in
# earlier files.
#
# See /usr/share/doc/amavisd-new/ for documentation and examples of
# the directives you can use in this file
#
$pax='pax';
#------------ Do not modify anything below this line -------------
1;  # ensure a defined return

Eseguiamo questi comandi per aggiungere clamav al gruppo di amavis e riavviare amavisd-new e clamav:

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

Configuriamo ora postfix affinchè inoltri le email in arrivo all’antivirus amavisd-new

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

Modifichiamo il file /etc/postfix/master.cf

vi /etc/postfix/master.cf

e aggiungiamo alla fine

[...]
amavis unix - - - - 2 smtp
        -o smtp_data_done_timeout=1200
        -o smtp_send_xforward_command=yes
127.0.0.1:10025 inet n - - - - smtpd
        -o content_filter=
        -o local_recipient_maps=
        -o relay_recipient_maps=
        -o smtpd_restriction_classes=
        -o smtpd_client_restrictions=
        -o smtpd_helo_restrictions=
        -o smtpd_sender_restrictions=
        -o smtpd_recipient_restrictions=permit_mynetworks,reject
        -o mynetworks=127.0.0.0/8
        -o strict_rfc821_envelopes=yes
        -o receive_override_options=no_unknown_recipient_checks,no_header_body_checks
        -o smtpd_bind_address=127.0.0.1

e riavviamo postfix

/etc/init.d/postfix restart

ora eseguendo

netstat -tap

dovreste vedere Postfix (smtp 25) e 10025, e amavisd-new sulla 10024

[email protected]:/etc/postfix# netstat -tap
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 localhost.localdo:10024 *:*                     LISTEN      15645/amavisd (mast
tcp        0      0 localhost.localdo:10025 *:*                     LISTEN      16677/master
tcp        0      0 localhost.localdo:mysql *:*                     LISTEN      6177/mysqld
tcp        0      0 *:www                   *:*                     LISTEN      5367/apache2
tcp        0      0 *:smtp                  *:*                     LISTEN      16677/master
tcp6       0      0 [::]:imaps              [::]:*                  LISTEN      14020/couriertcpd
tcp6       0      0 [::]:pop3s              [::]:*                  LISTEN      14088/couriertcpd
tcp6       0      0 [::]:pop3               [::]:*                  LISTEN      14051/couriertcpd
tcp6       0      0 [::]:imap2              [::]:*                  LISTEN      13983/couriertcpd
tcp6       0      0 [::]:ssh                [::]:*                  LISTEN      4006/sshd
tcp6       0     52 server1.example.com:ssh 192.168.0.210%8191:3340 ESTABLISHED 4059/0
[email protected]:/etc/postfix#

9. Install Razor, Pyzor And Configure SpamAssassin

Installiamo ora Razor, Pyzor che utilizzano una rete di filtri spam collaborativa sostenuta da varie community.

Eseguiamo il comando:

apt-get install razor pyzor

A questo punto editiamo

vi /etc/spamassassin/local.cf

[...]
#pyzor
use_pyzor 1
pyzor_path /usr/bin/pyzor
#razor
use_razor2 1
razor_config /etc/razor/razor-agent.conf
#bayes
use_bayes 1
use_bayes_rules 1
bayes_auto_learn 1

Possiamo configurare la nostra configurazione di spamassassin con il comando:

spamassassin --lint

e non dovrebbe darci alcun errore sul risultato.

Riavviamo ora amavis:

/etc/init.d/amavis restart

Aggiorniamo le nuove regole di Spamassassin con

sa-update --no-gpg

Creiamo un comando crontab per aggiornare le regole ogni tot tempo

crontab -e

e inseriamo

23 4 */2 * * /usr/bin/sa-update --no-gpg &> /dev/null

10. Test postfix

Controliamo ora se tutto funziona, controlliamo ora se postfix è pronto per SMTP-AUTH e TLS
telnet localhost 25

dopo la connessione diamo il comando

ehlo localhost

e dovremmo trovare la stringa

250-STARTTLS

e
50-AUTH LOGIN PLAIN

Qualcosa tipo:

[email protected]:/usr/local/sbin# telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.localdomain.
Escape character is '^]'.
220 server1.example.com ESMTP Postfix (Ubuntu)
ehlo localhost
250-server1.example.com
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
quit
221 2.0.0 Bye
Connection closed by foreign host.
[email protected]:/usr/local/sbin#

Non ci resta che popolare il database con i dati che ci interessano, ometto questa parte in quanto la ritengo particolarmente semplice ed intuitiva,

Mi soffermo su due aspetti, il primo riguarda le PASSWORD. Quando inserite un nuovo utente mi raccomando di selezionare il tipo di campo per le password come ENCRYPT, altrimenti non vi funzionerà l’autenticazione.

Date un occhio alle tabelle del link http://www.howtoforge.com/virtual-users-domains-postfix-courier-mysql-squirrelmail-ubuntu8.04-p4 in fondo alla pagina.

11. Inviare un messaggio di benvenuto per creare la Maildir

Una volta creato un account email è necessario inviare un’email affinchè venga creata immediatamente la directory dove verranno salvate le email. Se questo non viene fatto, quando qualcuno proverà a collegarsi via pop3 gli verrà dato un messaggio di errore. Provvediamo quandi a installare mailx tramite:

apt-get install mailx

per inviare un’email ci basta dare il comando

mailx [email protected]

e compilare i seguenti campi

mailx [email protected]
Subject: Welcome <-- ENTER
Welcome! Have fun with your new mail account. <-- ENTER
<-- CTRL+D
Cc: <-- ENTER

A questo punto potete installare squirrelmail e company per gestire la posta come preferite.

Saluti
Matteo


9 risposte a “Virtual Users And Domains With Postfix, Courier, MySQL (Ubuntu 8.04 LTS 64bit)”

  1. Grazie mille! Non è il massimo ma fa quel che serve 😉

    A breve spero di poter scrivere una guida analoga con l’utilizzo di dovecot, ma ho troppo poco tempo :\

  2. Virtual Users And Domains With Postfix, Courier, MySQL (Ubuntu 8.04 LTS 64bit) » Temporini Matteo…

    Questa guida vuole essere una quick reference per installare un server di posta con antispam e gestione relativamente semplice di utenti e domini, tramite ubuntu 8.04 TLS 64bit….

  3. hey I like this article. I observed it from doing a google look for. Ive been looking for this sort of factor for a although. This info will arrive in handy to me. I’ll verify back again quickly to search the rest of one’s web site. thank you

  4. Salve,
    vorrei chiedere un’informazione.
    Utilizzando i virtual domain con virtual_mailbox_domains, mydomain come deve essere settato?
    Grazie

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

Per postare il commento, risolvi il quesito sottostante * Time limit is exhausted. Please reload CAPTCHA.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.