a mailserver on ubuntu 12

19
Ex Ratione Consulting Blog Archives Feed A Mailserver on Ubuntu 12.04: Postfix, Dovecot, MySQL By Reason May 15, 2012 Permalink This long post contains a recipe for building a reasonably secure Ubuntu 12.04 mailserver in Amazon Web Services, using Postfix 2.9.1, Dovecot 2.0.19, and MySQL 5.5.22, with anti-spam packages in the form of amavisd-new 2.6.5, Clam AntiVirus 0.97.3, SpamAssassin 3.3.2, and Postgrey 1.3.4. Local users are virtual rather than being system users. Administration of users and domains is achieved through the Postfix Admin 2.3.5 web interface. Webmail is provided by Horde Groupware Webmail Edition 4.0.7. A number of people have assisted in correcting errors and suggesting additional sections since this recipe was first posted. If you find a blocking issue, let me know. 1) Introduction Building a Linux mailserver from scratch to your own liking is a painful process unless you happen to be one of the few folk who do that day in and day out - there's no way around that fact. A mailserver generally consists of a range of different packages that separately handle SMTP, POP/IMAP, local storage of mail, and spam-related tasks: they must all talk to one another correctly, all have small novels in place of configuration documentation, and there is no one obvious best practice for how users are managed, how to store user data, or how to glue the various different components together. There are any number of different viable setups for moving mail between Postfix and Dovecot, for example. Further, the whole assembly tends to be unforgiving on matters such as permissions, choice of users for specific processes, and tiny errors in esoteric configuration files. Unless you know what you are doing the end result will likely be either insecure, non-functional, or otherwise misconfigured. There are a number of fairly up to date recipes for creating mailservers out there; one of the better ones is an Ubuntu recipe by Ivar Abrahamsen , which gives you Postfix for SMTP, Courier for IMAP/POP, MySQL to store account information, virtual user mail directories, and an array of anti-spam tools that are highly effective when working in concert. It's a good set of documents, as the author places an emphasis on producing a secure mailserver as the end result. There are also a great many partial recipes and out of date guides that are frankly more of a hindrance than a help - especially when it comes to Dovecot, which has changed greatly between its 1.* and 2.* versions. The configuration is completely different, and so are many of the administrative and tool binaries. I've used Abrahamsen's guide as a basis for my mail servers running on AWS for a few years now. Upgrade time always rolls around eventually, however, and this time I decided to move to a new setup to mark the release of Ubuntu 12.04: swap out Courier for Dovecot and try out a web front-end for managing mail users. Finding a good all-in-one-place guide was a challenge, however - hence this document. 2) Outlining the Goal The end result of following this guide will be a secure mail server for your domain equipped with the following software packages: Postfix: sends and receives mail via the SMTP protocol. It will only relay mail on to other mailservers if the mail is sent by an authenticated user, but anyone can send mail to this server for local delivery. Dovecot: a POP and IMAP server that manages local mail directories and allows users to log in and download their mail. It also handles user authentication. Postgrey: greylists incoming mail, requiring unfamiliar deliverers to wait for a while and then resend. This is one of the better tools for cutting down on spam. amavisd-new: a manager for organizing various antivirus and spam checking content filters. Clam AntiVirus: a virus detection suite. SpamAssassin: for sniffing out spam in emails. Postfix Admin: a web front end for administering mail users and domains. Horde Groupware Webmail Edition: a webmail interface for users. The server will accept plain text or encrypted SMTP and POP/IMAP connections at the standard ports, but will not allow user authentication without encryption. It will pass through a minimal set of mail headers for mail sent by local users, removing identifying information from the original sender's mail software. 3) Fire up an Ubuntu 12.04 AWS Instance Start up an Elastic Block Store (EBS) server instance - at the time of writing, Ubuntu 12.04 is one of the options right there in the quick start menu for launching a new instance. Mail servers don't generally have to be all that big if you aren't in the business of email; a micro instance has served me just fine for a fairly well trafficked web site with a mailing list of thousands, for example. That said, the server produced by following this guide runs at close to 80% memory utilization for a micro instance when operating unloaded - a sudden blizzard of unexpected web traffic would probably cause issues. So adjust your expectations accordingly. 4) Some Basic Configuration The baseline Ubuntu instance is lacking in near every package you might need, so you are building from fairly close to scratch. You'll log in as the "ubuntu" user and then switch to root; most of what you need to do requires root access: sudo su You must set up an Elastic IP to give your server a permanent IP address. By default, an AWS instance will have its own strange-looking hostname, so changing to the domain the server will have is the first item on the list: hostname mail.example.com Now set the contents of /etc/hostname to be the hostname: mail.example.com And add your hostname to the first line of /etc/hosts: 127.0.0.1 mail.example.com localhost

Upload: minh-nguyen

Post on 16-Apr-2015

122 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: A Mailserver on Ubuntu 12

Ex

Ratione

Consulting Blog Archives Feed

A Mailserver on Ubuntu 12.04: Postfix, Dovecot, MySQL

By Reason May 15, 2012 Permalink

This long post contains a recipe for building a reasonably secure Ubuntu 12.04 mailserver in Amazon Web Services, using Postfix 2.9.1, Dovecot 2.0.19, and MySQL 5.5.22, with

anti-spam packages in the form of amavisd-new 2.6.5, Clam AntiVirus 0.97.3, SpamAssassin 3.3.2, and Postgrey 1.3.4. Local users are virtual rather than being system users.Administration of users and domains is achieved through the Postfix Admin 2.3.5 web interface. Webmail is provided by Horde Groupware Webmail Edition 4.0.7.

A number of people have assisted in correcting errors and suggesting additional sections since this recipe was first posted. If you find a blocking issue, let me know.

1) Introduction

Building a Linux mailserver from scratch to your own liking is a painful process unless you happen to be one of the few folk who do that day in and day out - there's no way around

that fact. A mailserver generally consists of a range of different packages that separately handle SMTP, POP/IMAP, local storage of mail, and spam-related tasks: they must all talk

to one another correctly, all have small novels in place of configuration documentation, and there is no one obvious best practice for how users are managed, how to store user data,

or how to glue the various different components together. There are any number of different viable setups for moving mail between Postfix and Dovecot, for example. Further, thewhole assembly tends to be unforgiving on matters such as permissions, choice of users for specific processes, and tiny errors in esoteric configuration files. Unless you know what

you are doing the end result will likely be either insecure, non-functional, or otherwise misconfigured.

There are a number of fairly up to date recipes for creating mailservers out there; one of the better ones is an Ubuntu recipe by Ivar Abrahamsen, which gives you Postfix for SMTP,

Courier for IMAP/POP, MySQL to store account information, virtual user mail directories, and an array of anti-spam tools that are highly effective when working in concert. It's a

good set of documents, as the author places an emphasis on producing a secure mailserver as the end result.

There are also a great many partial recipes and out of date guides that are frankly more of a hindrance than a help - especially when it comes to Dovecot, which has changed greatlybetween its 1.* and 2.* versions. The configuration is completely different, and so are many of the administrative and tool binaries.

I've used Abrahamsen's guide as a basis for my mail servers running on AWS for a few years now. Upgrade time always rolls around eventually, however, and this time I decided to

move to a new setup to mark the release of Ubuntu 12.04: swap out Courier for Dovecot and try out a web front-end for managing mail users. Finding a good all-in-one-place guide

was a challenge, however - hence this document.

2) Outlining the Goal

The end result of following this guide will be a secure mail server for your domain equipped with the following software packages:

Postfix: sends and receives mail via the SMTP protocol. It will only relay mail on to other mailservers if the mail is sent by an authenticated user, but anyone can send mail tothis server for local delivery.

Dovecot: a POP and IMAP server that manages local mail directories and allows users to log in and download their mail. It also handles user authentication.

Postgrey: greylists incoming mail, requiring unfamiliar deliverers to wait for a while and then resend. This is one of the better tools for cutting down on spam.

amavisd-new: a manager for organizing various antivirus and spam checking content filters.

Clam AntiVirus: a virus detection suite.

SpamAssassin: for sniffing out spam in emails.Postfix Admin: a web front end for administering mail users and domains.

Horde Groupware Webmail Edition: a webmail interface for users.

The server will accept plain text or encrypted SMTP and POP/IMAP connections at the standard ports, but will not allow user authentication without encryption. It will pass through

a minimal set of mail headers for mail sent by local users, removing identifying information from the original sender's mail software.

3) Fire up an Ubuntu 12.04 AWS Instance

Start up an Elastic Block Store (EBS) server instance - at the time of writing, Ubuntu 12.04 is one of the options right there in the quick start menu for launching a new instance. Mail

servers don't generally have to be all that big if you aren't in the business of email; a micro instance has served me just fine for a fairly well trafficked web site with a mailing list of

thousands, for example. That said, the server produced by following this guide runs at close to 80% memory utilization for a micro instance when operating unloaded - a sudden

blizzard of unexpected web traffic would probably cause issues. So adjust your expectations accordingly.

4) Some Basic Configuration

The baseline Ubuntu instance is lacking in near every package you might need, so you are building from fairly close to scratch. You'll log in as the "ubuntu" user and then switch to

root; most of what you need to do requires root access:

sudo su

You must set up an Elastic IP to give your server a permanent IP address. By default, an AWS instance will have its own strange-looking hostname, so changing to the domain the

server will have is the first item on the list:

hostname mail.example.com

Now set the contents of /etc/hostname to be the hostname:

mail.example.com

And add your hostname to the first line of /etc/hosts:

