2013-03-12, bewerkt op 2017-01-01

Mailserver onder Debian (Postfix, Dovecot, PostfixAdmin)

In deze how to zal ik beschrijven hoe je een mailserver opzet met Postfix, Dovecot, Postfixadmin, Amavisd-new, ClamAV en Postgrey. Toen ik hier zelf mee bezig was merkte ik dat de informatie die ik hiervoor nodig had veel verspreid was en daarom leek het me handig om zelf een how to te schrijven.

Ik ga er hierbij vanuit dat je Debian Wheezy draait, met Apache al geinstalleerd. Waarschijnlijk is deze how to ook prima toe te passen op andere distributies zoals Ubuntu.

Als MTA (Mail Transfer Agent) gebruiken we Postfix. De MTA is de SMTP-server, die het ‘routen’ van de mail afhandelt. Hierbij gebruiken we Postfixadmin als control panel. Postfixadmin is een webinterface waarin je de mailboxen, domeinen en aliasen kunt definieren. Postfixadmin zet dit in een MySQL-database. Postfix en Dovecot maken gebruik van deze database.

Dovecot is de MDA (Mail Delivery Agent). Postfix geeft de binnenkomende mail door aan Dovecot. Dovecot maakt het via IMAP (of POP3, als je dat graag wilt) beschikbaar aan de users.

Tussen Postfix en Dovecot zitten nog Amavisd-new en Postgrey. Amavisd-new is een interface die door gebruik te maken van bijvoorbeeld ClamAV en/of SpamAssassin mail kan scannen op virussen dan wel spam. Postgrey is greylistingsoftware.

Postfixadmin

We beginnen met het installeren van de benodigde packages, waaronder Postfixadmin:

apt-get install postfixadmin postfix-mysql dovecot-imapd dovecot-mysql amavisd-new clamav-daemon clamav-unofficial-sigs postgrey

Selecteer bij de configuratie van Postfix “No configuration”, dit doen we namelijk straks zelf. Laat dbconfig-common de database voor Postfixadmin configureren. Onthoudt uiteraard het wachtwoord dat je instelt. Kies ook de webserver waarvoor Postfixadmin ingesteld moet worden. Waarschijnlijk zul je apache2 gebruiken.

Als Postfixadmin geïnstalleerd is, ga je naar http://server/postfixadmin/setup.php. Daar kun je een setup-password aanmaken. Als je die hebt aangemaakt, moet je hem in de configuratie van Postfixadmin zetten. Bewerk /etc/postfixadmin/config.inc.php en zet het wachtwoord erin (je kunt de lijn $CONF['setup_password'] = aanpassen). Zoek ook de config file door en vervang overal waar change-this-to-your.domain.tld staat door je eigen domein.

Hierna kun je een superadmin-account aanmaken op Postfixadmin en je mailboxen, domeinen en aliassen toevoegen.

Postfix

Eerst maken we een nieuwe user en group aan voor het afhandelen van de mail:

sudo groupadd -g 2000 vmail
sudo useradd -d /home/vmail -m -u 2000 -g 2000 vmail

Het grootste deel van de configuratie van Postfix staat in /etc/postfix/main.cf. De volgende stukjes moeten onder elkaar komen te staan, maar ik zal af en toe een toelichting geven.

smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no
# appending .domain is the MUA's job.
append_dot_mydomain = no
# Uncomment the next line to generate "delayed mail" warnings
#delay_warning_time = 4h
myhostname = host.example.com
myorigin = host.example.com
mydestination = $myhostname, localhost, localhost.localdomain, localhost.$myhostname
#relayhost = smtp.ziggo.nl
#relayhost = smarthost.direct-adsl.nl
#relayhost = smtp.upcmail.nl
mynetworks = 127.0.0.0/8
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
inet_protocols = ipv4
#inet_protocols = ipv4, ipv6
#smtp_bind_address6 =
# TLS parameters
smtpd_use_tls=yes
smtpd_tls_cert_file = /etc/ssl/certs/mail-cert.pem
smtpd_tls_key_file = /etc/ssl/private/mail-key.pem
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

Dit is in feite de basic configuration. Verander host.example.com naar jouw FQDN. Als de server in kwestie thuis staat, zul je meestal de smarthost van je ISP moeten gebruiken, omdat poort 25 uitgaand dicht staat. De smarthosts van respectievelijk Ziggo, KPN en UPC staan hier al ingevuld, en hoef je dus alleen te uncommenten. Kijk voor smarthosts van andere ISPs op hun site. Meestal is de smarthost gelijk aan de 'normale' SMTP-server van die ISP, maar niet altijd.

Als je IPv6 wilt gebruiken, kun je de 2 regels daarvoor uncommenten. Haal dan de eerste regel met enkel IPv4 weg en vul je IPv6-adres in.

De certificaten voor SSL/TLS zullen we straks nog aanmaken.

