mailcow

Dear visitor,
this is basically a translated (and shortend) version of the README.md you will find on the projects GitHub page.
Your feedback is welcome in any language!

Inhaltsverzeichnis

mailcow entstand als fufix aus Spaß am Scripten, hat sich dank eurer Hilfe und einer Menge Zeit zu dem entwickelt, was es heute ist.

mailcow beinhaltet mehrere Komponenten, die eine gesamte Mailserver-Umgebung ausmachen:

  • Postfix, womöglich der stabilste, sicherste und ausgereifteste MTA seit Jahren.
  • Dovecot, neben Postfix eine Kernkomponente. Dovecot ist MDA und IMAP Server.
  • Nginx stellt gemeinsam mit PHP5 eine Webplattform zur Verfügung.
  • Fail2ban, die rudimentäre, dennoch erprobte Sicherheitslösung im Kampf gegen Brute-Force Angriffe.
  • Die Webkomponenten Roundcube, Postfixadmin und das hauseigene mailcow control center, dienen der bequemen Administration.

Changelog (Klick für alle)


README.md

Ich arbeite an einer Dokumentation sowie ausführlichen README auf GitHub: https://github.com/andryyy/mailcow/blob/master/README.md

Bislang dokumentiere ich lediglich auf Englisch. Zugegeben, auf dem ersten Blick scheint alles etwas chaotisch, aber ich gebe mir Mühe euch nicht in den Wahnsinn zu treiben.
Wer aus der README nicht schlau wird, darf sich wie immer der Kommentarfunktion bedienen oder eine Mail senden. An dieser Stelle noch einmal ein dickes DANKE an alle, die mir – auf welchem Wege auch immer – Feedback gegeben haben.


Screenshot

fufix v0.10.1
fufix v0.10.1

Zusammenfassung

Hier einige Stichworte zur Konfiguration des Systems.

  • Systemumgebung wird angepasst (Hostname/FQDN, Zeitzone, …)
  • Automatische Erstellung sicherer Passwörter – manuelles Passwort möglich
  • Globales selbstsigniertes SSL Zertifikat (via „/etc/ssl/mail/“)
  • Optimierte Nginx (+PHP5-FPM) Installation (HTTP-to-HTTPS, nach BetterCrypto)
  • MySQL Datenbanksystem
  • DNS-Checks mittels Google DNS (PTR, A-Record, SPF via TXT)
  • Automatisches Anlernen von „Spam“ und „Ham“
  • Systeminformation und Hinweise zu Terminal-Aufgaben in Webpanel

Postfix

  • Submission via Port 587/STARTTLS
  • Authentifizierung via TLS erforderlich
  • Effektives Postscreen Setup auf Port 25
  • Aktiver Spamassassin Spamfilter
  • DKIM-Integration: OpenDKIM Milter
  • via „Control center“:
    – Gefährliche Dateianhänge können abgelehnt werden
    – Unerwünschte Sender können blockiert werden
    – mailcow-eigener VirusTotal-Uploader optional zuschaltbar (benötigt kostenfreien API-Key)
    – ClamAV zuschaltbar
    – Nachrichtengröße limitieren (betrifft ebenso PHP und Nginx)

Dovecot

  • Automatische Abonnements wichtiger Verzeichnisse
  • ACL/Shared Namespace
  • Sieve/ManageSieve
  • Globaler Sieve-Filter: Markierte Nachrichten nach „Junk“ verschieben
  • (IMAP-)Quota in MiB
  • LMTP (Postfix > Dovecot)
  • SSL nach BetterCrypto

Postfixadmin

  • Automatische Installation und Konfiguration inkl. Erstellung eines „Super Admins“
  • Volle Quota-Kontrolle
  • Fetchmail Unterstützung

Roundcube

  • ManageSieve (inkl. „Vacation“)
  • Passwortänderung durch Benutzer möglich
  • Anhangserinnerung (viele Sprachen)
  • Zip-Download ausgewählter Nachrichten