127.0.0.1 mail.example.com localhost

Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Callout
mail.akashi.com
Page 2: A Mailserver on Ubuntu 12

# Usually some IPv6 configuration below the first line, but leave that alone....

Now you'll want to regenerate the server's default self-signed SSL certificate so that it matches the domain name. You may have purchased an SSL certificate for your mail server,

but it is perfectly possible and completely secure to run a mail server using a self-signed certificate. The only consequences will be warning screens when using webmail hosted on the

server and warnings from Microsoft Outlook when connecting via POP, IMAP, or SMTP.

apt-get install ssl-certmake-ssl-cert generate-default-snakeoil --force-overwrite

5) Now Build a LAMP Web Server

You will need the mailserver to also be a LAMP (Linux, Apache, MySQL, PHP) web server, since you will want webmail and a web-based administrative interface for managing

users. So turning your Ubuntu instance into a web server is a good place to start. There is a shortcut to install the basic LAMP packages, so start by updating the repository data and

installing the packages. Notice the "̂ " at the end of the command there - it is necessary:

apt-get updateapt-get upgradeapt-get install lamp-server̂

During this install you will be asked to choose a root password for MySQL. Choose something sensible, and then move on to adding an array of basic additional packages for PHP -such as APC bytecode caching, memcache support, cURL, an XML parser, and GD image processing. Add more to suite your own taste and the applications you want to support

on this server.

apt-get install php-apc php5-memcache php5-curl php5-gd php-xml-parser

6) Configure PHP

The default configuration for PHP and the additional packages mentioned above is sufficient for most casual usage. So unless you have something complicated or high-powered in

mind, you should probably only change the expose_php setting in /etc/php5/apache2/php.ini. Set it to "Off":

; Decides whether PHP may expose the fact that it is installed on the server; (e.g. by adding its signature to the Web server header). It is no security; threat in any way, but it makes it possible to determine whether you use PHP; on your server or not.; http://php.net/expose-phpexpose_php = Off

7) Configure Apache

The expected end result for Apache is that it will serve a single site with a couple of running web applications: webmail and Postfix Admin hidden away in a subdirectory. All traffic

will be directed to HTTPS - there is no good reason to allow non-secure access to any of what will be on the web server.

Firstly configure the following lines in /etc/apache2/conf.d/security to minimize the information that Apache gives out in its response headers:

## ServerTokens# This directive configures what you return as the Server HTTP response# Header. The default is 'Full' which sends information about the OS-Type# and compiled in modules.# Set to one of: Full | OS | Minimal | Minor | Major | Prod# where Full conveys the most information, and Prod the least.#ServerTokens Prod

## Optionally add a line containing the server version and virtual host# name to server-generated pages (internal error documents, FTP directory# listings, mod_status and mod_info output etc., but not CGI generated# documents or custom error documents).# Set to "EMail" to also include a mailto: link to the ServerAdmin.# Set to one of: On | Off | EMail#ServerSignature Off

Make sure that mod_rewrite, mod_ssl, and the default SSL virtual host is enabled - you'll need these line items to be able to force visitors to use HTTPS.

a2enmod rewrite ssla2ensite default-ssl

The default site configuration in /etc/apache2/sites-available/default can be edited to look something like this for the sake of simplicity:

<VirtualHost *:80> ServerAdmin webmaster@localhost

DocumentRoot /var/www <Directory "/"> Options FollowSymLinks AllowOverride All </Directory>

ErrorLog ${APACHE_LOG_DIR}/error.log

# Possible values include: debug, info, notice, warn, error, crit, # alert, emerg. LogLevel warn

Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Callout
cai dat LAMP web server for "web mail" + "web admin users"
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Callout
them cac goi nay support server
Dell
Highlight
Dell
Highlight
Dell
Callout
cau hinh mac dinh cho PHP va them cac goi tren de hoat dong tot nhat
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Textbox
tai sinh chung thuc cho server mac dinh, de no noi voi domain name
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Callout
cau hinh lai apache -> chay https
Dell
Highlight
Dell
Highlight
Dell
Textbox
enable mode_rewrite && mode_ssl
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Textbox
no trong kha phuc tap, chi can hieu don gian nhu sau:
Dell
Highlight
Page 3: A Mailserver on Ubuntu 12

CustomLog ${APACHE_LOG_DIR}/access.log combined</VirtualHost>

But of course your taste and needs may vary. Keeping the same simple approach, the upper portion of the SSL configuration in /etc/apache2/sites-available/default-ssl can be setup as follows:

<IfModule mod_ssl.c> <VirtualHost _default_:443> ServerAdmin webmaster@localhost

DocumentRoot /var/www <Directory "/"> Options FollowSymLinks AllowOverride All </Directory>

ErrorLog ${APACHE_LOG_DIR}/error.log

# Possible values include: debug, info, notice, warn, error, crit, # alert, emerg. LogLevel warn

CustomLog ${APACHE_LOG_DIR}/ssl_access.log combined

# SSL Engine Switch: # Enable/Disable SSL for this virtual host. SSLEngine on #

# ... more default SSL configuration ...

# You will probably need to change this next Directory directive as well # in order to match the earlier one. <Directory "/"> SSLOptions +StdEnvVars </Directory>

# ... yet more default SSL configuration ...

If you are using a purchased rather than self-signed SSL certificate, and you probably have a CA certificate bundle from the issuer, then you'll want to further change these lines in

/etc/apache2/sites-enabled/default-ssl:

# A self-signed (snakeoil) certificate can be created by installing # the ssl-cert package. See # /usr/share/doc/apache2.2-common/README.Debian.gz for more info. # If both key and certificate are stored in the same file, only the # SSLCertificateFile directive is needed. SSLCertificateFile /path/to/my/cert.crt SSLCertificateKeyFile /path/to/my/key.key

# Server Certificate Chain: # Point SSLCertificateChainFile at a file containing the # concatenation of PEM encoded CA certificates which form the # certificate chain for the server certificate. Alternatively # the referenced file can be the same as SSLCertificateFile # when the CA certificates are directly appended to the server # certificate for convinience. SSLCertificateChainFile /path/to/my/ca-bundle.crt

To push visitors to HTTPS, put something similar to the following snippet into /var/www/.htaccess:

RewriteEngine OnRewriteCond %{SERVER_PORT} 80RewriteRule ̂(.*) https://mail.example.com/$1 [L]

8) Install and Configure Memcached

You will need to install Memcached to support the webmail applications intended to run on this server:

apt-get install memcached

The default configuration file at /etc/memcached.conf is good enough for a small server: it locks down access to localhost and provides generally sensible configuration parametervalues. If you are building a larger machine for heavy usage, you will probably want to bump the memory allocation to be higher than the default of 64M:

# Start with a cap of 64 megs of memory. It's reasonable, and the daemon default# Note that the daemon will grow to this size, but does not start out holding this much# memory-m 64

9) Install the Mailserver Packages

Now we're ready to start in on the harder stuff. As for the LAMP server, there is a shortcut for installing the basic packages for a mail server. Again, note the "̂ " at the end of thecommand:

apt-get install mail-server̂

Dell
Highlight
Dell
Textbox
thay doi
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Textbox
de moi truy cap --> HTTPS --> edit lai nhu sau
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Callout
file enabled --> chua site da kich hoat
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Callout
mac dinh thi no da tot roi, neu cho so luong user lon -> sua 64M
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Callout
lenh cai cac goi mail server
Dell
Callout
site co san, nhung chua kich hoat !
Page 4: A Mailserver on Ubuntu 12

When Postfix installs, you will be asked to choose a general type of mail configuration - select "Internet site". You will be asked for the system mail name, which is the hostname ofyour mailserver - e.g. mail.example.com. What this gives you is pretty much just bare bones, aimed at a mailserver that manages its users as straightforward Unix users, and which

doesn't use a SQL database to store data. So we need the rest of the cast - such as MySQL support for Postfix and Dovecot, and the coterie of spam-mashing packages. You might

also have to install IMAP support for Dovecot, as it may or may not be included in the mail-server packages:

apt-get install postfix-mysql dovecot-mysql dovecot-imapd postgrey apt-get install amavis clamav clamav-daemon spamassassinapt-get install php5-imap

The php5-imap package actually supports POP3 as well as the IMAP protocol, and will be needed by Postfix Admin and many of the possible options for PHP webmail

applications. Restart Apache to have that running and ready:

service apache2 restart

Next you'll want some optional packages that extend the abilities of the spam and virus detection packages, such as by allowing greater inspection of attached files:

apt-get install libnet-dns-perl pyzor razorapt-get install arj bzip2 cabextract cpio file gzip nomarch pax unzip zip

You probably also want a package for dealing with RAR-format archives - but I've found unrar-free to be somewhat buggy and unstable, while unrar is not free. So you may just

choose to skip that and shrug.

10) Create a Mail Database and User in MySQL

Log in to MySQL as the root user, entering the password you set earlier:

mysql -uroot -p

Now set up a database and user for the mail software. This database will store information on user accounts and mail domains, using schema set up by the Postfix Admin package:

create database mail;grant all on mail.* to 'mail'@'localhost' identified by 'mailpassword';

11) Install Postfix Admin and the MySQL Schema

Postfix Admin is installed as follows. To start things off, download the package from Sourceforge, unpack it, and move it into a subdirectory of your webroot. You will probably alsoneed to change ownership to the www-data user:

wget http://downloads.sourceforge.net/project/postfixadmin/postfixadmin/postfixadmin-2.3.5/postfixadmin-2.3.5.tar.gzgunzip postfixadmin-2.3.5.tar.gztar -xf postfixadmin-2.3.5.tarmv postfixadmin-2.3.5 /var/www/postfixadminchown -R www-data:www-data /var/www/postfixadmin

Next is an interesting sort of a two-phase setup process. Firstly alter the following lines in /var/www/postfixadmin/config.inc.php:

/***************************************************************** * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! * You have to set $CONF['configured'] = true; before the * application will run! * Doing this implies you have changed this file as required. * i.e. configuring database etc; specifying setup.php password etc. */$CONF['configured'] = true;

// Postfix Admin Path// Set the location of your Postfix Admin installation here.// YOU MUST ENTER THE COMPLETE URL e.g. http://domain.tld/postfixadmin$CONF['postfix_admin_url'] = 'https://mail.example.com/postfixadmin';

// Database Config// mysql = MySQL 3.23 and 4.0, 4.1 or 5// mysqli = MySQL 4.1+// pgsql = PostgreSQL$CONF['database_type'] = 'mysql';$CONF['database_host'] = 'localhost';$CONF['database_user'] = 'mail';$CONF['database_password'] = 'mailpassword';$CONF['database_name'] = 'mail';

// Site Admin// Define the Site Admins email address below.// This will be used to send emails from to create mailboxes.$CONF['admin_email'] = '[email protected]';

// Mail Server// Hostname (FQDN) of your mail server.// This is used to send email to Postfix in order to create mailboxes.//// Set this to localhost for now, but change it later.$CONF['smtp_server'] = 'localhost';$CONF['smtp_port'] = '25';

// Encrypt// In what way do you want the passwords to be crypted?// md5crypt = internal postfix admin md5// md5 = md5 sum of the password// system = whatever you have set as your PHP system default

Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Callout
cac goi can install them !
Dell
Callout
amavis <-- thay = amavisd-new
Dell
Textbox
apt-cache search ***
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Callout
sua : http://mail.akashi.com/postfixadmin
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Highlight
Dell
Callout
Page 5: A Mailserver on Ubuntu 12

// cleartext = clear text passwords (ouch!)// mysql_encrypt = useful for PAM integration// authlib = support for courier-authlib style passwords// dovecot:CRYPT-METHOD = use dovecotpw -s 'CRYPT-METHOD'. Example: dovecot:CRAM-MD5$CONF['encrypt'] = 'md5crypt';

// Mailboxes// If you want to store the mailboxes per domain set this to 'YES'.// Examples:// YES: /usr/local/virtual/domain.tld/[email protected]// NO: /usr/local/virtual/[email protected]$CONF['domain_path'] = 'NO';// If you don't want to have the domain in your mailbox set this to 'NO'.// Examples:// YES: /usr/local/virtual/domain.tld/[email protected]// NO: /usr/local/virtual/domain.tld/username// Note: If $CONF['domain_path'] is set to NO, this setting will be forced to YES.$CONF['domain_in_mailbox'] = 'YES';

Next open up a web browser and visit your mail server at:

https://mail.example.com/postfixadmin/setup.php

Follow the instructions on that page to choose a setup password, and generate a hash of that password. Add that hash to the configuration file and save it:

// In order to setup Postfixadmin, you MUST specify a hashed password here.// To create the hash, visit setup.php in a browser and type a password into the field,// on submission it will be echoed out to you as a hashed value.$CONF['setup_password'] = '...a long hash string...';

Then return to the setup page. You can now use the password you selected in order to create an initial administrator account. Postfix Admin will also automatically create its database

schema at this point.

It is probably wise to restrict access to /var/www/postfixadmin/setup.php after having used it. Create a file /var/www/postfixadmin/.htaccess and put the following instructionsinto it:

<Files "setup.php">deny from all</Files>

Note that there is an annoying little issue involving the incorrect display of non-ASCII characters in Postfix Admin 2.3.5. It's easy to patch, however, so you may as well do that while

you are here. Make the following small changes:

/var/www/postfixadmin/templates/list-virtual.php:

// Replacing this line:// print " <td>" . htmlentities($tMailbox[$i]['name']) . "</td>\n";print " <td>" . htmlentities($tMailbox[$i]['name'], ENT_QUOTES, 'UTF-8') . "</td>\n";

/var/www/postfixadmin/templates/admin_list-domain.php:

// Replacing this line:// print "<td>" . htmlentities($domain_properties[$i]['description']) . "</td>";print "<td>" . htmlentities($domain_properties[$i]['description'], ENT_QUOTES, 'UTF-8') . "</td>";

12) Create the Domain and Accounts in Postfix Admin

Now navigate to the main Postfix Admin login page:

https://mail.example.com/postfixadmin/

Log in as the newly created administrator account, and then choose the "New domain" option under "Domain List" in order to create the example.com domain. You can then add mail

users ("Add mailbox") and aliases ("Add alias") while viewing your domain. This will populate the schema, but it won't do anything else yet as none of the other mailserver componentsare configured to look at the database at this point.

Postfix Admin does have another useful function during this long setup process - it allows you to send mail to local users through the web interface, which is helpful when testing your

configuration and chasing down errors.

13) Create a User to Handle Virtual Mail Directories

Virtual mail users are those that do not exist as Unix system users. They thus don't use the standard Unix methods of authentication or mail delivery and don't have home directories.

That is how we are managing things here: mail users are defined in the database created by Postfix Admin rather than existing as system users. Mail will be kept in subfolders per

domain and account under /var/vmail - e.g. [email protected] will have a mail directory of /var/vmail/example.com/me. All of these mail directories will be owned by a single usercalled vmail, and Dovecot will use the vmail user in order to create and update mail files.

useradd -r -u 150 -g mail -d /var/vmail -s /sbin/nologin -c "Virtual maildir handler" vmailmkdir /var/vmailchmod 770 /var/vmailchown vmail:mail /var/vmail

Note that the user and virtual mail directory folder are using the "mail" group, and allowing other users in that group to modify the contents.

Page 6: A Mailserver on Ubuntu 12

14) Configure Dovecot

Dovecot will manage IMAP and POP3 connections, local mail directories, and receive incoming mail handed off from Postfix. It will also manage authentication for SMTP

connections - no point in having two separate authentication systems when Dovecot can handle both cases. Configuration is spread across a number of files in /etc/dovecot andsubfolders thereof, and might seem a little intimidating, but it's all laid out fairly logically. The first thing to do is to ensure that Dovecot is looking for user data in the database created

by Postfix Admin, so edit or create the file /etc/dovecot/conf.d/auth-sql.conf.ext to have the following contents:

# Look up user passwords from a SQL database as # defined in /etc/dovecot/dovecot-sql.conf.extpassdb { driver = sql args = /etc/dovecot/dovecot-sql.conf.ext}# Look up user information from a SQL database as # defined in /etc/dovecot/dovecot-sql.conf.extuserdb { driver = sql args = /etc/dovecot/dovecot-sql.conf.ext}

Now edit these lines in /etc/dovecot/dovecot-sql.conf.ext such that it uses the MySQL database created by Postfix Admin:

# Database driver: mysql, pgsql, sqlitedriver = mysql

# Examples:# connect = host=192.168.1.1 dbname=users# connect = host=sql.example.com dbname=virtual user=virtual password=blarg# connect = /etc/dovecot/authdb.sqlite#connect = host=localhost dbname=mail user=mail password=mailpassword

# Default password scheme.## List of supported schemes is in# http://wiki2.dovecot.org/Authentication/PasswordSchemes#default_pass_scheme = MD5-CRYPT

# Define the query to obtain a user password.password_query = \ SELECT username as user, password, '/var/vmail/%d/%n' as userdb_home, \ 'maildir:/var/vmail/%d/%n' as userdb_mail, 150 as userdb_uid, 8 as userdb_gid \ FROM mailbox WHERE username = '%u' AND active = '1'

# Define the query to obtain user information.user_query = \ SELECT '/var/vmail/%d/%n' as home, 'maildir:/var/vmail/%d/%n' as mail, \ 150 AS uid, 8 AS gid, concat('dirsize:storage=', quota) AS quota \ FROM mailbox WHERE username = '%u' AND active = '1'

Then change the controlling definitions in /etc/dovecot/conf.d/10-auth.conf such that Dovecot will read the SQL configuration files. While you are there, you should also make sure

that plaintext authentication is disabled unless the connection is encrypted or local:

# Disable LOGIN command and all other plaintext authentications unless# SSL/TLS is used (LOGINDISABLED capability). Note that if the remote IP# matches the local IP (ie. you're connecting from the same computer), the# connection is considered secure and plaintext authentication is allowed.disable_plaintext_auth = yes

# Space separated list of wanted authentication mechanisms:# plain login digest-md5 cram-md5 ntlm rpa apop anonymous gssapi otp skey# gss-spnego# NOTE: See also disable_plaintext_auth setting.auth_mechanisms = plain login

#### Password and user databases##

## Password database is used to verify user's password (and nothing more).# You can have multiple passdbs and userdbs. This is useful if you want to# allow both system users (/etc/passwd) and virtual users to login without# duplicating the system users into virtual database.## <doc/wiki/PasswordDatabase.txt>## User database specifies where mails are located and what user/group IDs# own them. For single-UID configuration use "static" userdb.## <doc/wiki/UserDatabase.txt>

#!include auth-deny.conf.ext#!include auth-master.conf.ext

#!include auth-system.conf.ext# Use the SQL database configuration rather than any of these others.!include auth-sql.conf.ext#!include auth-ldap.conf.ext

Page 7: A Mailserver on Ubuntu 12

