HowTo: Mailserver mit Postfix, Dovecot, Spamassassin und Spamass-Milter (Debian 5,6,7)

Ein Mailserver ist so eine Sache für sich, zuerst stellt sich die Frage, brauche ich ihn wirklich? Kann ich meinen E-Mail Verkehr nicht über andere Anbieter regeln? …Das funktuniert mittlerweile auch schon mit der eigenen Domain ohne eigenen MTA (Mail Transfer Agent). Habe ich genug Zeit und Lust diesen zu administrieren? Denn sollte in den Konfigurationsdatein ein einziger Fehler schlummern, kann das ein offenes Scheunentor für den kompletten Root bedeuten.

 

Nun gut sind diese Fragen geklärt können wir schon fast anfangen, dazu ist nur noch zu sagen das auf einem normalen MTA täglich Hunderte bis Millionen Anfragen einströmen die wir garnicht haben wollen (SPAM, Bruteforce, DDOS, etc). Es ist kein Problem diese abzublocken, was auch dringend nötig ist, jedoch benötigt man auch einen leistungsstarken Server um den eigenen Mailverkehr zu handeln und dabei auch noch einen Puffer für ungewünschte Anfragen zu haben, sprich meiner Meinung nach zahlt sich für alle Systeme unter 512Mb Ram kein Mailserver aus.

ABSOLUTELY NO WARRANTY – aufgrunde des großen Sprungs von Dovecot auf 2.2.10 nur noch auf Squeeze und Lenny -> statt service, invoke-rc.d

DNS:

Damit der MTA überhaupt erreicht werden kann benötigen wir einen MX- und einen PTR-Eintrag (Reverse DNS). Für jeden MX-Record muss es auch einen gültigen A-Record geben der auf den Mailserver zeigt. Den PTR setzt man meistens im Controllpanel eures Servers.

Postfix:

Zunächst installieren wir Postfix mit:

# apt-get install postfix

Während der Installation werden wir gefragt wofür wir den MTA einsetzten wollen, da unser Mailserver direkt am Internet angeschlossen ist und direkt mit anderen MTA’s kommunizieren soll wählen wir “Internet-Site” aus. Zusätzlich sollen wir den Hostnamen bestimmen, der in unserem Fall dem MX-Record entspricht. z.B: mail.example.com oder mx0.example.com

Nun kommen wir zur Config von Postfix in /etc/postfix/main.cf:

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


# Debian specific: Specifying a file name will cause the first
# line of that file to be used as the name. The Debian default
# is /etc/mailname.
#myorigin = /etc/mailname


smtpd_banner = $myhostname ESMTP
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


readme_directory = no
#Sasl
smtpd_sasl_auth_enable = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain = $mydomain

# TLS parameters
smtpd_use_tls=yes
smtpd_tls_security_level = may
smtpd_tls_auth_only = no
smtpd_tls_cert_file=/etc/ssl/certs/SSL-CERT
smtpd_tls_key_file=/etc/ssl/private/SSL-KEY
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtpd_tls_received_header = yes
tls_random_source = dev:/dev/urandom
smtpd_require_helo = yes
smtpd_client_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_rbl_client sbl-xbl.spamhaus.org
smtpd_sender_restrictions = permit_mynetworks, reject_unknown_address, reject_unknown_sender_domain, reject_non_fqdn_sender
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
smtpd_recipient_limit = 250
broken_sasl_auth_clients = yes


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


myhostname = mail.example.com
mydomain = example.com
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = $mydomain
mydestination = localhost, mail.example.com
relayhost =
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all


#Virtual Mailboxes
virtual_mailbox_domains = /etc/postfix/virtual_domains
virtual_mailbox_base = /var/mail/vhosts
virtual_mailbox_maps = hash:/etc/postfix/vmailbox
virtual_alias_maps = hash:/etc/postfix/virtual_alias
virtual_minimum_uid = 100
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
virtual_transport = dovecot
dovecot_destination_recipient_limit = 1
mailbox_size_limit = 0


#Spam Schutz
smtpd_milters = unix:/spamass/spamass.sock
milter_connect_macros = j {daemon_name} v {if_name} _
milter_default_action = tempfail

Die Rot markierten Stellen müssen unbedingt angepasst werden. Zusätzlich benötigt ihr ein gültiges SSL-Zertifikat und den Key. Alle anderen Einstellungen können in der Postfix Documentation nachgelesen werden.

Virtuelle Mailboxen:

Befehle abarbeiten.

# groupadd -g 5000 vmail
# useradd -s /usr/sbin/nologin -u 5000 -g 5000 vmail
# mkdir -p /var/mail/vhosts/example.com
# chown -R vmail:vmail /var/mail/vhosts