# Virtual mailbox settings
virtual_uid_maps = static:2000
virtual_gid_maps = static:2000
virtual_minimum_uid = 2000
virtual_mailbox_base = /srv/mail
virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_mailbox_domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf, mysql:/etc/postfix/mysql_virtual_mailbox_domainaliases_maps.cf
virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf, mysql:/etc/postfix/mysql_virtual_alias_domainaliases_maps.cf
relay_domains = mysql:/etc/postfix/mysql_relay_domains.cf
virtual_transport = dovecot
dovecot_destination_recipient_limit = 1
# Use amavis for virus and spam scanning
content_filter = amavis:[127.0.0.1]:10024
# SASL Authentication
smtpd_sasl_auth_enable = yes
smtpd_sasl_exceptions_networks = $mynetworks
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth

Dit is de configuratie voor de virtual mailboxes, die Postfix uit de MySQL-database plukt. Hiervoor kijkt hij in de bovengenoemde configfiles, waarin een query staat. Die files zullen we zo nog aanmaken.

De UIDs en GIDs (2000) corresponderen met vmail:vmail.

Het stukje eronder is voor de authenticatie.

# Waste spammers time before rejecting them
smtpd_delay_reject = yes
disable_vrfy_command = yes
# Reject known spammers
smtpd_client_restrictions = reject_rbl_client sbl.spamhaus.org,
  reject_rbl_client blackholes.easynet.nl,
  reject_rbl_client dnsbl.njabl.org
# Require proper helo at connections
smtpd_helo_required = yes
smtpd_helo_restrictions =
  permit_mynetworks,
  reject_non_fqdn_helo_hostname,
  reject_invalid_helo_hostname,
  permit
               
smtpd_sender_restrictions =
  permit_mynetworks,
  permit_sasl_authenticated,
  reject_non_fqdn_sender,
  reject_unauth_pipelining,
  permit
smtpd_recipient_restrictions =
  permit_mynetworks,
  permit_sasl_authenticated,
  reject_unauth_pipelining,
  reject_non_fqdn_recipient,
  reject_unknown_recipient_domain,
  reject_unlisted_recipient,
  reject_unauth_destination,
  check_policy_service inet:127.0.0.1:10023,
  permit
smtpd_data_restrictions = reject_unauth_pipelining

Dit laatste stuk zijn in feite de securityopties. Ik wil hier niet te diep op ingaan, maar wat het doet is:

  • Mailservers die in een anti-spamdatabase staan afwijzen
  • Mailservers die slecht geconfigureerd zijn (geen FQDN bijvoorbeeld) afwijzen
  • Alleen mails toelaten die OF van geauthentiseerde users komen (jijzelf dus), OF gericht zijn aan geauthentiseerde users op deze mailserver. Dit zorgt ervoor dat de mailserver geen “open relay” is waar iedereen maar van gebruik kan maken.
  • Greylisting met Postgrey (daar is de lijn check_policy_service inet:127.0.0.1:10023 voor)

Op deze manier houdt je al een hoop spam tegen.

Maak nu in /etc/postfix de volgende files aan, en zet je wachtwoord goed:

/etc/postfix/mysql_virtual_mailbox_domains.cf

hosts = 127.0.0.1
user = postfixadmin
password =
dbname = postfixadmin
query = SELECT domain FROM domain WHERE domain='%s' and backupmx = 0 and active = 1

/etc/postfix/mysql_virtual_mailbox_maps.cf

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

/etc/postfix/mysql_virtual_alias_maps.cf

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

/etc/postfix/mysql_relay_domains.cf

hosts = 127.0.0.1
user = postfixadmin
password =
dbname = postfixadmin
query = SELECT domain FROM domain WHERE domain='%s' and backupmx = 1

/etc/postfix/mysql_virtual_alias_domainaliases_maps.cf

hosts = 127.0.0.1
user = postfixadmin
password = 
dbname = postfixadmin
query = SELECT goto FROM alias,alias_domain
  WHERE alias_domain.alias_domain = '%d'
  AND alias.address=concat('%u', '@', alias_domain.target_domain)
  AND alias.active = 1

/etc/postfix/mysql_virtual_mailbox_domainaliases_maps.cf

hosts = 127.0.0.1
user = postfixadmin
password =
dbname = postfixadmin
query = SELECT maildir FROM mailbox, alias_domain
  WHERE alias_domain.alias_domain = '%d'
  AND mailbox.username=concat('%u', '@', alias_domain.target_domain )
  AND mailbox.active = 1

/etc/postfix/sasl/smtpd.conf

pwcheck_method: saslauthd
mech_list: PLAIN LOGIN
auxprop_plugin: rimap

Als allerlaatst moeten we master.cf aanpassen. Voeg dit onderaan toe:

#
# 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=20
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_delay_reject=no
       -o smtpd_client_restrictions=permit_mynetworks,reject
       -o smtpd_helo_restrictions=
       -o smtpd_sender_restrictions=
       -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
dovecot     unix   -       n      n       -       -   pipe
       flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/dovecot-lda -d $(recipient)

Uncomment ook de line die begint met “submission” om Postfix te laten luisteren op poort 587.

Voeg de user postfix toe aan de group sasl:

adduser postfix sasl