#!include auth-passwdfile.conf.ext#!include auth-checkpassword.conf.ext#!include auth-vpopmail.conf.ext#!include auth-static.conf.ext

Next up, tell Dovecot where to put the virtual user mail directories. That requires the following changes in /etc/dovecot/conf.d/10-mail.conf:

# Location for users' mailboxes. The default is empty, which means that Dovecot# tries to find the mailboxes automatically. This won't work if the user# doesn't yet have any mail, so you should explicitly tell Dovecot the full# location.## If you're using mbox, giving a path to the INBOX file (eg. /var/mail/%u)# isn't enough. You'll also need to tell Dovecot where the other mailboxes are# kept. This is called the "root mail directory", and it must be the first# path given in the mail_location setting.## There are a few special variables you can use, eg.:## %u - username# %n - user part in user@domain, same as %u if there's no domain# %d - domain part in user@domain, empty if there's no domain# %h - home directory## See doc/wiki/Variables.txt for full list. Some examples:## mail_location = maildir:~/Maildir# mail_location = mbox:~/mail:INBOX=/var/mail/%u# mail_location = mbox:/var/mail/%d/%1n/%n:INDEX=/var/indexes/%d/%1n/%n## <doc/wiki/MailLocation.txt>#mail_location = maildir:/var/vmail/%d/%n

# System user and group used to access mails. If you use multiple, userdb# can override these by returning uid or gid fields. You can use either numbers# or names. <doc/wiki/UserIds.txt>mail_uid = vmailmail_gid = mail

# Valid UID range for users, defaults to 500 and above. This is mostly# to make sure that users can't log in as daemons or other system users.# Note that denying root logins is hardcoded to dovecot binary and can't# be done even if first_valid_uid is set to 0.## Use the vmail user uid here.first_valid_uid = 150last_valid_uid = 150

If you are bringing your own SSL certificate to the party, you have to let Dovecot know about by editing these lines in /etc/dovecot/conf.d/10-ssl.conf. Remember to include your

CA certificate bundle if provided with one by the certificate issuer:

# SSL/TLS support: yes, no, required. <doc/wiki/SSL.txt>ssl = yes

# PEM encoded X.509 SSL/TLS certificate and private key. They're opened before# dropping root privileges, so keep the key file unreadable by anyone but# root. Included doc/mkcert.sh can be used to easily generate self-signed# certificate, just make sure to update the domains in dovecot-openssl.cnfssl_cert = </path/to/my/cert.pemssl_key = </path/to/my/key.pem

# If key file is password protected, give the password here. Alternatively# give it when starting dovecot with -p parameter. Since this file is often# world-readable, you may want to place this setting instead to a different# root owned 0600 file by using ssl_key_password = <path.#ssl_key_password =

# PEM encoded trusted certificate authority. Set this only if you intend to use# ssl_verify_client_cert=yes. The file should contain the CA certificate(s)# followed by the matching CRL(s). (e.g. ssl_ca = </etc/ssl/certs/ca.pem)#ssl_ca = </path/to/ca.pem

Next, edit these lines in /etc/dovecot/conf.d/10-master.conf to add the Postfix option:

service auth { # auth_socket_path points to this userdb socket by default. It's typically # used by dovecot-lda, doveadm, possibly imap process, etc. Its default # permissions make it readable only by root, but you may need to relax these # permissions. Users that have access to this socket are able to get a list # of all usernames and get results of everyone's userdb lookups. unix_listener auth-userdb { mode = 0600 user = vmail group = mail }

unix_listener /var/spool/postfix/private/auth { mode = 0660 # Assuming the default Postfix user and group user = postfix

Page 8: A Mailserver on Ubuntu 12

group = postfix }

You may have to explicitly set a postmaster address in /etc/dovecot/conf.d/15-lda.conf; if you see "Invalid settings: postmaster_address setting not given" showing up in the mail log,

then this is the fix for that. Make sure that a suitable alias or mailbox exists for your chosen postmaster address:

# Address to use when sending rejection mails.# Default is [email protected]_address = [email protected]

You'll want to change the Dovecot configuration to be accessible to both dovecot and vmail users:

chown -R vmail:dovecot /etc/dovecotchmod -R o-rwx /etc/dovecot

A final note on Dovecot: it only creates a user's mail directory when mail is first delivered to that virtual user. So creating a user in Postfix Admin will not result in the immediate

creation of a mail directory under /var/vmail, and that's just fine.

15) Configure Amavis, ClamAV, and SpamAssassin

Before configuring Postfix, we may as well take a short detour into configuring the spam and virus tools. Their default configuration is close to what most people will need, and tools

like SpamAssassin auto-detect many of the optional additional packages you may have installed. If you have specialist needs or greater knowledge, you can of course spend a fair

amount of time here crafting intricate rules. For the casual user, this is a quick and straightforward process, however. Note that here we are putting off the portions relating tointegration with Postfix - e.g. additions to the master.cf file - into the Postfix section of this post.

First add Amavis and ClamAV users to one another's groups to enable them to collaborate:

adduser clamav amavisadduser amavis clamav

Then turn on Amavis by editing /etc/amavis/conf.d/15-content_filter_mode - the software is disabled by default, so uncomment the @bypass... lines:

use strict;

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

## Default antivirus checking mode# Please note, that anti-virus checking is DISABLED by# default.# If You wish to enable it, please uncomment the following lines:

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

## Default SPAM checking mode# Please note, that anti-spam checking is DISABLED by# default.# If You wish to enable it, please uncomment the following lines:

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

1; # ensure a defined return

Now enable SpamAssassin by editing these lines in /etc/default/spamassassin:

# Change to one to enable spamdENABLED=1

# Cronjob# Set to anything but 0 to enable the cron job to automatically update# spamassassin's rules on a nightly basisCRON=1

You will have to restart these processes to pick up the new configuration:

service amavis restartservice spamassassin restart

16) Configure Postfix

Postfix handles incoming mail via the SMTP protocol, and its configuration files have be set up to allow it to integrate with the various other packages we have installed so far. At a

high level, we want Postfix to hand off incoming mail to the spam and virus checkers before passing it on to Dovecot for delivery, and to authenticate virtual users who are connecting

over SMTP in order to to send mail.

Firstly create files describing for Postfix where to find information on users and domains. Note that the "hosts" directive in these files must be exactly the same as the "bind-address" in

/etc/mysql/my.cnf. If one side says "localhost" and the other side says "127.0.0.1" then you may find that Postfix cannot connect to MySQL - strange but true. Here are the needed

Postfix files:

/etc/postfix/mysql_virtual_alias_domainaliases_maps.cf

user = mailpassword = mailpassword

Page 9: A Mailserver on Ubuntu 12

hosts = 127.0.0.1dbname = mailquery = 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

/etc/postfix/mysql_virtual_alias_maps.cf

user = mailpassword = mailpasswordhosts = 127.0.0.1dbname = mailtable = aliasselect_field = gotowhere_field = addressadditional_conditions = and active = '1'

/etc/postfix/mysql_virtual_domains_maps.cf

user = mailpassword = mailpasswordhosts = 127.0.0.1dbname = mailtable = domainselect_field = domainwhere_field = domainadditional_conditions = and backupmx = '0' and active = '1'

/etc/postfix/mysql_virtual_mailbox_domainaliases_maps.cf

user = mailpassword = mailpasswordhosts = 127.0.0.1dbname = mailquery = 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

/etc/postfix/mysql_virtual_mailbox_maps.cf

user = mailpassword = mailpasswordhosts = 127.0.0.1dbname = mailtable = mailboxselect_field = CONCAT(domain, '/', local_part)where_field = usernameadditional_conditions = and active = '1'

Now create the file /etc/postfix/header_checks, which will contain some directives to remove certain headers when relaying mail. This improves privacy for the sending users by

such things as stripping the original IP address and mail software identifiers, for example. This file will be referenced in the main Postfix configuration:

/̂ Received:/ IGNORE/̂User-Agent:/ IGNORE/̂X-Mailer:/ IGNORE/̂X-Originating-IP:/ IGNORE/̂x-cr-[a-z]*:/ IGNORE/̂Thread-Index:/ IGNORE

The following is the complete main Postfix configuration file at /etc/postfix/main.cf, which contains a fair number of complex choices and options on how mail is relayed and how

SMTP behaves. It is far beyond the scope of this post to explain each and every choice of best practice or configuration parameter in detail. I strongly suggest that you spend some

time reading up on Postfix configuration, as this is where it is easy to fall down and produce a suboptimal or faulty mailserver.

# See /usr/share/postfix/main.cf.dist for a commented, more complete version

# The first text sent to a connecting process.smtpd_banner = $myhostname ESMTP $mail_namebiff = no# appending .domain is the MUA's job.append_dot_mydomain = noreadme_directory = no

# SASL parameters# ---------------------------------

# Use Dovecot to authenticate.smtpd_sasl_type = dovecot# Referring to /var/spool/postfix/private/authsmtpd_sasl_path = private/authsmtpd_sasl_auth_enable = yesbroken_sasl_auth_clients = yessmtpd_sasl_security_options = noanonymoussmtpd_sasl_local_domain =smtpd_sasl_authenticated_header = yes

# TLS parameters# ---------------------------------

Page 10: A Mailserver on Ubuntu 12