# touch /etc/postfix/virtual_alias
# touch /etc/postfix/virtual_domains
# touch /etc/postfix/vmailbox
# postmap /etc/postfix/virtual_alias
# postmap /etc/postfix/vmailbox
# usermod -aG vmail postfix

VMailbox: Emailadressen mit dem Speicherort
Virtual_Alias: Weiterleitung
Virtual_domains: Domains für die der Mailserver zuständig ist

Dovecot:

apt-get install dovecot-imapd dovecot-pop3d

In der /etc/dovecot/dovecot.conf müssen wir auch einige Änderungen vornehmen. (Das ist eine stark gekürzte Version der Config-Datei – kann aber komplett übernommen werden. Sprich alte löschen&copy&paste)

protocols = imap imaps pop3 pop3s
disable_plaintext_auth = no
log_path = /var/log/dovecot
log_timestamp = "%Y-%m-%d %H:%M:%S "
ssl = yes
ssl_cert_file = /etc/ssl/certs/SSL-Cert
ssl_key_file = /etc/ssl/private/SSL-Key
mail_location = maildir:/var/mail/vhosts/%d/%n
mail_privileged_group = mail
protocol imap {
}
protocol pop3 {
pop3_uidl_format = %08Xu%08Xv
}
protocol managesieve {
}
protocol lda {
hostname = example.com
postmaster_address = postmaster@example.com
auth_socket_path = /var/run/dovecot/auth-master
mail_plugin_dir = /usr/lib/dovecot/modules/lda
mail_plugins = sieve
sieve_extensions = +imapflags
}
auth_verbose = yes
auth default {
mechanisms = plain login
userdb passwd-file {
args = /var/mail/vhosts/%d/passwd
}
passdb passwd-file {
args = /var/mail/vhosts/%d/shadow
}
socket listen {
client {
path = /var/spool/postfix/private/auth
mode = 0660
user = postfix
group = vmail
}
master {
path = /var/run/dovecot/auth-master
mode = 0600
user = vmail
group = vmail
}
}
}
dict {
#quota = mysql:/etc/dovecot/dovecot-dict-quota.conf
#expire = db:/var/lib/dovecot/expire.db
}
plugin {
}

Dovecot-Log
# touch /var/log/dovecot
# chgrp vmail /var/log/dovecot
# chmod 660 /var/log/dovecot

…lustigerweiße verweigert der komplette Mailserver seinen Dienst wenn Dovecot keinen Ort zum loggen hat^^

 

Für die Übergabe der Mails zwischen den zwei Diensten Postfix und Dovecot müssen wir noch zwei Zeilen an die /etc/postfix/master.cf anhängen.

dovecot   unix  -       n       n       -       -       pipe
flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -f ${sender} -d ${recipient}

Spamassassin – Spamass-Milter

apt-get install spamass-milter

# groupadd spamd
# useradd -g spamd -s /bin/false -d /var/lib/spamassassin spamd
# mkdir /var/lib/spamassassin
# chown spamd.spamd /var/lib/spamassassin -R
# mkdir /var/run/spamassassin
# usermod -a -G spamd spamass-milter

In /etc/default/spamassassin

ENABLED=1
CRON=1
SAHOME="/var/lib/spamassassin"
OPTIONS="--username spamd --nouser-config --max-children 2 --helper-home-dir ${SAHOME} --socketpath=/var/run/spamassassin/spamd.sock --socketowner=spamd --socketgroup=spamd --socketmode=0660"
PIDFILE="/var/run/spamassassin/spamd.pid"

In /etc/default/spamass-milter

OPTIONS="-u spamass-milter -m -I -i 127.0.0.1 -- --socket=/var/run/spamassassin/spamd.sock"

Und zum schluss noch das Addmailuser-Script

In /usr/local/bin/addmailuser

#!/bin/bash
#
# Script to add users for
# Dovecot/PostFix using Virtual Users

USAGE="Usage: $0 EMAIL [PASSWORD] [BASEDIR]";

if [ ! -n "$1" ]
then
echo $USAGE;
exit 1;
fi

USERNAME=$(echo "$1" | cut -f1 -d@);
DOMAIN=$(echo "$1" | cut -f2 -d@);
ADDRESS=$1;

MAILBOXMAP=$(postconf | grep ^virtual_mailbox_maps | cut -f3 -d' ' | cut -f2 -d:)

if [ -f $MAILBOXMAP ]
then
echo mailbox file exist, checking existing mailboxes
COUNT=$(grep $ADDRESS $MAILBOXMAP | wc -l)
if [ ! $COUNT -eq 0 ]
then
echo Email already exist... breaking!
exit 2;
fi
fi


