How-To: Linux Mailserver

Mail

Mailserver, wie wäre das? Als freiberuflicher Webdesigner ist der e-Mailverkehr eine wichtige Komponente im Day-to-Day Business. Ich möchte mit meinen Kunden zeitnah kommunizieren und auf Anfragen reagieren können. Dies macht den Einsatz von E-Mails erforderlich. Gerade auch im Fernstudium bekomme ich meine Noten, Hinweise über neue Antworten in diversen Foren, oder gar die Korrespondenz mit den Professoren per E-Mail.

Bisher habe ich meine eigenen Postfächer über die gebuchten Webhosting-Pakete eines Webhosting-Providers realisiert. Dies war insbesondere mit zusätzlichen Kosten verbunden und hatte zumeist einen restriktiven Charakter. Ich konnte so die Spamfilterung zumeist nur clientseitig realisieren, da mein Anbieter mir hierzu nur einen eingeschränkten Funktionsumfang bot – nämlich lediglich dem Blacklisting von E-Mail-Adressen. Da viele Spam-Versende den gleichen Inhalt mit unterschiedlichen E-Mail-Adressen versenden, hat mich dieser Umstand mehr und mehr dazu ermutigt, mich mit dem Thema „Mailserver“ auseinander zusetzen.

Wie ich meinen ersten Mailserver auf einem eigenen Virtual Private Server realisiere möchte ich in dem nun folgenden Tutorial kurz erläutern.

1. Voraussetzungen

  • Ein eigener (V)Server mit einer statischen IP-Adresse
  • eine eigene Domain
  • ein wenig Linux-Kenntnisse
  • meine Anleitung 😉

2. Variablen

Zum Verständnis hier eine Übersicht der exemplarischen Daten, die ich in diesem Tutorial genutzt habe. Diese sind mit euren Daten zu ersetzen.

[su_table]

Server-IP 100.200.300.400
Domain domain.tld
Admin E-Mail admin@domain.tld
 Postfix Datenbank  postfix
 Postfix Datenbankuser  postfix
 Postfix Datenbankpasswort  changeme

[/su_table]

2. Vorbereitung

2.1 Update & Upgrade

Wir gehen davon aus, dass wir einen blanken VServer mit Debian 8 im Einsatz haben. Das Tutorial ist natürlich auf jedes andere Linuxderivat übertragbar.

Zunächst einmal ist das System auf den aktuellen Paketlisten- und Softwarestand mittels update und upgrade zu bringen. Dazu verbindet Ihr euch per SSH als root auf dem entsprechenden Zielsystem einloggen. Ich nutze hierzu putty.

apt-get update
apt-get upgrade

2.2 SSH und Root-Login

Ich arbeite nicht gerne mit root und möchte auch nicht, dass ein SSH-Log-In als root möglich ist. Deshalb konfiguriere ich meinen VServer zunächst einmal um. Ich verbiete den SSH-Login als root und setze den SSH Port um. Dieser Punkt ist optional und für den weiteren Verlauf nicht zwingend erforderlich.

Bevor wir den Login verbieten, sollten wir natürlich einen Nutzer haben, mit dem wir uns verbinden können:

adduser derfernstudent

Adding user `derfernstudent' ...
Adding new group `derfernstudent' (1000) ...
Adding new user `derfernstudent' (1000) with group `derfernstudent' ...
Creating home directory `/home/derfernstudent' ...
Copying files from `/etc/skel' ...
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Changing the user information for asmedia
Enter the new value, or press ENTER for the default
        Full Name []:
        Room Number []:
        Work Phone []:
        Home Phone []:
        Other []:
Is the information correct? [Y/n] Y

Danach solltet ihr die SSH-Session einmal schließen und euch als euer Nutzer anmelden. Hat das geklappt, könnt ihr die SSH-Konfiguration per sudo oder als root anpassen:

nano /etc/ssh/sshd_config

und dort den Root-Login verbieten sowie den SSH-Port ändern:

# What ports, IPs and protocols we listen for
Port 13022 #irgendein anderer Port

# Authentication:
LoginGraceTime 120
PermitRootLogin no