# Replace this with your SSL certificate path if you are using one.smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pemsmtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key# The snakeoil self-signed certificate has no need for a CA file. But# if you are using your own SSL certificate, then you probably have# a CA certificate bundle from your provider. The path to that goes# here.#smtpd_tls_CAfile=/path/to/ca/filesmtpd_use_tls=yessmtp_tls_security_level = maysmtpd_tls_security_level = may#smtpd_tls_auth_only = nosmtp_tls_note_starttls_offer = yessmtpd_tls_loglevel = 1smtpd_tls_received_header = yessmtpd_tls_session_cache_timeout = 3600stls_random_source = dev:/dev/urandom#smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache#smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

# See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for# information on enabling SSL in the smtp client.

# SMTPD parameters# ---------------------------------

# Uncomment the next line to generate "delayed mail" warnings#delay_warning_time = 4h# will it be a permanent error or temporaryunknown_local_recipient_reject_code = 450# how long to keep message on queue before return as failed.# some have 3 days, I have 16 days as I am backup server for some people# whom go on holiday with their server switched off.maximal_queue_lifetime = 7d# max and min time in seconds between retries if connection failedminimal_backoff_time = 1000smaximal_backoff_time = 8000s# how long to wait when servers connect before receiving rest of datasmtp_helo_timeout = 60s# how many address can be used in one message.# effective stopper to mass spammers, accidental copy in whole address list# but may restrict intentional mail shots.smtpd_recipient_limit = 16# how many error before back off.smtpd_soft_error_limit = 3# how many max errors before blocking it.smtpd_hard_error_limit = 12

# This next set are important for determining who can send mail and relay mail# to other servers. It is very important to get this right - accidentally producing# an open relay that allows unauthenticated sending of mail is a Very Bad Thing.## You are encouraged to read up on what exactly each of these options accomplish.

# Requirements for the HELO statementsmtpd_helo_restrictions = permit_mynetworks, warn_if_reject reject_non_fqdn_hostname, reject_invalid_hostname, permit# Requirements for the sender detailssmtpd_sender_restrictions = permit_sasl_authenticated, permit_mynetworks, warn_if_reject reject_non_fqdn_sender, reject_unknown_sender_domain, reject_unauth_pipelining, permit# Requirements for the connecting serversmtpd_client_restrictions = reject_rbl_client sbl.spamhaus.org, reject_rbl_client blackholes.easynet.nl, reject_rbl_client dnsbl.njabl.org# Requirement for the recipient address. Note that the entry for# "check_policy_service inet:127.0.0.1:10023" enables Postgrey.smtpd_recipient_restrictions = reject_unauth_pipelining, permit_mynetworks, permit_sasl_authenticated, reject_non_fqdn_recipient, reject_unknown_recipient_domain, reject_unauth_destination, check_policy_service inet:127.0.0.1:10023, permitsmtpd_data_restrictions = reject_unauth_pipelining

# require proper helo at connectionssmtpd_helo_required = yes# waste spammers time before rejecting themsmtpd_delay_reject = yesdisable_vrfy_command = yes

# General host and delivery info# ----------------------------------

myhostname = mail.example.commyorigin = /etc/hostname# Some people see issues when setting mydestination explicitly to the server# subdomain, while leaving it empty generally doesn't hurt. So it is left empty here.# mydestination = mail.example.com, localhostmydestination =# If you have a separate web server that sends outgoing mail through this# mailserver, you may want to add its IP address to the space-delimited list in# mynetworks, e.g. as 111.222.333.444/32.mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128mailbox_size_limit = 0recipient_delimiter = +inet_interfaces = allmynetworks_style = host

# This specifies where the virtual mailbox folders will be located.

Page 11: A Mailserver on Ubuntu 12

virtual_mailbox_base = /var/vmail# This is for the mailbox location for each user. The domainaliases# map allows us to make use of Postfix Admin's domain alias feature.virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf, mysql:/etc/postfix/mysql_virtual_mailbox_domainaliases_maps.cf# and their user idvirtual_uid_maps = static:150# and group idvirtual_gid_maps = static:8# This is for aliases. The domainaliases map allows us to make # use of Postfix Admin's domain alias feature.virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf, mysql:/etc/postfix/mysql_virtual_alias_domainaliases_maps.cf# This is for domain lookups.virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains_maps.cf

# Integration with other packages# ---------------------------------------

# Tell postfix to hand off mail to the definition for dovecot in master.cfvirtual_transport = dovecotdovecot_destination_recipient_limit = 1

# Use amavis for virus and spam scanningcontent_filter = amavis:[127.0.0.1]:10024

# Header manipulation# --------------------------------------

# Getting rid of unwanted headers. See: https://posluns.com/guides/header-removal/header_checks = regexp:/etc/postfix/header_checks# getting rid of x-original-toenable_original_recipient = no

To be clear, if you are using a purchased SSL certificate - and have a CA certificate bundle from the issuer - then you will have to alter these lines in /etc/postfix/main.cf:

# Replace this with your SSL certificate path if you are using one.smtpd_tls_cert_file=/path/to/my/cert.pemsmtpd_tls_key_file=/path/to/my/key.key# The snakeoil self-signed certificate has no need for a CA file. But# if you are using your own SSL certificate, then you probably have# a CA certificate bundle from your provider. The path to that goes# here.#smtpd_tls_CAfile=/path/to/ca/file

You must also add some material to /etc/postfix/master.cf, and here is the entire file for clarity, including much of the default material from the package install - such as commented

options:

## Postfix master process configuration file. For details on the format# of the file, see the master(5) manual page (command: "man 5 master").## Do not forget to execute "postfix reload" after editing this file.## ==========================================================================# service type private unpriv chroot wakeup maxproc command + args# (yes) (yes) (yes) (never) (100)# ==========================================================================smtp inet n - - - - smtpd#smtp inet n - - - 1 postscreen#smtpd pass - - - - - smtpd#dnsblog unix - - - - 0 dnsblog#tlsproxy unix - - - - 0 tlsproxy#submission inet n - - - - smtpd# -o syslog_name=postfix/submission# -o smtpd_tls_security_level=encrypt# -o smtpd_sasl_auth_enable=yes# -o smtpd_client_restrictions=permit_sasl_authenticated,reject# -o milter_macro_daemon_name=ORIGINATINGsmtps inet n - - - - smtpd -o syslog_name=postfix/smtps -o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes -o smtpd_tls_auth_only=yes -o smtpd_client_restrictions=permit_sasl_authenticated,reject_unauth_destination,reject -o smtpd_sasl_security_options=noanonymous,noplaintext -o smtpd_sasl_tls_security_options=noanonymous# -o milter_macro_daemon_name=ORIGINATING#628 inet n - - - - qmqpdpickup fifo n - - 60 1 pickup -o content_filter= -o receive_override_options=no_header_body_checkscleanup unix n - - - 0 cleanupqmgr fifo n - n 300 1 qmgr#qmgr fifo n - n 300 1 oqmgrtlsmgr unix - - - 1000? 1 tlsmgrrewrite unix - - - - - trivial-rewritebounce unix - - - - 0 bouncedefer unix - - - - 0 bouncetrace unix - - - - 0 bounceverify unix - - - - 1 verifyflush unix n - - 1000? 0 flush

Page 12: A Mailserver on Ubuntu 12

proxymap unix - - n - - proxymapproxywrite unix - - n - 1 proxymapsmtp unix - - - - - smtprelay unix - - - - - smtp# -o smtp_helo_timeout=5 -o smtp_connect_timeout=5showq unix n - - - - showqerror unix - - - - - errorretry unix - - - - - errordiscard unix - - - - - discardlocal unix - n n - - localvirtual unix - n n - - virtuallmtp unix - - - - - lmtpanvil unix - - - - 1 anvilscache unix - - - - 1 scache## ====================================================================# Interfaces to non-Postfix software. Be sure to examine the manual# pages of the non-Postfix software to find out what options it wants.## Many of the following services use the Postfix pipe(8) delivery# agent. See the pipe(8) man page for information about ${recipient}# and other message envelope options.# ====================================================================## maildrop. See the Postfix MAILDROP_README file for details.# Also specify in main.cf: maildrop_destination_recipient_limit=1#maildrop unix - n n - - pipe flags=DRhu user=vmail argv=/usr/bin/maildrop -d ${recipient}## ====================================================================## Recent Cyrus versions can use the existing "lmtp" master.cf entry.## Specify in cyrus.conf:# lmtp cmd="lmtpd -a" listen="localhost:lmtp" proto=tcp4## Specify in main.cf one or more of the following:# mailbox_transport = lmtp:inet:localhost# virtual_transport = lmtp:inet:localhost## ====================================================================## Cyrus 2.1.5 (Amos Gouaux)# Also specify in main.cf: cyrus_destination_recipient_limit=1##cyrus unix - n n - - pipe# user=cyrus argv=/cyrus/bin/deliver -e -r ${sender} -m ${extension} ${user}## ====================================================================# Old example of delivery via Cyrus.##old-cyrus unix - n n - - pipe# flags=R user=cyrus argv=/cyrus/bin/deliver -e -m ${extension} ${user}## ====================================================================## See the Postfix UUCP_README file for configuration details.#uucp unix - n n - - pipe flags=Fqhu user=uucp argv=uux -r -n -z -a$sender - $nexthop!rmail ($recipient)## Other external delivery methods.#ifmail unix - n n - - pipe flags=F user=ftn argv=/usr/lib/ifmail/ifmail -r $nexthop ($recipient)bsmtp unix - n n - - pipe flags=Fq. user=bsmtp argv=/usr/lib/bsmtp/bsmtp -t$nexthop -f$sender $recipientscalemail-backend unix - n n - 2 pipe flags=R user=scalemail argv=/usr/lib/scalemail/bin/scalemail-store ${nexthop} ${user} ${extension}mailman unix - n n - - pipe flags=FR user=list argv=/usr/lib/mailman/bin/postfix-to-mailman.py ${nexthop} ${user}