if [ ! -n "$2" ]
then
echo "Password is not set... creating new one";
PASSWD=$(cat /dev/urandom | tr -dc [:alnum:] | head -c8);
echo -e "email is $ADDRESS, password is set to $PASSWD"
else
PASSWD=$2;
fi

if [ -n "$3" ]
then
if [ ! -d "$3" ]
then
echo $USAGE;
echo "BASEDIR must be a valid directory!";
echo "I would have tried, $(postconf | grep ^virtual_mailbox_base | cut -f3 -d' ')";
exit 2;
else
BASEDIR="$3";
fi
else
BASEDIR="$(postconf | grep ^virtual_mailbox_base | cut -f3 -d' ')";
fi

echo "Adding Postfix user configuration..."
echo -e "$ADDRESSt$DOMAIN/$USERNAME/" >> $MAILBOXMAP
postmap $MAILBOXMAP


if [ $? -eq 0 ]
then


if [ ! -d /$BASEDIR/$DOMAIN/ ]
then
echo domain directory does not exist. creating new one
mkdir -p $BASEDIR/$DOMAIN/
chown -R vmail:vmail $BASEDIR/$DOMAIN/
fi


echo "Adding Dovecot user configuration..."
echo $ADDRESS::5000:5000::$BASEDIR/$DOMAIN/$USERNAME >> $BASEDIR/$DOMAIN/passwd
echo $ADDRESS":"$(dovecotpw -p $PASSWD) >> $BASEDIR/$DOMAIN/shadow
chown root:root $BASEDIR/$DOMAIN/passwd && chmod 600 $BASEDIR/$DOMAIN/passwd
chown root:root $BASEDIR/$DOMAIN/shadow && chmod 600 $BASEDIR/$DOMAIN/shadow
/etc/init.d/postfix reload
fi

# chmod a+x /usr/local/bin/addmailuser

Zum hinzufügen von Email-Konten:

# addmailuser user@domain.tld PASSWORD

Und das wars auch schon wieder. Jetzt gehts ans Testen. Sollten noch Fehler auftauchen einfach mal in die /var/log/mail.log oder /var/log/dovecot.log schauen.

Quellen:
http://serversupportforum.de/forum/faqs-anleitungen/41035-howto-web-und-mailserver-mit-debian-lenny.html
http://www.asconix.com/howtos/debian/postfix-dovecot-mailserver-debian-howto
~Alex

10 thoughts on “HowTo: Mailserver mit Postfix, Dovecot, Spamassassin und Spamass-Milter (Debian 5,6,7)

  1. Sehr nettes Tutorial, die Frage die sich mir noch stellt könnte man das auch mit postfixadmin machen ? wie kann man dann das user passwort ändern ?

    • User passwort ändern geht ganz einfach in den Mailboxen (/var/vmail/domain/shadow oder passwd – gerade unterwegs und nicht sicher) allerdings stehen die Passwörter da nicht im Klartext und müssen genauso verschlüsselt ersetzt werden. Einfacher geht das mit postfixadmin da haben Sie recht. Ein Tutorial dazu kann ich in den nächsten Tagen hochstellen.

      Liebe Grüße,
      Alexander Krischan

        • Eine Frage hätte ich noch, ich habe ein mx record für die hauptdomain angelegt, muss die subdomain. mail.domain.com als a record oder cname eingetragen werden ?

          • Naja die Configuration weicht schon stark von dieser ab. Die User werden dann über eine Datenbank gespeichert – das ganze verbraucht dann aber auch logischerweise mehr RAM.

            Für jeden MX-Record muss es einen A-Record geben der auf den Mailserver weißt. Sprich Ihre Domain example.com kann auch auf einen ganz anderen Server zeigen, als der A-Record für den Mailserver.

            e.g.:
            example.com -> A-Record auf 1.1.1.1=Webserver
            example.com -> MX-Record auf mail.example.com
            mail.example.com -> A-Record auf 2.2.2.2=Mailserver

          • Könnten sie dann den link zu ihrem Tutorial dann hier posten ?
            Bin nämlich schon Lang auf der Suche nach einem Mail Server?
            Wird dann mit einer Mysql Datenbank laufen oder ?

          • Das Tutorial dazu werde ich natürlich auf diesem Blog veröffentlichen, vielleicht schreib ich auch noch ein Script dazu ( mit dem würde ich aber erste Mitte Februar rechnen – derzeit viel zu tun^^ ) Sollte Ihre E-Mail Adresse korrekt sein kann ich Ihnen einige Links zu diesem Thema schicken. Diese Tutorials kann man aber größtenteil nicht mehr 1 zu 1 übernehmen. Welches OS möchten Sie verwenden?

            Liebe Grüße,
            Alexander Krischan

Leave a Reply

Your email address will not be published. Required fields are marked *