Versionsinformationen zur Software, die nicht aus den offiziellen Debian Repositorys installiert wird, befinden sich im jeweiligen Paket unter „includes/versions“.

Als Template dient das Bootstrap Template, welches zudem über eine korrekte mobile Darstellung verfügt.


Installation

ACHTUNG: Das Script startet nur dann, wenn kein Maildienst läuft! Zudem werden alle Konfigurationen gelöscht!
Ich empfehle in jedem Fall die Einrichtung auf einem frisch aufgesetztem System.

Auf einer Standard-/Minimal-Installation von Debian ist ein Exim4 aktiv, das vorab durch apt-get purge exim4* vollständig entfernt werden kann.

Alle beschriebenen Schritte sind als Benutzer „root“ auszuführen

mailcow werde ich in diesem Artikel in das Verzeichnis „~/build“ laden und entpacken:

mkdir ~/build ; cd ~/build
wget -O - https://github.com/andryyy/mailcow/archive/v0.10.1.tar.gz | tar xfz -
cd mailcow-*

Nun unbedingt die Konfiguration öffnen und die notwendigen Änderungen vornehmen:

nano configuration

Die Punkte kurz erklärt:

  • sys_hostname: Der Hostname ohne Domäne.
  • sys_domain: Die öffentliche Domäne, der FQDN wird aus Hostnamen und Domäne zusammengesetzt.
  • sys_timezone: Die Zeitzone muss korrekt sein, wird vom Script auf Verfügbarkeit geprüft. Vorgabe für Berlin ist korrekt und kann bestehen bleiben.
  • my_postfixdb, my_postfixuser, my_postfixpass beschreiben die MySQL Datenbank für Postifx, den zugehörigen Benutzer und sein Passwort. Die Vorgaben können bestehen bleiben.
  • my_rcdb, my_rcuser, my_rcpass beschreiben die MySQL Datenbank für Roundcube, den zugehörigen Benutzer und sein Passwort. Die Vorgaben können bestehen bleiben.
  • Mit my_rootpw wird das Root Passwort der MySQL Installation gesetzt. Notwendig, da der Installer die Pakete via „apt-get“ unbeaufsichtigt installiert.
  • Ist eine MySQL-Installation bereits vorhanden, wird das Script diese erkennen und unter Verwendung des Wartungs-Benutzers debian-sys-maint anpassen. Es werden keine Datenbanken außer $my_rcdb sowie $my_postfixdb (falls vorhanden) gelöscht. Ebenso werden keine Passwörter verändert. $my_rootpw wird in diesem Fall ignoriert. Ein Hinweis ist während der Installation zu sehen.
  • pfadmin_adminuser und pfadmin_adminpass beschreiben den administrativen Zugang zu Postfixadmin und können so bestehen bleiben. Der Benutzer MUSS auf einer Top-Level-Domain enden, etwa „pfadmin@domain.com“. „pfadmin@domain“ oder „pfadmin@domain.tld“ sind ungültig. Die Vorgabe fügt die Domäne aus der Konfiguration ein. Das Passwort muss mindestens 8 Zeichen lang sein, aus Groß- und Kleinschreibung bestehen sowie 2 Ziffern beinhalten.
  • Die „cert-“ Variablen gelten für das self-signed Zertifikat und sind selbsterklärend. „Country“ muss aus exakt zwei Buchstaben bestehen, auf Sonderzeichen für die weiteren Parameter sollte verzichtet werden. „CN“ entspricht automatisiert dem FQDN des Servers.
  • conf_done dient lediglich der Sicherheit. Den Wert nach vollständiger Überprüfung der Eingaben auf „yes“ abändern.
  • inst_unattended führt die Installation ohne Benutzereingabe aus.
  • inst_debug setzt „set -x“, um Fehler ausfindig zu machen.
  • Kein Parameter darf leer sein.
# Your servers new hostname and timezone.
# FQDN would be mail.domain.com
# Example for valid timezone data: https://www.vmware.com/support/developer/vc-sdk/visdk400pubs/ReferenceGuide/timezone.html
sys_hostname="mail"
sys_domain="domain.tld"
sys_timezone="Europe/Berlin"