## The next two entries integrate with Amavis for anti-virus/spam checks.#amavis unix - - - - 2 smtp -o smtp_data_done_timeout=1200 -o smtp_send_xforward_command=yes -o disable_dns_lookups=yes -o max_use=20127.0.0.1:10025 inet n - - - - smtpd -o content_filter= -o local_recipient_maps= -o relay_recipient_maps= -o smtpd_restriction_classes= -o smtpd_delay_reject=no -o smtpd_client_restrictions=permit_mynetworks,reject -o smtpd_helo_restrictions= -o smtpd_sender_restrictions=

Page 13: A Mailserver on Ubuntu 12

-o smtpd_recipient_restrictions=permit_mynetworks,reject -o smtpd_data_restrictions=reject_unauth_pipelining -o smtpd_end_of_data_restrictions= -o mynetworks=127.0.0.0/8 -o smtpd_error_sleep_time=0 -o smtpd_soft_error_limit=1001 -o smtpd_hard_error_limit=1000 -o smtpd_client_connection_count_limit=0 -o smtpd_client_connection_rate_limit=0 -o receive_override_options=no_header_body_checks,no_unknown_recipient_checks

## Integration with Dovecot - hand mail over to it for local delivery, and# run the process under the vmail user and mail group.#dovecot unix - n n - - pipe flags=DRhu user=vmail:mail argv=/usr/lib/dovecot/dovecot-lda -d $(recipient)

Note that Amavis is restricted to two processes, which should be fine for most casual to moderate use. The processes are memory-heavy, so start low and add more only if you needto due to volume of mail - see the notes in this guide for pointers on how to do that.

17) Restart Everything, and Test the Server

Restart all the necessary processes to pick up configuration changes:

service postfix restartservice spamassassin restartservice clamav-daemon restartservice amavis restartservice dovecot restart

Now start testing! Keep an eye on /var/log/mail.err and /var/log/mail.log for error messages and try logging in to POP and IMAP, sending mail to an account created on theserver, and sending mail from the server. If you find issues, then Google is your friend when it comes to searching on specific error messages in order to identify where the

configuration is wrong, or when something unexpected crops up.

18) AWS Mail Restrictions and Reverse DNS Lookup

Once configured, with IP address set and DNS records set up, you'll need to have a reverse DNS lookup put in place for your server, and the AWS outgoing mail restrictions lifted.

You do that through the standard customer service form. This doesn't take long, and it can actually happen earlier in the process if necessary, prior to the server completion.

19) Install Horde 4 for Webmail

Horde 4 is a groupware framework that includes applications focused on webmail. Putting it in place is mix of apt-get and PECL / Pear package installations, much of which I liftedfrom the Ubuntu guide and then adapted to this server setup. The first step is to install as many of the needed packages as possible through apt-get:

apt-get install php5-dev php5-sasl php-pear php5-tidy php5-imagick apt-get install php5-geoip libgeoip1 geoip-bin geoip-databaseapt-get install php-xml-serializer php5-memcache php-soap php5-intlapt-get install libidn11-dev libmagickwand-dev libmagick++4 imagemagickapt-get install libsasl2-dev libssh2-php libphp-jpgraph php-http-webdav-server

Next update the PECL and Pear package managers and install the remaining required packages:

pecl channel-update pear.php.netpear channel-update pear.php.netpecl install lzfpear install --alldeps channel://pear.php.net/Date_Holidays-0.21.5pear install --alldeps channel://pear.php.net/Date_Holidays_UNO-0.1.3pear install --alldeps channel://pear.php.net/Date_Holidays_USA-0.1.1pear install --alldeps channel://pear.php.net/Numbers_Words-0.16.2pear install --alldeps channel://pear.php.net/Text_CAPTCHA-0.4.3

Next up is installing the Horde components, which might take a while. Before starting in on the long series of Pear channel installs, this step will prompt for the "Filesystem location forthe base Horde application" - enter the full path to your webroot without a trailing slash, i.e. /var/www:

pear channel-discover pear.horde.orgpear install horde/Horde_rolepear run-scripts horde/Horde_rolepear install -a -B horde/webmail

At this point it is a good idea to make sure that all of your PHP extensions are in fact enabled. Some may not be; the following commands ensure that the configuration files that were

missing in my installation trial run are created, and then restart Apache to pick them up:

echo "extension=memcache.so" > /etc/php5/conf.d/memcache.iniecho "extension=lzf.so" > /etc/php5/conf.d/lzf.iniservice apache2 restart

The Horde application will now be sitting in your webroot, but owned by root. So change the ownership to the Apache user:

chown -R www-data:www-data /var/www

The installation will have overwritten /var/www/.htaccess, so edit that file to reinstate your mod_rewrite rule that redirects all traffic to HTTPS. It will look much like this:

allow from all

Page 14: A Mailserver on Ubuntu 12

RewriteEngine On

# Add the redirect to HTTPS rule. RewriteCond %{SERVER_PORT} 80 RewriteRule ̂(.*) https://mail.example.com/$1 [L]

# This is the default Horde rule. RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ̂(.*)$ rampage.php [QSA,L]

Once Horde is running it is completely open to the world in order to allow initial configuration. So first lock it down to be accessible from your IP address only - at least until you havean administrator and authentication set up. Do that by making this change to the /var/www/.htaccess file - in the example below replace 10.10.10.10 with the IP address you are

using:

#allow from all

# Remove this block when doneOrder deny,allowdeny from allallow from 10.10.10.10allow from 127.0.0.1

You can check to see that all of the required and/or desired PHP extensions are installed and working by visiting http://mail.example.com/test.php in your browser. It will providea list of what is and is not presently installed. This guide leaves out LDAP and PAM support in PHP, for example, as they are not needed here.

Now log in to MySQL as root:

mysql -uroot -p

You will need to create a MySQL database for Horde:

create database horde;grant all on horde.* to 'horde'@'localhost' identified by 'hordepassword';

20) Initial Configuration for Horde Webmail

Horde 4 is complex, and an exploration of all of the configuration possibilities and the rationale behind them is somewhat beyond the scope of this guide. What follows is the bareminimum needed to get up, running, and secure. Bear in mind that many more options exist, as there are a lot of configuration pages to wade through in the administration interface.

There are also other components of the Horde framework that can add in yet more capabilities to your webmail application when installed.

But first things first: if you want admins specified in the Horde configuration to receive alarm mails, you must add the following crontab entry - once every five minutes is a fair setting.See the Ubuntu crontab help document for instructions on how to add crontab entries.

# Horde Alarms*/5 * * * * /usr/bin/horde-alarms

An important note: configuration in Horde works by creating or updating PHP configuration files whenever an administrator changes configuration options in the web interface. Youcan take a shortcut by putting prefilled configuration files in place, as is shown below. This is a fragile shortcut, however, as software changes - this may be broken for later versions of

Horde than that used for this post. If this fails for you, remove the configuration files, and go back to the manual setup process described in the Horde documentation.

Now create a configuration file at /var/www/config/conf.php and fill it with the contents below. This will achieve the following goals:

Disable the http://mail.example.com/test.php page.Set the database connection information.

Use the local IMAP server for user authentication.Establish [email protected] as the administrator. You should of course replace this with your chosen administrator virtual mail account.

Make Horde cache CSS and Javascript in the filesystem and use Memcached for general caching.Put in some common sense settings for some of the other needed odds and ends - too many to note here individually.

<?php$conf['vhosts'] = false;$conf['debug_level'] = E_ALL & ~E_NOTICE;$conf['max_exec_time'] = 0;$conf['compress_pages'] = true;$conf['umask'] = 077;

// Disable the test page.$conf['testdisable'] = true;

$conf['use_ssl'] = 2;$conf['server']['name'] = $_SERVER['SERVER_NAME'];$conf['urls']['token_lifetime'] = 30;$conf['urls']['hmac_lifetime'] = 30;$conf['urls']['pretty'] = false;$conf['safe_ips'] = array();$conf['session']['name'] = 'Horde';$conf['session']['use_only_cookies'] = true;$conf['session']['cache_limiter'] = 'nocache';$conf['session']['timeout'] = 0;$conf['cookie']['domain'] = $_SERVER['SERVER_NAME'];$conf['cookie']['path'] = '/';$conf['sql']['persistent'] = true;

Dell
Highlight
Page 15: A Mailserver on Ubuntu 12

// Make sure that these match your Horde database user information.$conf['sql']['username'] = 'horde';$conf['sql']['password'] = 'hordepassword';$conf['sql']['protocol'] = 'unix';$conf['sql']['database'] = 'horde';$conf['sql']['charset'] = 'utf-8';$conf['sql']['ssl'] = false;$conf['sql']['splitread'] = false;$conf['sql']['phptype'] = 'mysql';

$conf['ldap']['useldap'] = false;

// This is the virtual mail user that will be the Horde administrator.$conf['auth']['admins'] = array('[email protected]');

// Authentication for Horde login runs through the local IMAP server, // and that process is controlled by the imp component.$conf['auth']['checkip'] = true;$conf['auth']['checkbrowser'] = true;$conf['auth']['resetpassword'] = true;$conf['auth']['alternate_login'] = false;$conf['auth']['redirect_on_logout'] = false;$conf['auth']['list_users'] = 'input';$conf['auth']['params']['app'] = 'imp';$conf['auth']['driver'] = 'application';$conf['auth']['params']['count_bad_logins'] = false;$conf['auth']['params']['login_block'] = false;$conf['auth']['params']['login_block_count'] = 5;$conf['auth']['params']['login_block_time'] = 5;

