Eigener Mailserver mit iRedMail
In diesem Artikel wird erklärt, wie man sich relativ einfach einen eigenen Mailserver mit Hilfe des iRedMail-Projektes zusammenstellt.
Voraussetzungen
Für die Installation wird eigentlich nichts außer die Installations-Software benötigt, diese lädt automatisch aus den jeweiligen Repositories die benötigten Pakete nach. Das hat den Vorteil, dass die Komponenten bei einem Betriebssystem-Update ebenfalls aktualisiert werden. Da die Software außerdem die Konfigurationsdateien der enthaltenen Komponenten (z.B. Apache) auf iRedMail anpasst wird auch von den Entwicklern dringend empfohlen, die Software nur auf einem frisch aufgesetzten System zu installieren (anschließende Anpassungen für den eigenen Betrieb sind natürlich weiterhin möglich).
Folgende Betriebssysteme werden unterstützt:
- Red Hat Enterprise Linux
- CentOS
- Scientific Linux
- Debian
- Ubuntu
- OpenSuSE
- FreeBSD
- OpenBSD
Komponenten
iRedMail installiert folgende Core-Komponenten:
- Postfix <-- Mailserver
- Apache2 <-- Webserver für Frontend-Zugriff
- Amavis <-- Content Filter
- Postfix Cluebringer <-- Policy Server (wird u.a. für white/grey/blacklisting verwendet)
- ClamAV <-- Virenscanner
- MySQL ODER OpenLDAP ODER PostgreSQL <-- Backend
- Dovecot <-- IMAP und POP3 Server
Optional können folgende Komponenten installiert werden:
- DKIM signing/verification <-- DomainKeys Identified Mail (ein Sicherheitsfeature)
- iRedMailAdmin <-- von iRedMail selbst entwickeltes Admin-Interface (webbasiert) zum verwalten der Domains und Mailuser. Benutzt man eine Alternative (siehe unten), bracht man dies nicht zu installieren
- Roundcubemail <-- Webbasiertes Frontend für den Zugriff auf Postfächer
- phpMyAdmin/phpLDAPadmin/phpPgAdmin <-- Webfrontend für die Administration von MySQL, OpenLDAP oder PostgreSQL
- Awstats <-- Web-Analyse Tool (Logfile-basiert), erlaubt u.a. das Erstellen von Statistiken von Webauftritten und Mail-Verkehr.
- Fail2ban <-- Sicherheitsmechanismus zum Blockieren von Spammern, Hackern und/oder DDoS-Angriffen
Installation
In diesem Beispiel wird als Betriebssystem eine Minimalinstallation von Ubuntu 12.04 eingesetzt. Außerdem wird als Verwaltungskomponente MySQL verwendet.
Als erstes muss sichergestellt werden, dass ein Full Qualified Domain Name (FQDN) gesetzt ist. Bei Ubuntu müssen dazu die zwei Dateien /etc/hostname und /etc/hosts angepasst/kontrolliert werden. Der Inhalt der Dateien könnte folgendermaßen aussehen:
### /etc/hosts ### 127.0.0.1 localhost 127.0.1.1 ubuntu # The following lines are desirable for IPv6 capable hosts ::1 ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters ### /etc/hostname ### ubuntu
Folgendes muss geändert werden (jeweils natürlich die richtigen Host- und Domainnames eintragen):
### /etc/hosts ### 127.0.0.1 localhost 127.0.1.1 mail.example.com mail # The following lines are desirable for IPv6 capable hosts ::1 ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters ### /etc/hostname ### mail.example.com
Damit die Änderung übernommen wird ist ein Reboot notwendig.
reboot
Dann nochmal kontrollieren:
hostname -f
Es sollte nun der angegebene Hostname (hier mail.example.com, auf dem Promt sollte nun auch der Hostname ohne Domain angezeigt werden).
Weiter geht's mit der Installation:
# Es wird zuerst ein Update des Betriebssystems empfohlen
aptitude update && aptitude safe-upgrade -y
cd /usr/src
wget https://bitbucket.org/zhb/iredmail/downloads/iRedMail-0.8.5.tar.bz2 # <-- Bei Bedarf den aktuellen Link der Projektseite verwenden
tar -jxf iRedMail-0.8.5.tar.bz2
cd iRedMail-0.8.5
bash iRedMail.sh
Das Skript downloaded zuerst ein Paket und startet dann einen ASCII-Installer. Dieser ist relativ intuitiv.
- Welcome (einfach weiterklicken)
- Mail Storage Path: Dies ist der Pfad auf Betriebssystem-Ebene, unter welchem die Emails abgelegt werden. Default ist /var/vmail und kann beibehalten werden.
- Backend: Hier kann zwischen drei Arten von Backends entschieden werden: OpenLDAP, MySQL oder PostgreSQL
- MySQL root Passwort: Setzt das MySQL root Passwort. ACHTUNG: Es wird nach keiner Bestätigung des Passwortes gefragt
- First Virtual Domain: Die Virtual Domain ist der Teil hinter dem '@', wenn also z.B. example.com angegeben wird ist diese Domain verantwortlich für alle *@example.com Adressen.
- Admin User Password: Der Admin-User ist postmaster@[first virtual domain]. Dies kann leider mit Bordmitteln nicht geändert werden. Hier muss ein Passwort angegeben werden (auch hier erfolgt keine Bestätigung).
- Optional Components: Auswahl der optionalen Komponenten
- Danach gibt es noch einige Sicherheitshinweise per Terminal, ist dies jedoch vorbei werden die Komponenten aus den Repositories installiert, aktualisiert und konfiguriert.
- Aus irgendeinem Grund ist in Postfix nach der Installation in der master.cf die Verlinkung zu Amavis auskommentiert, was dazu führt, dass E-Mail nicht zugestellt werden können. Um dies zu beheben kann einfach der Kommentar bei folgendem Eintrag in /etc/postfix/master.cf entfernt werden:
submission inet n - n - - smtpd -o smtpd_tls_security_level=encrypt -o smtpd_sasl_auth_enable=yes -o smtpd_client_restrictions=permit_mynetworks,permit_sasl_authenticated,reject # -o content_filter=smtp-amavis:[127.0.0.1]:10024 # <-- Hier den Kommentar am Anfang der Zeile entfernen.
- Da die meisten Komponenten noch nicht laufen, allerdings im Autostart sind würde ich das System nun rebooten. Muss eh wegen dem Update gemacht werden:
reboot
- Nun sollte das System bereit sein. Die Komponenten können über folgende Adressen erreicht werden:
- https://your-server-adress/mail <-- Roundcube Frontend
- https://your-server-adress/iredadmin <-- iRedMail-Admin-Interface
- https://your-server-adress/cluebringer <-- Cluebringer Web-Interface
- https://your-server-adress/phpmyadmin <-- Datenbank-Web-Interface
ACHTUNG: In dem Installationsverzeichnis (das aus dem Tar-Archiv entpackte) befindet sich nach der Installation eine Datei config, in welcher das Passwort des Mail-Admins postmaster und des MySQL-root-Users im Klartext befindet. Diese sollte besonders geschützt, am besten gelöscht werden.
Anpassen des Zugriffs über Apache
iRedMail nimmt an Apache folgende Änderungen vor:
- Installieren/Aktivieren von benötigten Modulen
- Ablegen folgender Konifg-Files in conf.d (sofern die Komponenten installiert wurden):
- cluebringer.conf
- iredadmin.conf
- roundcubemail.conf
- awstats.conf
- In diesen Dateien sind meist die Directory-Einträge der Komponenten.
- Hinzufügen von Alias-Einträgen in den Default-SSL-vhost (/etc/apache2/sites-available/default-ssl), welche auf die Installations-Pfade der einzelnen Komponenten im Dateisystem (meist unter /usr/share oder /usr/share/apache2) verweisen.
Dieses Konzept sorgt dafür, dass nach der Installation alles einsatzbereit ist. Allerdings ergeben sich einige organisatorische und sicherheitstechnische Bedenken:
- Da die Konfigurationen der Komponenten unter conf.d abgelegt wurden gelten sie global für alle vHosts und nicht nur für den dafür vorgesehenen. In roundcubemail.conf ist z.B. der Alias-Eintrag /mail aufgeführt was dazu führt, dass das Mail-Interface über JEDEN SSL-vHost aufgerufen werden kann. Sollte man also vor den dafür vorgesehen Mail-vHost eine BasicAuth schalten, kann diese über einen nicht geschützten SSL-vHost umgangen werden.
- Für phpMyAdmin wird seltsamerweise kein Directory-Eintrag mitgeliefert. Sollte man seinen Apache also z.B. so einstellen, dass der Zugriff auf das Datei-System nicht pauschal erlaubt sondern erst explizit freigeschaltet werden muss, ist ein Zugriff auf phpMyAdmin nicht möglich.
Um diese Bedenken auszuräumen empfehle ich, dass alle nötigen Konfigurationen und Einträge in einem einzigen vHost-File unter /etc/apache2/sites-available zusammengefasst werden und der Inhalt von cluebringer.conf, iredadmin.conf, awstats.conf und roundcubemail.conf in conf.d auskommentiert wird (außer dem Eintrag "WSGISocketPrefix /var/run/wsgi" in iredadmin.conf, da dieser nur global deklariert werden darf). Auch sollte der Zugriff der Web-Interfaces, wie defaultmäßig von den Entwicklern vorgesehen, ausschließlich über HTTPS erfolgen, da hierüber sensible Informationen wie Passwörter übertragen werden.
Folgender Beispiel-vHost kann verwendet werden:
# SSL-vHost mail.example.com <VirtualHost *:443> ServerName mail.example.com ErrorLog /var/log/apache2/mail.example.com-error.log CustomLog /var/log/apache2/mail.example.com-access.log combined # the following Directoy entries allow access to the iredmail # installations ON THIS VHOST ONLY. The default configuration # is global and allows access from ALL vhosts. # roundcubemail <Directory "/usr/share/apache2/roundcubemail/"> Order deny,allow Options -Indexes FollowSymLinks -Includes -MultiViews AllowOverride None allow from all </Directory> # iredadmin <Directory /usr/share/apache2/iredadmin/> Order allow,deny Options -Indexes FollowSymLinks -Includes -MultiViews AllowOverride None Allow from all </Directory> # phpMyAdmin <Directory "/usr/share/phpmyadmin/"> Order deny,allow Options -Indexes FollowSymLinks -Includes -MultiViews AllowOverride None allow from all </Directory> # Awstats <Directory /usr/lib/cgi-bin/> DirectoryIndex awstats.pl Options ExecCGI Order allow,deny allow from all #allow from 127.0.0.1 AuthName "Authorization Required" AuthType Basic AuthMYSQL on AuthBasicAuthoritative Off AuthUserFile /dev/null # Database related. AuthMySQL_Password_Table mailbox Auth_MySQL_Username_Field username Auth_MySQL_Password_Field password # Password related. AuthMySQL_Empty_Passwords off AuthMySQL_Encryption_Types Crypt_MD5 Auth_MySQL_Authoritative On #AuthMySQLUserCondition "isadmin=1 AND isglobaladmin=1" Require valid-user </Directory> # cluebringer <Directory /usr/share/postfix-cluebringer-webui/webui/> DirectoryIndex index.php Options ExecCGI Order allow,deny #allow from 127.0.0.1 allow from all AuthType basic AuthName "Authorization Required" AuthType Basic AuthMYSQL on AuthBasicAuthoritative Off AuthUserFile /dev/null # Database related. AuthMySQL_Password_Table mailbox Auth_MySQL_Username_Field username Auth_MySQL_Password_Field password # Password related. AuthMySQL_Empty_Passwords off AuthMySQL_Encryption_Types Crypt_MD5 Auth_MySQL_Authoritative On Require valid-user </Directory> # the following line are needed by iredadmin, pasted content # from the conf.d file to limit access to this vhost. WSGIDaemonProcess iredadmin user=iredadmin threads=15 WSGIProcessGroup iredadmin AddType text/html .py # access to iredmail stuff Alias /cluebringer "/usr/share/postfix-cluebringer-webui/webui/" Alias /iredadmin/static "/usr/share/apache2/iredadmin/static/" WSGIScriptAlias /iredadmin "/usr/share/apache2/iredadmin/iredadmin.py/" Alias /mail "/usr/share/apache2/roundcubemail/" Alias /phpmyadmin "/usr/share/phpmyadmin/" RewriteEngine On # SSL SSLEngine On SSLHonorCipherOrder On # No weak cyphers SSLCipherSuite ECDHE-RSA-AES128-SHA256:AES128-GCM-SHA256:RC4:HIGH:!MD5:!aNULL:!EDH SSLProtocol SSLv3 +TLSv1 SSLCertificateFile /etc/apache2/ssl.crt/mail.example.com.crt SSLCertificateKeyFile /etc/apache2/ssl.key/mail.example.com.key </VirtualHost>
Es sollten nur die Directory- und Alias-Einträge von den Komponenten verwendet werden, welche auch installiert sind. Für einen SSL-vHost wird ein Zertifikat benötigt. Will man sich keines kaufen, kann man ein Self-Sign Zertifikat verwendent, muss dann aber mit den Browser-Fehlern leben. Bei Bedarf kann man zur Erhöhung der Sicherheit den vHost auch mit einer BasicAuth schützen.
Alternatives Admin-Interface PostfixAdmin
iRedMail liefert von Haus aus ein eigenes Admin-Interface mit (iRedAdmin). Dies ist zwar schön anzusehen, jedoch in seiner Funktionalität sehr eingeschränkt. Man kann damit nur Mail-Domains und E-Mail-Account erstellen. Alles darüber hinaus, z.B. Mail-Aliases, erfordert die Pro-Version, welche immerhin stattliche 299$ pro Jahr (599$ für life time licence) kostet. Vor iRedAdmin wurde das freie Webtool Postfixadmin verwendet welches es erlaubt hat, über eine Weboberfläche Postfix relativ einfach zu konfigurieren, aber mit Version 0.7 sind die Entwickler auf die eigene, proprietäre Lösung umgestiegen. Da dies vielen Mitgliedern der Community missfiel wurde von diesen Lösungen entwickelt, mit denen Postfixadmin auch mit der heutigen Version von iRedMail genutzt werden kann. Glücklicherweise basiert iRedAdmin auf Postfixadmin, wodurch die DB-Struktur relativ gleich ist.
cd /usr/src/
wget http://switch.dl.sourceforge.net/project/postfixadmin/postfixadmin/postfixadmin-2.3.6/postfixadmin-2.3.6.tar.gz
tar -vxzf postfixadmin-2.3.6.tar.gz
mv postfixadmin-2.3.6 /usr/share/apache2
ln -s /usr/share/apache2/postfixadmin-2.3.6 /usr/share/apache2/postfixadmin
Natürlich kann das Verzeichnis auch in einen eigenen DocumentRoot verschoben werden, ich habe dies jedoch nach /usr/share/apache2 verschoben, da hier auch Roundcube abgelegt wird.
Danach müssen in der Konfig-Datei von Postfixadmin (config.inc.php im Installationsverzeichnis) folgende Variablen geändert werden:
$CONF['configured'] = true;
$CONF['postfix_admin_url'] = '/postfixadmin';
$CONF['database_type'] = 'mysqli';
$CONF['database_user'] = 'vmailadmin';
$CONF['database_password'] = 'PASSWORD';
$CONF['database_name'] = 'vmail';
$CONF['database_tables'] = array (
'admin' => 'admin',
'alias' => 'alias',
'alias_domain' => 'alias_domain',
'config' => 'config',
'domain' => 'domain',
'domain_admins' => 'domain_admins',
'fetchmail' => 'fetchmail',
'log' => 'log',
'mailbox' => 'mailbox',
'vacation' => 'vacation',
'vacation_notification' => 'vacation_notification',
'quota' => 'used_quota',
'quota2' => 'mailbox',
);
Das database_password für den User vmailadmin befindet sich unter /usr/share/apache2/iredadmin/settings.ini unter dem [vmaildb] Abschnitt. Wurde das Admin-Interface iRedAdmin nicht installiert, findet man das Passwort im Installations-Verzeichnis von iRedmail in der Datei iRedMail.tips.
Im Apache vHost müssen folgende Zeilen hinzugefügt werden:
# Postfixadmin <Directory "/usr/share/apache2/postfixadmin"> Order deny,allow Options -Indexes FollowSymLinks -Includes -MultiViews AllowOverride None allow from all </Directory> Alias /postfixadmin "/usr/share/apache2/postfixadmin"
Nun Apache neustarten:
service apache2 restart
Damit Postfixadmin die noch fehlenden Tabellen erstellen kann müssen die MySQL-Rechte des Users vmailadmin erweitert werden.
mysql -u root -p -e 'GRANT ALL PRIVILEGES ON `vmail`.* TO vmailadmin@localhost;'
Zusätzlich müssen noch einige Daten aus einer Tabelle der Datenbank vmail in eine andere kopiert werden:
mysql -u root -p -e "INSERT INTO vmail.admin (username, password, name, language, passwordlastchange, created, modified, expired, active) SELECT username, password, name, language, passwordlastchange, created, modified, expired, active FROM vmail.mailbox WHERE name = 'postmaster';"
Nun ist der Admin, welcher bei der iRedMail-Installation angegeben wurde, auch der Admin von Postfixadmin.
Als letzter Schritt muss nun im Browser die Setup-Seite aufgerufen werden.
- https://mail.example.com/postfixadmin/setup.php
Die Applikation sollte nun hinter jedem Punkt ein "OK" ausgeben und angeben, dass Tabellen erstell/angepasst wurden. Danach kann man sich als User postmaster@example.com anmelden. Fertig.
Fallstricke
- Bei den ersten Versuchen, von extern eine E-Mail an den Server zu schicken, wird diese nicht ankommen und Logfile ist zu sehen, dass die Nachricht wegen des Greylisting nicht zugestellt wurde. Greylisting ist standardmäßig über das Module Cluebringer aktiv und ist eine Methode zur Verhinderung von Spam.
- Beim Greylisting wird ein Objekt aus der Sender-Adresse, dem Mail-Server und der Empfänger-Adresse gebildet. Taucht eine solche Kombination das erste Mal auf, wird die E-Mail temporär abgelehnt. Seriöse E-Mail-Server (Sender) versuchen in diesem Fall, die E-Mail nach einigen Minuten nochmals zuzustellen während eine Spam-Schleuder einfach aufhört. Erfolgt der zweite (manchmal auch dritte) Zustellungsversuch wird die E-Mail zugestellt und das Objekt in eine Whitelist aufgenommen. Alle zukünftigen Zustellungsversuche mit derselben Kombination werden sofort zugelassen.
- Ist dieses Verhalten nicht gewünscht, dann kann das Greylisting in der Datei /etc/cluebringer/cluebringer.conf deaktiviert werden, indem unter dem Bereich [Greylisting] der Wert von "enable" auf 0 gesetzt wird. Danach ist eine Restart des Cluebringer Service nötig:
service postfix-cluebringer restart