und anschließend einmal den ssh-Dienst neustarten und danach probieren, als root einzuloggen.

/etc/init.d/ssh restart

2.3 fail2ban

Um den Server gegen unerlaubten Zugriff weiter zu sichern, zum Beispiel vor Brute Force Attacken, nutze ich die Software „fail2ban“. Hierdurch ist es möglich, dass SSH-Verbindungsversuche blockiert werden, die in kurzer Abfolge erfolglos sind. Probiert jemand sich zum Beispiel mit root oder einer anderen ID einzuloggen mit mehreren unterschiedlichen Passwörtern, so wird dieser nach x-Fehlversuchen für eine bestimmte Zeit gesperrt.

apt-get install fail2ban

2.4 apticron

Da ich mehrere Server im Einsatz habe, möchte ich über verfügbare Updates bequem per E-Mail informiert werden. Dies übernimmt apticron. Da wir ohnehin einen Mailserver installieren werden, wird es von unserem bisher nicht konfigurierten System dann auch möglich sein, E-Mails zu versenden. Wir installieren und konfigurieren anschließend.

apt-get install apticron
nano /etc/apticron/apticron.conf

EMAIL="admin@domain.tld"

2.5 Hostnamen

Wir müssen sicherstellen, dass unser System gut konfiguriert ist. Dazu zählt unter anderem, dass unser Server einen konfigurierten Hostnamen hat. Dies stellen wir unter /etc/hosts ein.

nano /etc/hosts

Ihr müsstet dort eine Zeile finden, die eurer eindeutigen IP entspricht und von eurem Hostnamen (eurer Domain) gefolgt wird – also in etwa so:

100.200.300.400  domain.tld domain

Das gleiche prüfen wir noch einmal für /etc/hostname . Dort muss dann analog folgendes enthalten sein

domain

Zum Checken könnt ihr folgendes verwenden:

hostname
hostname -f

Damit euer System auch synchron läuft (Zeit), installieren wir noch ntp.

apt-get install ntp ntpdate

3. Benötigte Komponenten

  1. Apache2
  2. PHP 5.6 (PHP 7 ist derzeit noch in Development; Stand Dezember 15)
    1. benötigte PHP-Module: libapache2-mod-php5, php5-imap
  3. MySQL
  4. phpMyAdmin
  5. PostfixAdmin
  6. Postfix
  7. Dovecot

4. Installation

4.1 Apache, MySQL und PHP

Der MySQL-Server und -Client wird über nachfolgende Befehle installiert. Für den root-User ist ein entsprechendes Passwort zu vergeben. Diese drei Module brauchen wir später noch.

apt-get install mysql-server mysql-client

Den Apache installiert ihr mit folgendem Befehl:

apt-get install apache2

Nun muss noch das entsprechende PHP-Paket und zwei Modules installiert werden, damit eine Kommunikation zwischen beiden Komponenten (Apache – PHP) gewährleistet ist. Anschließend empfehle ich den apache einmal durchzustarten und den Status abzufragen.

apt-get install php5 libapache2-mod-php5 php5-mysql
service apache2 restart