$conf['signup']['allow'] = false;$conf['log']['priority'] = 'INFO';$conf['log']['ident'] = 'HORDE';$conf['log']['name'] = LOG_USER;$conf['log']['type'] = 'syslog';$conf['log']['enabled'] = true;$conf['log_accesskeys'] = false;$conf['prefs']['params']['driverconfig'] = 'horde';$conf['prefs']['driver'] = 'Sql';$conf['alarms']['params']['driverconfig'] = 'horde';$conf['alarms']['params']['ttl'] = 300;$conf['alarms']['driver'] = 'Sql';$conf['datatree']['driver'] = 'null';$conf['group']['driverconfig'] = 'horde';$conf['group']['driver'] = 'Sql';$conf['perms']['driverconfig'] = 'horde';$conf['perms']['driver'] = 'Sql';$conf['share']['no_sharing'] = false;$conf['share']['auto_create'] = true;$conf['share']['world'] = true;$conf['share']['any_group'] = false;$conf['share']['hidden'] = false;$conf['share']['cache'] = false;$conf['share']['driver'] = 'Sqlng';

// Caching configuration.$conf['cache']['default_lifetime'] = 86400;$conf['cache']['params']['prefix'] = 'horde_';$conf['cache']['driver'] = 'Apc';$conf['cache']['compress'] = true;$conf['cache']['use_memorycache'] = '';$conf['cachecssparams']['driver'] = 'filesystem';$conf['cachecssparams']['lifetime'] = 86400;$conf['cachecssparams']['compress'] = 'php';$conf['cachecss'] = true;$conf['cachejsparams']['driver'] = 'filesystem';$conf['cachejsparams']['compress'] = 'php';$conf['cachejsparams']['lifetime'] = 86400;$conf['cachejs'] = true;$conf['cachethemesparams']['check'] = 'appversion';$conf['cachethemesparams']['lifetime'] = 604800;$conf['cachethemes'] = true;

$conf['lock']['params']['driverconfig'] = 'horde';$conf['lock']['driver'] = 'Sql';$conf['token']['params']['driverconfig'] = 'horde';$conf['token']['driver'] = 'Sql';

// Send Horde notification mails out through local SMTP, unauthorized.$conf['mailer']['params']['auth'] = false;$conf['mailer']['type'] = 'smtp';$conf['mailformat']['brokenrfc2231'] = false;

$conf['vfs']['params']['driverconfig'] = 'horde';$conf['vfs']['type'] = 'Sql';

// Use memcache for session handling.$conf['sessionhandler']['params']['track'] = false;$conf['sessionhandler']['type'] = 'Memcache';$conf['sessionhandler']['memcache'] = true;

Page 16: A Mailserver on Ubuntu 12

$conf['spell']['driver'] = '';$conf['gnupg']['keyserver'] = array('pool.sks-keyservers.net');$conf['gnupg']['timeout'] = 10;$conf['nobase64_img'] = false;$conf['image']['driver'] = 'Imagick';$conf['exif']['driver'] = 'Bundled';$conf['mime']['magic_db'] = '/usr/share/misc/magic';

// Replace these with your domain and email address for solver of user problems.$conf['problems']['email'] = '[email protected]';$conf['problems']['maildomain'] = 'example.com';$conf['problems']['tickets'] = false;$conf['problems']['attachments'] = true;

$conf['menu']['apps'] = array();$conf['menu']['always'] = false;$conf['menu']['links']['help'] = 'all';$conf['menu']['links']['prefs'] = 'authenticated';$conf['menu']['links']['problem'] = 'all';$conf['menu']['links']['login'] = 'all';$conf['menu']['links']['logout'] = 'authenticated';$conf['portal']['fixed_blocks'] = array();$conf['accounts']['driver'] = 'null';$conf['user']['verify_from_addr'] = false;$conf['user']['select_view'] = true;$conf['facebook']['enabled'] = false;$conf['twitter']['enabled'] = false;$conf['urlshortener'] = false;$conf['weather']['provider'] = false;$conf['imsp']['enabled'] = false;$conf['kolab']['enabled'] = false;

// Use memcache.$conf['memcache']['hostspec'] = array('localhost');$conf['memcache']['port'] = array('11211');$conf['memcache']['weight'] = array();$conf['memcache']['persistent'] = true;$conf['memcache']['c_threshold'] = 0;$conf['memcache']['compression'] = true;$conf['memcache']['prefix'] = horde_;$conf['memcache']['large_items'] = true;$conf['memcache']['enabled'] = true;

$conf['activesync']['state']['params']['devicetable'] = 'horde_activesync_device';$conf['activesync']['state']['params']['statetable'] = 'horde_activesync_state';$conf['activesync']['state']['params']['maptable'] = 'horde_activesync_map';$conf['activesync']['state']['params']['userstable'] = 'horde_activesync_device_users';$conf['activesync']['logging']['type'] = 'horde';$conf['activesync']['ping']['heartbeatmin'] = 60;$conf['activesync']['ping']['heartbeatmax'] = 2700;$conf['activesync']['ping']['heartbeatdefault'] = 480;$conf['activesync']['ping']['deviceping'] = true;$conf['activesync']['ping']['waitinterval'] = 5;$conf['activesync']['securitypolicies']['provisioning'] = false;$conf['activesync']['enabled'] = true;

// The end. No need for a PHP close tag.

Make sure that the file is owned by the web user:

chown www-data:www-data /var/www/config/conf.php

Now fire up you web browser and navigate to your server at http://mail.example.com/ to verify that you can log in as the configured administrative mail user. Once logged in youwill probably see error notices complaining about missing database tables - this is fine. Before dealing with that, you must first regenerate the configuration file; follow the warning

notices at Administration->Configuration to visit the main Horde configuration form pages and click on one of the "Generate Horde Configuration" buttons. This will rebuild theconfiguration file with the keys and comments that Horde likes to have in there.

Next you will set up the database schema: return to Administration->Configuration and click the "Update DB Schemas" button at the top of the page. This may or may not

correctly create schema for all of the installed components. Any that are missed due to errors or wrong ordering can be created individually by clicking on the "missing schema"warning notices for each component, or by clicking the "Update DB Schemas" button again.

Now you can create the Mail (imp) component configuration file in much the same way as was done for the general Horde configuration file. Create the file

/var/www/imp/config/conf.d and populate it with the PHP code below. This specifies a fairly limited user experience - inbox only, and sending and recieving mail with few frills.

<?php$conf['user']['allow_folders'] = false;$conf['user']['allow_view_source'] = true;$conf['server']['server_list'] = 'none';$conf['server']['fixed_folders'] = array();$conf['msgsettings']['filtering']['words'] = './config/filter.txt';$conf['msgsettings']['filtering']['replacement'] = '****';$conf['spam']['reporting'] = false;$conf['notspam']['reporting'] = false;$conf['print']['add_printedby'] = false;$conf['compose']['use_vfs'] = false;$conf['compose']['link_attachments'] = false;$conf['compose']['attach_size_limit'] = 0;$conf['compose']['attach_count_limit'] = 0;$conf['compose']['convert_to_related'] = true;

Page 17: A Mailserver on Ubuntu 12

$conf['compose']['reply_limit'] = 200000;$conf['compose']['ac_browser'] = 50;$conf['compose']['ac_threshold'] = 3;$conf['maillog']['use_maillog'] = true;$conf['sentmail']['params']['threshold'] = 60;$conf['sentmail']['params']['limit_period'] = 24;$conf['sentmail']['params']['table'] = 'imp_sentmail';$conf['sentmail']['params']['driverconfig'] = 'horde';$conf['sentmail']['driver'] = 'Sql';$conf['tasklist']['use_tasklist'] = true;$conf['notepad']['use_notepad'] = true;$conf['dimp']['viewport']['buffer_pages'] = 10;$conf['dimp']['viewport']['viewport_wait'] = 10;$conf['menu']['apps'] = array('ingo', 'mnemo', 'turba');$conf['menu']['apps_iframe'] = false;// The end. No need for a PHP close tag.

Next up is the Calendar (kronolith) configuration file. Create the file /var/www/kronolith/config/conf.d and populate it with the PHP code below. This is again a fairly limitedconfiguration:

<?php$conf['calendar']['params']['table'] = 'kronolith_events';$conf['calendar']['params']['driverconfig'] = 'horde';$conf['calendar']['params']['utc'] = true;$conf['calendar']['driver'] = 'sql';$conf['storage']['params']['table'] = 'kronolith_storage';$conf['storage']['params']['driverconfig'] = 'horde';$conf['storage']['driver'] = 'sql';$conf['autoshare']['shareperms'] = 'none';$conf['share']['notify'] = false;$conf['holidays']['enable'] = true;$conf['menu']['import_export'] = true;$conf['menu']['apps'] = array('horde', 'imp', 'ingo', 'mnemo', 'turba');$conf['menu']['apps_iframe'] = false;$conf['maps']['driver'] = false;// The end. No need for a PHP close tag.

Make sure that these files are owned by the web user:

chown www-data:www-data /var/www/imp/config/conf.phpchown www-data:www-data /var/www/kronolith/config/conf.php

As before, you will have to regenerate these edited configuration files - do that in the same way as for the main Horde configuration file, by navigating to the configuration form pages