Dovecot

De configuratie van Dovecot is verspreid over meerdere config files in /etc/dovecot/conf.d/ .

Open om te beginnen /etc/dovecot/conf.d/auth-sql.conf.ext en uncomment de opties zodat er het volgende komt te staan:

# Authentication for SQL users. Included from auth.conf.
#
# <doc/wiki/AuthDatabase.SQL.txt>
passdb {
driver = sql
# Path for SQL configuration file, see example-config/dovecot-sql.conf.ext
args = /etc/dovecot/dovecot-sql.conf.ext
}
# "prefetch" user database means that the passdb already provided the
# needed information and there's no need to do a separate userdb lookup.
# <doc/wiki/UserDatabase.Prefetch.txt>
#userdb {
# driver = prefetch
#}
userdb {
driver = sql
args = /etc/dovecot/dovecot-sql.conf.ext
}
# If you don't have any user-specific settings, you can avoid the user_query
# by using userdb static instead of userdb sql, for example:
# <doc/wiki/UserDatabase.Static.txt>
#userdb {
# driver = static
# args = uid=vmail gid=vmail home=/srv/mail/%u
#}

Zoals je ziet verwijst deze config file naar een andere, namelijk /etc/dovecot/dovecot-sql.conf.ext:

driver = mysql
connect = host=127.0.0.1 dbname=postfixadmin user=postfixadmin password=
default_pass_scheme = MD5-CRYPT
password_query = \
SELECT password FROM mailbox WHERE username = '%u' AND active = '1'
user_query = \
SELECT '/srv/mail/%u' as home, 'maildir:/srv/mail/%u' as mail, \
2000 AS uid, 2000 AS gid, concat('dirsize:storage=', quota) AS quota \
FROM mailbox WHERE username = '%u' AND active = '1'

Als het goed is staan de beginnetjes van de meeste stukken er al in en hoef je ze alleen te uncommenten. Zet ook je MySQL-wachtwoord goed!

In /etc/dovecot/conf.d/10-auth.conf moeten we drie regels uncommenten, namelijk

disable_plaintext_auth = yes
auth_mechanisms = plain login
!include auth-sql.conf.ext

Ook in /etc/dovecot/conf.d/10-mail.conf moeten we enkele dingen goed zetten.

mail_location = maildir:/srv/mail/%u
mail_uid = vmail
mail_gid = vmail
first_valid_uid = 2000
last_valid_uid = 2000

En voor SSL/TLS passen we /etc/dovecot/conf.d/10-ssl.conf aan:

ssl = yes
ssl_cert = ‹/etc/ssl/certs/mail-cert.pem
ssl_key = ‹/etc/ssl/private/mail-key.pem

In /etc/dovecot/conf.d/10-master.conf geven we aan de Postfix de mail aflevert aan Dovecot.

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
   group = postfix      
}

Zorg ervoor dat de permissies goed staan:

# chown -R vmail:dovecot /etc/dovecot
# chmod -R o-rwx /etc/dovecot

Amavisd-new

Eerst moeten we Amavisd-new en ClamAV in elkaars groups toevoegen.

adduser clamav amavis
adduser amavis clamav

Open daarna /etc/amavis/conf.d/15-content_filter_mode en uncomment het antivirus-gedeelte:

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

SSL/TLS

In de configuraties van Postfix en Dovecot hebben we al de onderdelen voor SSL/TLS opgenomen, maar we hebben de (self-signed) certificaten zelf nog niet aangemaakt. Dat gaan we nu doen:

# cd /etc/ssl/private/
# openssl genrsa 1024 > mail-key.pem
# chmod 400 mail-key.pem
# openssl req -new -x509 -nodes -sha1 -days 365 -key mail-key.pem > ../certs/mail-cert.pem

Hierbij vraagt OpenSSL om wat gegevens. Je moet ten minste de "Common Name" goed instellen: Dit is je FQDN!

Roundcube

Als je wilt, kun je RoundCube, een webmail, installeren:

apt-get install roundcube-mysql roundcube-plugins

Uncomment in /etc/apache2/conf.d/roundcube bovenaan de pagina de twee aliasen. Daarna is RoundCube bereikbaar op http://server/roundcube.

In /var/lib/roundcube/config/main.inc.phpis nog een klein beetje configuratiewerk nodig: Je moet onder andere de standaard server (localhost) en usernames (%u) goedzetten. Maar dat wijst redelijk zichzelf wegens de goede documentatie in het bestand zelf.

Tot slot

Nu is het tijd om het hele zooitje te restarten.

# service postfix restart
# service dovecot restart
# service clamav-daemon restart
# service amavis restart
# service postgrey restart

Als het goed is zou alles nu moeten werken! Je kunt met een MUA (Mail User Agent) als Thunderbird verbinden met de mailserver. Gebruik in alle gevallen STARTTLS. Omdat de SSL/TLS-certificaten self-signed zijn, krijg je een waarschuwing. Deze hoef je een enkele keer te accepteren.

Werkt het niet? Kijk dan goed in /var/log/mail.log.