Das Ergebnis sieht dann wie folgt aus:

 apache2.service - LSB: Apache2 web server
   Loaded: loaded (/etc/init.d/apache2)
   Active: active (running) since Tue 2015-12-29 12:04:37 CET; 10s ago
  Process: 6175 ExecStop=/etc/init.d/apache2 stop (code=exited, status=0/SUCCESS)
  Process: 6199 ExecStart=/etc/init.d/apache2 start (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/apache2.service
           ├─6213 /usr/sbin/apache2 -k start
           ├─6216 /usr/sbin/apache2 -k start
           ├─6217 /usr/sbin/apache2 -k start
           ├─6218 /usr/sbin/apache2 -k start
           ├─6219 /usr/sbin/apache2 -k start
           └─6220 /usr/sbin/apache2 -k start

Dec 29 12:04:36 server systemd[1]: Starting LSB: Apache2 web server...
Dec 29 12:04:37 server apache2[6199]: Starting web server: apache2.
Dec 29 12:04:37 server systemd[1]: Started LSB: Apache2 web server.

4.2 phpMyAdmin

Nachdem ihr den Apache2 installiert habt, könnt ihr zur vereinfachten Konfiguration phpMyAdmin installieren. Dazu einfach in das www-Verzeichnis wechseln und phpMyAdmin herunterladen. Es macht Sinn, über die Internetseite von phpMyAdmin die aktuelle Version zu laden und dann auf den Server zu ziehen. Oder eben per wget direkt auf dem Server. Dieser Schritt ist optional. Durch phpMyAdmin habt ihr die Möglichkeit, eure Datenbanken komfortabel über eine Weboberfläche zu erstellen und zu bearbeiten. Natürlich kann man die nachfolgenden Schritte auch mit Boardmitteln und einfachen mysql-Befehlen realisieren. Ich nutze diesen Schritt um später meine Postfächer über eine Weboberfläche konfigurierbar zu machen.

cd /var/www/html/
wget https://files.phpmyadmin.net/phpMyAdmin/4.5.3.1/phpMyAdmin-4.5.3.1-all-languages.tar.gz --no-check-certificate
tar xvzf phpMyAdmin-4.5.3.1-all-languages.tar.gz
rm phpMyAdmin-4.5.3.1-all-languages.tar.gz
mv phpMyAdmin-4.5.3.1-all-languages phpmyadmin

4.3 PostfixAdmin

Wir haben nun alles vorbereitet, um unsere Verwaltungsoberfläche zu installieren . Wir wollen neben den Domains, Aliasen auch Mailboxen erstellen, konfigurieren, anpassen und löschen. Es bieten sich hier der PostfixAdmin und der VBox.Adm an. Ich habe mich in diesem Tutorial gegen den Newcomer und für den PostfixAdmin entschieden. Auch hier laden wir zunächste die Pakete herunter und entpacken diese entsprechend. Wir installieren die Verwaltungsoberfläche vor dem eigentlichen Postfix, da wir in diesem Schritt auch die Verwaltungsdatenbank samt Passwort erstellen, welches wir bei der Postfix-Konfiguration unter 4.4 noch benötigen.

cd /var/www/html/
wget http://downloads.sourceforge.net/project/postfixadmin/postfixadmin/postfixadmin-2.93/postfixadmin-2.93.tar.gz --no-check-certificate
tar xvfz postfixadmin-2.93.tar.gz
mv postfixadmin-2.93/ postfixadmin
cd postfixadmin

Ein kurzer Blick in das PostfixAdmin-Verzeichnis verrät, dass wir noch einige Konfiguration vornehmen müssen. Als erstes allerdings solltet ihr den Selbsttest machen, um zu prüfen, ob alle Komponenten auf eurem System vorhanden sind. Dazu im Browser einfach http:/domain.tld/postfixadmin/setup.php aufrufen.

Es sind folgende Dinge zu tun:

  • Please edit config.inc.php – change $CONF[‚configured‘] to true after setting your database settings

Die genauen Installationsinstruktionen entnehmen wir der INSTALL.TXT. Diese liegt auf dem Server oder kann auch über den Browser aufgerufen werden: http://domain.tld/postfixadmin> Read the INSTALL.txt file.

Über phpMyAdmin ist nun nachfolgender SQL-Befehl mit den entsprechenden Daten abzusetzen. Alternativ könnt ihr auch phpMyAdmin nutzen und über die Oberfläche einen Nutzer anlegen. Dies findet ihr in phpMyAdmin unter Benutzerkonten > Benutzer anlegen. Dort einfach einen Benutzer „postfix“ und gleich eine Datenbank mit der identischen Bezeichnung dazu.

CREATE DATABASE postfix;
  CREATE USER 'postfix'@'localhost' IDENTIFIED BY 'changeme';
  GRANT ALL PRIVILEGES ON `postfix` . * TO 'postfix'@'localhost';

Anschließend ist der PostfixAdmin zu konfigurieren. Dies geschieht wieder auf Kommandoebene. Ich nutze hierzu nano. Bitte beachtet, dass ihr im PostfixAdmin-Verzeichnis sein müsst.

nano config.local.php

Nun sind wir unserem Mailserver ein gutes Stück näher gekommen. Ein kurzer Blick in die setup.php im Browser verrät, dass noch zwei Schritte notwendig sind. Zum einen ist der Ordner templates_c zu berechtigen und zum anderen sollte das PHP-Imap Module nachinstalliert werden. Dies geschieht folgend:

chown -R www-data templates_c
apt-get install php5-imap
service apache2 restart

Damit die PostifxAdmin Datenbank eingerichtet wird, müsst ihr nun einmalig (nachdem alle fehlenden Komponenten installiert sind) aufrufen. Dazu wieder die http:/domain.tld/postfixadmin/setup.php aufrufen.

Folgende Ausgabe müsste entstehen:

[...]
updating to version 1050 (all databases)...   done
updating to version 1283 (all databases)...   done
updating to version 1284 (all databases)...   done
updating to version 1345 (MySQL)...   done
updating to version 1519 (all databases)...   done
updating to version 1610 (all databases)...   done
updating to version 1685 (MySQL)...   done
updating to version 1761 (MySQL)...   done
updating to version 1762 (all databases)...   done
updating to version 1763 (MySQL)...   done
updating to version 1767 (all databases)...   done
updating to version 1795 (MySQL)...   done

Anschließend ist über das Passwortfeld ein Passwort einzusetzen und über „GenerateHash“ ein Hash zu generieren, den ihr dann in die config-Datei schreiben müsst. Ihr müsst den Hash aus eurer setup.php nehmen! Dadurch stellt ihr sicher, dass nur derjenige einen Admin einrichten kann, der auch Zugriff auf den Server hat. Deshalb müsst ihr den Hash, bzw. die ganze Zeitle in der config.inc.php anpassen.

$CONF['setup_password'] = '3399ea41346baf01da0ed77e91ac031a:e969db5501d8448e80d1b83fe34ef50ce6558626';

Jetzt habt ihr die Möglichkeit einen Admin einzurichten. Dazu http:/domain.tld/postfixadmin/setup.php aufrufen und das Setup-Passwort, die Admin-E-Mail sowie ein neues Login-Passwort vergeben.

Ihr könnt euch nun für euren Mailserver im Postfixadmin über euren Browser (http:/domain.tld/postfixadmin) einloggen.

 4.4 Postfix

Damit wir mit unserem Server E-Mails auchverschicken können, müssen wir einen MTA, den sogenannten Mail Transfer Agent, installieren. Der Klassiker ist „sendmail“. Dieser ist in der Handhabung aber relativ komplex, weshalb ich den gebräuchlichen Postifx nutze. Mit dem reinen Installieren reicht es im Spam-Zeitalter leider nicht. Aber von Anfang an – die Installation:

apt-get install postfix postfix-mysql

Wir müssen uns nun entscheiden, um was für einen Server es sich bei uns handelt:

Please select the mail server configuration type that best meets your needs.

 No configuration:
  Should be chosen to leave the current configuration unchanged.
 Internet site:
  Mail is sent and received directly using SMTP.
 Internet with smarthost:
  Mail is received directly using SMTP or by running a utility such
  as fetchmail. Outgoing mail is sent using a smarthost.
 Satellite system:
  All mail is sent to another machine, called a 'smarthost', for delivery.
 Local only:
  The only delivered mail is the mail for local users. There is no network.

  1. No configuration  2. Internet Site  3. Internet with smarthost  4. Satellite system  5. Local only

General type of mail configuration:

Das ist wie folgt zu unterscheiden:

2. Internet Site Standardkonfiguration für das Empfangen und Versenden von E-Mails Unsere Wahl, feste IP, z.B. ein Virtual Private Server
3. Internet mit Smarthost“ Analog zu 2. Internet Site; die E-Mail wird nicht direkt an den entfernten Server versandt, sondern über einen anderen Server geleitet. Dies ist insbesondere empfehlenswert, wenn mit mit dynamischer IP-Adresse gearbeitet wird. Diese Option sollte nicht gewählt werden
4. Satellite System“ Es kann keine E-Mail empfangen werden; alle E-Mails werden über Smarthost verschickt Eignet sich für Admin / Monitoring Rechner
„Local only“ E-Mail wird nur lokal versand und empfangen Eignet sich nur für in sich geschlossene System

Anschließend ist der FQDN (fully qualified domain name) einzugeben. Dies ist insbesondere für System-E-Mails wichtig. Der nächste Punkt gibt an, an welchen Admin System-E-Mails weitergleitet werden sollen. Gebt hier eure E-Mail-Adresse an.

Root and postmaster mail recipient: 

Sollte das setup damit abgeschlossen sein, empfehle ich mittels

dpkg-reconfigure postfix

die Konfiguration noch einmal vorzunehmen. Hierdurch habt ihr die Möglichkeit weitere Einstellungen vorzunehmen.

Root and postmaster mail recipient: admin@domain.tld
Other destinations to accept mail for (blank for none): localhost, localhost.localdomain, domain.tld
Force synchronous updates on mail queue? N
Local networks: 127.0.0.0/8
Mailbox size limit (bytes): 0
Internet protocols to use: 1

Damit euer Postfix nicht zur Spamschleuder wird, sollten die vorherigen Punkte mit Vorsicht eingestellt werden. Einmal falsch eingestellt können auch andere Systeme euren Server als Mailserver nutzen.

Da wir unsere E-Mails verschlüsselt übertragen wollen, das sogenannte TLS nutzen wollen, müssen wir noch ein selbstsigniertes SSL-Zertifikat generieren. Dazu brauchen wir einen privaten Schlüssel (mailserver.key) und ein Zertifikat (mailserver.crt). Manche Mailprogramme verweigern selbstsignierte Zertifikate, oft habt ihr aber die Möglichkeit diesen „unbekannten Zertifikaten“ zu vertrauen.

cd /etc/postfix
mkdir ssl
cd ssl
openssl req -new -newkey rsa:3072 -nodes -keyout mailserver.key -days 730 -x509 -out mailserver.crt

Nachfolgend dann die abgefragten Werte entsprechend eures Systems eintragen:

-----
Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:domain.tld
Email Address []:admin@domain.tld

Damit TLS auch aktiv wird, müssen wir dies in der PostfixMainkonfiguration noch eintragen. Wir gehen also mit nano in die main.cf und ändern wir folgt:

nano /etc/postfix/main.cf
# TLS parameters
smtpd_tls_cert_file=/etc/postfix/ssl/mailserver.crt
smtpd_tls_key_file=/etc/postfix/ssl/mailserver.key
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtp_tls_note_starttls_offer = yes
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 3600s
tls_random_source = dev:/dev/urandom
tls_random_prng_update_period = 3600s

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

smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
myhostname = domain.tld

# a bit more spam protection
disable_vrfy_command = yes


# Auth
smtpd_sasl_type=dovecot
smtpd_sasl_path=private/auth_dovecot
smtpd_sasl_auth_enable = yes
smtpd_sasl_authenticated_header = yes
broken_sasl_auth_clients = yes

proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $smtpd_sender_login_maps

smtpd_sender_login_maps = proxy:mysql:/etc/postfix/mysql-sender-login-maps.cf

smtpd_sender_restrictions = reject_authenticated_sender_login_mismatch
        reject_unknown_sender_domain

smtpd_recipient_restrictions = permit_sasl_authenticated
        permit_mynetworks
        reject_unauth_destination


# Virtual mailboxes
virtual_alias_maps = proxy:mysql:/etc/postfix/mysql-virtual-alias-maps.cf
virtual_mailbox_base = /var/vmail/
virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql-virtual-domains-maps.cf
virtual_mailbox_limit = 0
virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
virtual_minimum_uid = 104
virtual_transport = dovecot
local_transport = virtual
virtual_uid_maps = static:6000
virtual_gid_maps = static:6000
dovecot_destination_recipient_limit = 1

Anschließend müssen folgende zeilen in der master.cf geändert werden:

submission inet n       -       -       -       -       smtpd
smtps     inet  n       -       -       -       -       smtpd
#  -o syslog_name=postfix/smtps
#  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes

# ERGÄNZEN AM ENDE:
dovecot   unix  -       n       n       -       -       pipe
  flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -d ${recipient}
chown -R root:postfix /etc/postfix/
/etc/init.d/postfix restart
[ ok ] Restarting postfix (via systemctl): postfix.service.

Damit Postfix später auch mit der Datenbank zusammenarbeiten kann, legen wir noch vier Dateien im Ordner /etc/postfix/mysql an:

mkdir /etc/postfix/mysql
nano /etc/postfix/mysql-virtual-alias-maps.cf
hosts = localhost
user = postfix
password = changeme
dbname = postfix
query = SELECT goto FROM alias WHERE address='%s' AND active = '1'
nano /etc/postfix/mysql-virtual-domains-maps.cf
hosts = localhost
user = postfix
password = changeme
dbname = postfix
query = SELECT domain FROM domain WHERE domain='%s' AND active = '1'
nano /etc/postfix/mysql-virtual-mailbox-maps.cf
hosts = localhost
user = postfix
password = changeme
dbname = postfix
query = SELECT maildir FROM mailbox WHERE username='%s' AND active = '1'
nano /etc/postfix/mysql-sender-login-maps.cf
hosts = localhost
user = postfix
password = changeme
dbname = postfix
query = SELECT username AS allowedUser FROM mailbox WHERE username="%s" AND active = 1 UNION SELECT goto FROM alias WHERE address="%s" AND active = 1

Die Konfigurationsdateien müssen wir nun vor fremden Zugriff schützen:

chown -R root:postfix /etc/postfix/mysql-*
chmod 640 /etc/postfix/mysql-*

 

4.5 Mail-User anlegen

Wir müssen nun einen Nutzer anlegen. Dazu müssen wir neben dem Benutzernamen (vmail) auch eine ID (-u) vergeben. Es empfiehlt sich eine hohe ID über 5000 zu vergeben. Die meisten System-IDs liegen zwischen 0 und 1000. Darüber hinaus ist dem Nutzer ein Home-Verzeichnis zu belegen (/var/vmail) und anschließend über den Befehl mkdir zu erstellen sowie zu berechtigen (chown Nutzer:Gruppe PFAD).

useradd -u 6000 vmail -d /var/vmail
mkdir /var/vmail 
chown vmail:vmail /var/vmail/

 

4.6 Dovecot

Nun möchte ich neben dem Versenden von E-Mails auch Empfangen können. Dazu setze ich Dovecot ein. Über das IMAP-Protokoll kann man E-Mails komfortabel vom Server abrufen. Es ist möglich, sich mit mehreren Endgeräten am IMAP-Server zu connecten. Man kann dann auf die gleichen E-Mails zugreifen. Das ist insbesondere für das Arbeiten unterwegs und am Arbeits-Client wichtig. Alternativ kann man auch pop3 nutzen.

Die Installation erfolgt wie folgt:

 apt-get install dovecot-common dovecot-imapd dovecot-pop3d dovecot-mysql

Wir wechseln danach in das Dovecot Verzeichnis

cd /etc/dovecot/
nano dovecot.conf

Dort ist in der dovecot.conf folgendes einzutragen und mit euren Daten abzuändern:

auth_mechanisms = plain login
log_timestamp = "%Y-%m-%d %H:%M:%S "
passdb {
  args = /etc/dovecot/dovecot-mysql.conf
  driver = sql
}
protocols = imap pop3
service auth {
  unix_listener /var/spool/postfix/private/auth_dovecot {
    group = postfix
    mode = 0660
    user = postfix
  }
  unix_listener auth-master {
    mode = 0600
    user = vmail
  }
  user = root
}
ssl = yes
ssl_cert = </etc/postfix/ssl/mailserver.crt
ssl_key = </etc/postfix/ssl/mailserver.key
userdb {
  args = /etc/dovecot/dovecot-mysql.conf
  driver = sql
}
protocol pop3 {
  pop3_uidl_format = %08Xu%08Xv
  pop3_client_workarounds = oe-ns-eoh
#   pop3_uidl_format = %v.%u
}
protocol lda {
  auth_socket_path = /var/run/dovecot/auth-master
  postmaster_address = admin@domain.tld
}

Damit Dovecot auch Hand in Hand mit Postfix arbeitet, müssen wir auf die gleiche Datenbasis zugreifen. Wir nutzen wieder unsere MySQL-Datenbank:

nano /etc/dovecot/dovecot-mysql.conf

und tragen dort folgendes ein:

driver = mysql
connect = host=localhost dbname=postfix user=postfix password=changeme
default_pass_scheme = PLAIN-MD5
password_query = SELECT password FROM mailbox WHERE username = '%u'
user_query = SELECT CONCAT('maildir:/var/vmail/',maildir) AS mail, 6000 AS uid, 6000 AS gid FROM mailbox WHERE username = '%u'

Anschließend folgende Befehle absetzen:

chown :vmail dovecot-mysql.conf
chmod 600 dovecot-mysql.conf

Nun noch einmal postfix und dovecot durchstarten:

root@df:/etc/dovecot# /etc/init.d/postfix restart
[ ok ] Restarting postfix (via systemctl): postfix.service.
root@df:/etc/dovecot# /etc/init.d/dovecot restart
[ ok ] Restarting dovecot (via systemctl): dovecot.service.

5. Einrichtung des DNS

Damit euer Mailserver funktioniert, müsst ihr einen korrekten DNS Eintrag haben. Dazu wechselt zu eurem Domain-Provider und geht in die DNS-Einstellung.  Ein MX Eintrag für eure Domain könnte etwa so aussehen:

domain.tld.          2481    IN      MX      10 domain.tld.

Viele arbeiten auch mit Präfixen wie „mx.“- oder „mail.domain.tld“

6. Einrichtung der ersten Mailbox

Für die Einrichtung eurer ersten Mailbox geht ihr (nachdem die DNS-Einstellung aktiv ist; kann bis zu 24 Stunden dauern!) wie folgt vor:

  1. Log-in PostfixAdmin unter http://domain.tld/postfixadmin
  2. Domain-Liste > Neue Domain anlegen für domain.tld
  3. Virtual Liste > Neue Mailbox anlegen für admin@domain.tld

7. Einrichtung im Client

Die Einrichtung in eurem Mail-Client erfolgt dann ganz normal:

Posteingangsserver: domain.tld (Port 143, TLS)
Postausgangsserver: domain.tld (Port 587, TLS)

Benutzername: admin@domain.tld
Passwort: changeme

8. Trouble-Shooting

Auch ich habe mehrere Anläufe zum Einrichten gebracht, geholfen hat mir allerdings beim Troubleshooting ein Blick in die Logs! Ein bisschen Google und ich hatte die Fehler gefunden.

Die Logs von Dovecot (gerade bei Fehlern beim Einrichten der E-Mail im Client) könnt ihr über

doveadm log find

abrufen. Interessant hierbei vorallem die /var/log/mail.log. Die könnt ihr mittels

tail -f /var/log/mail.log

öffnen und dann euch im Client anmelden.

Bei mir kam so z.B. ein folgender Fehler:

Password data is not valid for scheme PLAIN-MD5: Input isn't valid base64 encoded data

Diesen konnte ich beheben, indem ich die Postfixadmin config.inc.php wie folgt angepasst habe:

$CONF['encrypt'] = 'dovecot:PLAIN-MD5';
$CONF['dovecotpw'] = "/usr/bin/doveadm pw";

Wer bis hierhin durchgehalten hat, hat seinen Mailserver fertig konfiguriert. Was wir noch nicht beachtet haben, ist die SPAM-Filterung. Diese Aufgabe übernimmt ein Konglomerat aus Spamerkennung, Filterung und Mailboxverschiebeoperatoren. Die Installation erkläre ich euch ab Punkt 9.

9. Spam-Behandlung

9.1 Spamassassin

Die beste Spam-Behandlung funktioniert nicht ohne Erkennung. Dazu setze ich den Spamassassin ein. Neben dem Spamassassin installieren wir noch razor, der zur Filterung dient und einen kontinuierlich Spamkatalog durch verschiedene Nutzer pflegt und pyzor, welcher ähnlich wie razor agiert.

apt-get install spamassassin razor pyzor

Damit der Spamassassin aktiv ist, setzen wir über nano den enabled Status auf 1, für das automatische Update muss der Wert „Cron“ ebenfalls auf 1, also aktiv, gesetzt werden. Anschließend kann der Dienst neugestartet werden.

nano /etc/default/spamassassin
# Change to "1" to enable spamd on systems using sysvinit:
ENABLED=1
# Cronjob
# Set to anything but 0 to enable the cron job to automatically update
# spamassassin's rules on a nightly basis
CRON=1
service spamassassin restart

9.2 Amavis

Der eigentliche Filtermechanismus erfolgt über Amavis. Dieser nutzt den Spamassassin und setzt Flags auf die E-Mails. Dadurch erhalten Sie z.B. den Präfix ***SPAM*** oder werden direkt gelöscht. Wir installieren wieder und stellen anschließend das Spamverhalten ein, indem wir in der 15-content_filter_mode Datei die Auskommentierung entfernen.

apt-get install amavisd-new
nano /etc/amavis/conf.d/15-content_filter_mode
@bypass_spam_checks_maps = (
   \%bypass_spam_checks, \@bypass_spam_checks_acl, \$bypass_spam_checks_re);

Wir wollen Amavis so nutzen, dass er die Spam-E-Mails mit einem Präfix im Betreff, der Zeichenkette ***SPAM***, und einem sogenannten „X-Spam-Flag“ im Header markiert. Dazu muss die 20-debian_default wie folgt geändert werden und der Dienst einmal neugestartet werden. Den Kill-Level setzen wir etwas höher. Dieser kann im Nachgang bequem per Konfiguration an die eigenen Bedürfnisse angepasst werden. Spambekämpfung ist ein fortwährender Prozess.

nano /etc/amavis/conf.d/20-debian_defaults
$sa_spam_subject_tag = '***SPAM*** ';
$sa_tag_level_deflt  = undef;
$sa_tag2_level_deflt = 5;
$sa_kill_level_deflt = 20;
$sa_dsn_cutoff_level = 10;   # spam level beyond which a DSN is not sent
service amavis restart

Nun müssen wir amavis in unser Postfix integrieren. Dazu müssen wir in der Postfixkonfiguration eine Filter-Regel hinzufügen.

nano /etc/postfix/main.cf
content_filter=smtp-amavis:[127.0.0.1]:10024

Ebenfalls müssen wir die master.cf um einige Zeilen ergänzen.

nano /etc/postfix/master.cf
smtp-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

Für das „Pickup“ müssen wir direkt unter dieser Zeile

pickup    unix  n       -       -       60      1       pickup

Folgendes ergänzen

    -o content_filter=
    -o receive_override_options=no_header_body_checks

Das sieht dann so aus:

pickup    unix  n       -       -       60      1       pickup
    -o content_filter=
    -o receive_override_options=no_header_body_checks

und einmal neustarten:

service postfix restart

Wenn wir unsere SPAM-Erkennung testen wollen, dann können wir dies tun, indem wir uns eine E-Mail schicken, die im Textkörper folgenden String enthält. Sollte diese E-Mail nicht im Postfach ankommen, dann funktioniert unsere Spamerkennung. Das liegt daran, dass dieser Teststring den höchsten SPAM-Score erzeugt und automatisch blockiert / gelöscht wird.

XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X

9.3 ClamAV

Wer noch eine Virus-Erkennung integrieren möchte, kann seinen Mailserver mit ClamAV ausstatten. Dieser wird ebenfalls in Postfix integriert und checkt die E-Mails nach bekannten Virussignaturen.

9.4 Sieve

Sieve ist ein Dienst, der E-Mails sortieren kann. Diese wird z.B. dazu genutzt, um erkannte SPAM-Mails in den Junk-Ordner zu verschieben.

 

 

Viel Spaß mit eurem Mailserver!

Von Alexander

Das Projekt derFernstudent.de ist für mich gleichermaßen Dokumentation und Erfahrungsbericht. Als Erfahrungsbericht für mein Fernstudium gestartet, dient es nun als Plattform, um mein Hobby und Wissen zu teilen. Ergänzt wird die Seite durch den YouTube Kanal

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.