# Choose a webserver platform
# Valid values are "nginx" or "apache2"
conf_httpd="nginx"

# MySQL configuration.
# Password policy: Not empty.
# Recommended setting: Leave "genpasswd" to generate a secure password.
# ===============
# AN EXISTING MYSQL INSTANCE WILL BE USED AND NOT RECONFIGURED WHEN IT IS AVAILABLE
# AND IT IS USEABLE BY MAILCOW VIA DEBIAN DEFAULTS-FILE
# (Note: Leave "my_rootpw" setting below as it is, it will not have an effect, but needs to be set!)
# ===============
my_rootpw=`genpasswd`

my_postfixdb="postfixdb"
my_postfixuser="postfix"
my_postfixpass=`genpasswd`

my_rcdb="roundcubedb"
my_rcuser="roundcube"
my_rcpass=`genpasswd`

# Postfixadmin - Admin Login
# Password policy: At least 8 characters long, including 2 numbers, an uppercase letter, and a lowercase letter.
# Recommended settings: Leave "genpasswd" to generate a secure password.

pfadmin_adminuser="pfadmin@$sys_domain"
pfadmin_adminpass=`genpasswd`

# Self-signed certificate
# "cert_country" needs to be a valid 2 letter country code. See https://www.digicert.com/ssl-certificate-country-codes.htm

cert_country="DE"
cert_state="NRW"
cert_city="DUS"
cert_org="MAIL"

# Do not confirm to proceed
inst_unattended="no"

# Be verbose
inst_debug="no"

#########
# Done? #
#########
conf_done="no"

Jetzt etwas Zeit mitbringen (Anmerkung: seit v0.4 wesentlich weniger…) und den Installer starten:

./install.sh

Wie ausdrücklich erwähnt, darf kein Maildienst laufen, ansonsten streikt der Installer und informiert über blockierende Dienste:

Blockierende Ports in fufix 0.7.1.1
Blockierende Ports in fufix 0.7.1.1

Nach jedem Schritt einen Blick auf die Ausgabe werfen und sicherstellen, dass keine gravierenden Fehler auftreten.
Seit kurzer Zeit steht die Option „inst_debug“ zur Verfügung. Es kann sich lohnen, die Option auf „yes“ zu setzen, um Fehler präziser nachzuvollziehen.
Es gibt zur Zeit noch keine Routine, die JEDEN SCHRITT auf Fehler überprüft.

Allerdings werden wichtige Hinweise und Fehler grundsätzlich in die Standardausgabe geschrieben!

Der korrekte Installationsvorgang unter Debian Wheezy mit fufix 0.7.1.1 (noch im Gange):

fufix Installationsprozess (Screenshot v0.7.1.1)
fufix Installationsprozess (Screenshot v0.7.1.1)

Nach der Installation befinden sich die vergebenen Nutzernamen und zugehörige Passwörter in der Datei „installer.log“.

Das Webpanel steht nun unter „https://hostname.domain.tld“ zur Verfügung, um einerseits in die Administration Postfixadmins‘ zu gelangen, andererseits den Webmailer Roundcube zu öffnen – und neuerdings auch kleine Tweaks am Setup vorzunehmen.


Upgrade

Möglich seit fufix v0.7.x.

Es wird ein Backup angelegt, für den Fall der Fälle.

Gestartet wird das Upgrade im Anschluss folgendermaßen:

./install.sh -u

Deinstallation

Ursprünglich um mir das Testing etwas zu erleichtern, habe ich ein sehr simples Script zur vollständigen Deinstallation beigelegt, folgend ausführbar:

bash misc/purge.sh

Der Vorgang muss mit „confirm“ bestätigt werden.
Bitte vorher einen Blick in das Script werfen und sich der Konsequenzen bewußt werden. Auch Datenbanken und Log-Dateien werden ohne Nachfrage gelöscht.