for the Mail (imp) and Calendar (kronolith) components and saving the configuration in each.

The other component configuration files can be auto-created for now. Navigate to Administration->Configuration and click the "Update All Configurations" button at the top of thepage. That will create the remaining configuration files and populate them with default values.

Now that Horde is configured to allow login through IMAP, you can remove the temporary IP address restrictions in /var/www/.htaccess and restore this line:

allow from all

21) Further Configuration for Horde 4 Webmail

The more usual setup methodology for Horde (as opposed to directly manipulating configuration files) is to walk through the administrative settings pages to set the various values

interactively. Directly manipulating the configuration files is a somewhat faster process, however. But now you should wander the administrative interface and tinker with the settings toproduce the desired user experience. I should note that unless you know exactly where you are going with that, it might take a while: there is a great deal to explore.

22) Install and Set up Monit for Monitoring

Monit is a very useful monitoring tool that helps rescue your server from failed processes. Install it through apt-get:

apt-get install monit

The following are a set of fairly trivial instructions that set monit to watch over the important server processes - but without issuing notifications or doing much more than restarting on

failure. Create the following files in the Monit configuration directory.

In /etc/monit/conf.d/amavis:

check process amavisd with pidfile /var/run/amavis/amavisd.pid group mail start program = "/etc/init.d/amavis start" stop program = "/etc/init.d/amavis stop" if failed port 10024 protocol smtp then restart if 5 restarts within 5 cycles then timeout

In /etc/monit/conf.d/apache2:

check process apache2 with pidfile /var/run/apache2.pid group www start program = "/etc/init.d/apache2 start" stop program = "/etc/init.d/apache2 stop" if failed host localhost port 80 protocol http with timeout 10 seconds then restart if 5 restarts within 5 cycles then timeout

Page 18: A Mailserver on Ubuntu 12

In /etc/monit/conf.d/dovecot:

check process dovecot with pidfile /var/run/dovecot/master.pid group mail start program = "/etc/init.d/dovecot start" stop program = "/etc/init.d/dovecot stop" group mail if failed port 993 type tcpssl sslauto protocol imap for 5 cycles then restart if 3 restarts within 5 cycles then timeout

In /etc/monit/conf.d/mysql:

check process mysqld with pidfile /var/run/mysqld/mysqld.pid group database start program = "/etc/init.d/mysql start" stop program = "/etc/init.d/mysql stop" if failed host localhost port 3306 protocol mysql then restart if 5 restarts within 5 cycles then timeout

In /etc/monit/conf.d/memcached:

check process memcached with pidfile /var/run/memcached.pid group www start program = "/etc/init.d/memcached start" stop program = "/etc/init.d/memcached stop" if failed host localhost port 11211 then restart if 5 restarts within 5 cycles then timeout

In /etc/monit/conf.d/postfix:

check process postfix with pidfile /var/spool/postfix/pid/master.pid group mail start program = "/etc/init.d/postfix start" stop program = "/etc/init.d/postfix stop" if failed port 25 protocol smtp then restart if 5 restarts within 5 cycles then timeout

In /etc/monit/conf.d/spamassassin:

check process spamassassin with pidfile /var/run/spamd.pid group mail start program = "/etc/init.d/spamassassin start" stop program = "/etc/init.d/spamassassin stop" if 5 restarts within 5 cycles then timeout

In /etc/monit/conf.d/sshd:

check process sshd with pidfile /var/run/sshd.pid start program "/etc/init.d/ssh start" stop program "/etc/init.d/ssh stop" if failed host 127.0.0.1 port 22 protocol ssh then restart if 5 restarts within 5 cycles then timeout

Then restart Monit to pick up the new orders:

service monit restart

Monit offers options for notifications, a web console, restarting on high load, logging activity, and many other amenities, so you may want to add more to this very basic configuration.

Notes on Serving Multiple Domains

You can create multiple domains in Postfix Admin if so desired, under Domain List -> New Domain. If you want to use this mail server for more than one domain, you must (a) add

the domains in Postfix Admin, and (b) consider whether or not to create domain-specific configuration files for Horde.

Additional domains added in Postfix Admin can be aliased to existing domains (under Virtual List -> Add Alias Domain), such that [email protected] is always forwarded

to [email protected], or they can stand as distinct domains with their own accounts, forwards, and so forth.

Depending on your use case, you might also want to adjust some of the .htaccess rules to support users accessing the site at mail.example1.com, mail.example2.com, and so forth -such as expanding the redirect to SSL to recognize all of the domains used.

Horde should work for multiple domains with just the one configuration file, but this may not be optimal for your usage. Try it and see. If not, then you will have to create parallel

Horde configuration files for each domain you are using. See the Horde documentation for more on this, as well as the notes for $conf[vhosts] in the Horde configuration webinterface.

Notes on Managing Quotas

If you've been following carefully, you'll note that nothing has been said so far on the matter of user disk space quotas - it was not an important goal for the work that prompted thecreation of these instructions. As things stand the necessary fields for quota managment exist in the MySQL database but are not used, as (a) the quota module isn't enabled by defaultin Dovecot, and (b) Postfix Admin is set not to use quotas by default.

So if you want to enable disk quotas, first alter the Postfix Admin quota configuration in /var/www/postfixadmin/config.inc.php:

// Quota// When you want to enforce quota for your mailbox users set this to 'YES'.$CONF['quota'] = 'YES';

Page 19: A Mailserver on Ubuntu 12

// You can either use '1024000' or '1048576'$CONF['quota_multiplier'] = '1024000';

// Optional:// Show used quotas from Dovecot dictionary backend in virtual// mailbox listing.// See: DOCUMENTATION/DOVECOT.txt// http://wiki2.dovecot.org/Quota/Dict//$CONF['used_quotas'] = 'YES';

// if you use dovecot >= 1.2, set this to yes.// Note about dovecot config: table "quota" is for 1.0 & 1.1, // table "quota2" is for dovecot 1.2 and newer$CONF['new_quota_table'] = 'YES';

Next, you will want to enable and configure the quota and imap_quota modules in Dovecot. The former manages quotas while the latter enables reporting on quotas via IMAP. Youwill want to look through the following documentation for instructions on how to do this:

Quota (Dovecot 2.*)Quota Configuration (Dovecot 2.*)

These configuration changes will be made in 10-mail.conf and 90-quota.conf in the /etc/dovecot/conf.d folder.

Bypassing Spam and Virus Checks for Local Mail

If you're in the business of sending out newsletters or frequent updates from local software where you completely control the content in those emails, then you probably don't want torun spam and virus checks for those items. It's a pointless use of server processing cycles, and a newsletter run can hammer the server if you are making it process the full range ofchecks on each and every one of those mails.

To have amavisd-new skip the checks for mail originating from a known set of IP addresses (e.g. locally, from a web application on another server, etc), edit /etc/amavis/conf.d/50-user as follows:

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#

# Replace 111.111.111.111/32 with your desired list of client IP address# ranges which will bypass checks.@mynetworks = qw( 127.0.0.0/8 [::1] 111.111.111.111/32 );

# Rules for clients defined in @mynetworks$policy_bank{'MYNETS'} = { bypass_spam_checks_maps => [1], # don't spam-check internal mail bypass_banned_checks_maps => [1], # don't banned-check internal mail bypass_header_checks_maps => [1], # don't header-check internal mail};

#------------ Do not modify anything below this line -------------1; # ensure a defined return

Replace 111.111.111.111/32 with whatever set of IP address ranges you want to bypass amavisd-new checks. All mail arriving from those sources will fall into MYNETS foramavisd-new and therefore bypass checking. If bypassing by IP address doesn't fit your needs, you can find ways to skip checks for some users, destinations, or sources in a helpful,

if dated guide to amavisd-new and Postfix integration.

Some Final Notes on Security

You'll note that there are a fair number of configuration files that contain database passwords for the mail and Horde data in this server, and that includes PHP files sitting in the

webroot. This is not really the dominant security concern: the mail users are virtual and only the server administrator should be logging in as a system user. On AWS the default setupis for SSH login to use keys rather than passwords, and only the ubuntu user has a key setup to allow login. You can also easily lock down the SSH port to selected IP addresses via

the security group applied to the server. Further, you can set .htaccess directives to ensure that no web visitor can directly view configuration files - and thus they are only used asincludes, which covers the rare case where some error causes PHP files to be served by Apache as plain text. MySQL access is from localhost only, in any case.

All in all the lowest bar from a security perspective is probably that the mail server built here runs a couple of complicated PHP web applications with database access. A serious

breach there would involve a way to upload and execute an arbitrary PHP script or shell command with the www-data user's permissions, or various other XSS attacks allowing forsession hijacking of administrators - either way, or just by getting into the mail and Horde databases, compromise of the webroot is compromise of all of the important functions of theserver. Horde has had multiple vulnerabilities in past years, but at some point you have to pick your software. On the whole which given the choice I'd rather go with the output of

established development communities whose members have a demonstrated track record of vulnerabilities found and fixed, and where there are a large number of eyes directed at thecodebase.

These are all good reasons for setting up your webmail on a different server from the one running Postfix and Dovecot - something to bear in mind.

Of course being on AWS - or indeed pretty much any sort of easily available hosting in the US wherein the server is not in your front room - means that the US government has freeaccess to your data any time they particularly feel up to the task, and you may never know a copy was taken. One of the welcome forthcoming evolutions in virtual hosting services

will be some form of turn-key encrypted server operations such that you can have the convenience of an AWS-style service but without the transparency it affords the present daypanopticon-in-the-making.