LINUXMAKER, OpenSource, Tutorials

MailPiler - Eine gute Lösung zur Mailarchivierung als OSS

Die Server-Software Mail Piler ist eine Open-Source Software zur Archivierung von E-Mails. Denn seit 2017 sind in Deutschland alle Unternehmen und Gewerbetreibende zur E-Mail-Archivierung verpflichtet. Freiberufler und Kleingewerbetreibende bilden eine Ausnahme. Dabei basieren die rechtlichen Grundlagen für die E-Mail-Archivierung u. a. auf dem Handelsgesetzbuch, der Abgabenordnung und den GoBD.

Mail Piler bietet dazu ein gutes Archivierungssystem und wird von dem Ungarn Janos Suto entwickelt. Auf seinen Websites dazu gibt zwar eine Menge Dokumentationen, allerdings fehlt bislang immer noch eine klar strukturierte Installationsanleitung. Auch im Internet gibt es nur wenige brauchbare Anleitungen. So wird die Installation von Mail-Piler erst einmal zu einem Spießrutenlauf.

Der Entwickler reagiert zwar verhältnismäßig schnell auf seinem Github-Account, allerdings lässt die Qualität seiner Antworten zu wünschen übrig. Ein großes Problem ist die Umstellung von Sphinxsearch auf Manticore Search ab Version 1.4.1. Das wird zwar dokumentiert, allerdings mehr am Rande und dann fehlen auch die Angaben, wie sie die Installation ändert. Zudem ist die Dokumentation hinsichtlich der Installation ein Witz. Das muss man sich mühselig in Puzzelteilen im Internet zusammenkratzen. Man möchte meinen, dieser Janos Suto denkt, das alle Anderen bereits wissen, was er sich ausgedacht hatte. Dazu kommt, dass es zwei Domains gibt. mailpiler.org als Community-Variante mit eher rudimentärer Dokumentation und mailpiler.com als kommerzielle Seite als Archivierungsangebot. Schließlich gibt es noch versteckt, nur über Google-Suche eruierbar, die Subdomain „docs.mailpiler.com/piler-ee/“, auf der es eine Bedienungsanleitung gibt, die allerdings mehr auf die Piler Enterprise Edition abzielt, so dass sich wenigstens etwas für die Funktionen der OSS-Version ableiten lässt.

Wie bereits gesagt, sind Installationsanleitungen zu Mailpiler rah und zusätzlich teilweise total veraltet. Aus diesem Grund soll hier die Mail-Piler-Installation auf einem aktuellem Debian 12 Linux vorgestellt werden. Dazu nutze ich eine VM unter KVM. Proxmox wäre für den Einen oder Anderen noch optimaler, da hier sehr leicht via WebGui ein Backup/Snapshot der VM erstellt werden kann. Glauben Sie mir, Sie werden es benötigen, so knifflig ist die MailPiler-Installation.
Das Ganze als Docker-Container im Produktivmodus zur Verfügung zu stellen, davon halte ich gar nichts. Alleine wenn etwa ein Unternehmen eine Anwendung mit hohen regulatorischen Sicherheitsstandards nutzt, ist es nicht ohne weiteres sinnvoll, einen Docker-Container zu nutzen, da die VM immer eine höhere Isolationssicherheit besitzen wird als der Container. Und für archivierte Mails sollte die Isolationssicherheit wohl zu treffen. Im Übrigen wäre das auch ein zu betrachtender Aspekt gegen eine kommerzielle Mailarchivierung, denn Sie geben Ihren Datenbestand in die Hände eines externen Anbieters.

Hardware-Anforderungen

  • Arbeitsspeicher: 4 GB RAM
  • Festplatte: 200 GB Festplattenplatz, um genug Platz für die Mails zu haben.
  • 2 CPUs

Netzwerkanforderungen

  • Ein DNS-Record zum Beispiel piler.yourdomain.tld sollte bereits im Vorfeld in Ihrem DNS angelegt sein. Hier im Beispiel wird mit IPv6 gearbeitet, da die IPv4-Adressen mittlerweile exorbitante Preis erreicht haben. Außerdem sollte MailPiler eher in Ihrem Netzwerk erreichbar sein, als im Internet.
    Für den Fall, dass Ihre Mitarbeiter Ihre archivierten Mails von extern abrufen wollen, wird hier die Konfiguration mit IPv6 gezeigt.

  • Ihr Mailserver muss über SMTP (TCP/25) Zugriff auf Piler haben, um E-Mails per BCC an das Archiv zu senden.

  • Der Port 25 sollte nur für Ihren Mailserver erlaubt sein. Alle Anderen sollten den Port 25 verweigert bekommen.
    Mail-Piler bietet hierzu „Smtp Acl“ an, da das aber kein IPv6 kann, machen wir das mit IPTables und zur Hilfenahme von UFW.

  • Ihre Piler-Installation erfordert zum Wiederherstellen von E-Mails Zugriff auf Ihren Mailserver entweder über SMTP (TCP/25) oder IMAPS (TCP/993).

Basis-Installation

Zu den ohnehin bereits installierten Paketen, die Ihnen auf Ihrem System wichtig sind, folgen nun noch diese Pakete, die wir brauchen werden.

root@piler ~ # apt-get update
root@piler ~ # apt -y install sysstat build-essential libwrap0-dev libpst-dev tnef libytnef0-dev unrtf catdoc libtre-dev tre-agrep poppler-utils libzip-dev unixodbc libpq5 software-properties-common libpoppler-dev openssl libssl-dev mariadb-server mariadb-client python3-mysqldb memcached pwgen telnet git gnupg2 php8.3-cli php8.3-cgi php8.3-mysql php8.3-fpm php8.3-zip php8.3-ldap php8.3-gd php8.3-curl php8.3-xml php8.3-memcached apache2 libapache2-mod-php8.3 certbot python3-certbot python3-certbot-apache

Wenn Ihre Erstinstallation des Debian Linux einen exim-Mailserver enthält, dann entfernen Sie ihn mit

root@piler ~ # apt remove --yes exim

da Piler seinen eigenen SMTP-Server mitbringt und er würde nicht starten, würde bereits ein anderer SMTP-Server auf Port 25 lauschen.

Manticore-Installation anstelle von Sphinxsearch

Als Nächstes benötigen wir Manticore Search, da der Entwickler seit der Piler-Version 1.4.1 Sphinxsearch abgeschworen hatte und seitdem auf Manticore Search setzt. Was sich allerdings konkret bezüglich der Installation und Konfiguration ändert, insbesondere welche Installationsquellen/-versionen er von Manticore verwendet, dazu schweigt er sich beharrlich aus.

Somit holen wir uns von Manticore

root@piler ~ # wget repo.manticoresearch.com/manticore-repo.noarch.deb

und installieren es. Das Paket installiert folgende Dateien

/etc/apt/trusted.gpg.d/manticore-keyring.gpg
/usr/bin/manticoresearch-release

Dann legen wir uns das Repository für Manticore an

root@piler ~ # echo „deb repo.manticoresearch.com/repository/manticoresearch_bookworm_dev bookworm main >> /etc/apt/sources.list.d/manticoresearch.list
root@piler ~ # apt-get update

Jetzt kann Manticore installiert werden:

root@piler ~ # apt install manticore manticore-backup manticore-language-packs manticore-buddy  manticore-common manticore-dev manticore-icudata-65l manticore-repo manticore-server manticore-server-core  manticore-tools manticore-tzdata

 

Wichtig ist bis zu dieser Position, dass Manticore Search installliert ist. Der Manticore-Service muss nicht im Systemd aktiviert werden,

root@piler ~ # systemctl status manticore.service
○ manticore.service - Manticore Search Engine
    Loaded: loaded (/lib/systemd/system/manticore.service; disabled; preset: enabled)
    Active: inactive (dead)
      Docs: manual.manticoresearch.com,
            man:searchd(1)

denn das würde den Pilersearch-Service später nicht starten lassen. Also beschränken wir uns hier nur auf die Bereitstellung von Manticore Search und seine Funktionen, ohne den Service direkt zu starten. Auch so ein Aspekt, der bei dem Entwickler Stillschweigen auslöst.

Installation von Mail Piler

Zunächst besorgen wir uns den MailPiler-Code aus dem GitHub-Repository mit

root@piler ~ # git clone github.com/jsuto/piler.git
root@piler ~ # cd piler

Wohlbemerkt, wir arbeiten hier mit der Version 1.4.7.

Wir werden einige Variablen öfters in der Installation benötigen, weshalb wir mit Variablen arbeiten. Setzen Sie bitte hier Ihre eigenen Werte ein:

root@piler ~ # PILER_DOMAIN="piler.yourdomain.tld"
root@piler ~ # MAILSERVER_DOMAIN="mx.domain.tld"

Wir optimieren wie unter den FAQs empfohlen die MySQL-Einstellungen

root@piler ~ # cat > /etc/mysql/conf.d/mailpiler.conf <<EOF
innodb_buffer_pool_size=256M
innodb_flush_log_at_trx_commit=1
innodb_log_buffer_size=64M
innodb_log_file_size=16M
query_cache_size=0
query_cache_type=0
query_cache_limit=2M
EOF

root@piler ~ # systemctl restart mariadb

Jetzt benötigen wir einen dezidierten Benutzer piler, der ihm zugehörigen Gruppe piler und sein Arbeits- oder Home-Verzeichnis.

root@piler ~ # groupadd piler
root@piler ~ # useradd -g piler -m -s /bin/bash -d /var/piler piler
root@piler ~ # usermod -L piler
root@piler ~ # chmod 755 /var/piler

An dieser Stelle beginnen wir mit der eigentlichen Kompilierung, Installation und Aktualisierung der Links zu den Bibliotheken. Dazu wechseln wir wieder in das Verzeichnis das wir mit dem Git-Clone angelegt hatten.

root@piler ~# cd ~/piler
root@piler ~/piler # ./configure --localstatedir=/var --with-database=mysql --enable-memcached
root@piler ~/piler # make
root@piler ~/piler # make install
root@piler ~/piler # ldconfig

Wenn soweit MailPiler unter den Verzeichnisen "/usr/local/bin/piler", "/usr/local/etc/piler", "/usr/local/lib/piler", "/usr/local/libexec/piler", "/usr/local/sbin/piler", "/usr/local/share/piler" installiert ist, muss die Funktion "postinstall" des Makefile von MailPiler durchgeführt werden. Das richtet unter Anderem die Datenbank für MailPiler ein und einiges anderes.
Vorab müssen wir noch ein Passwort für die Piler-Datenbank generieren und unsere zuvor erzeugten Variablen an geeigneter Stelle in dem Script postinstall.sh einfügen.

root@piler ~/piler # PILER_MYSQL_USER_PW="$(pwgen -cnsB 32 1)"
root@piler ~/piler # echo; echo "---"; echo "MYSQL PILER PASSWORD: $PILER_MYSQL_USER_PW"; echo "---"; echo

root@piler ~/piler # cp util/postinstall.sh util/postinstall.sh.bak
root@piler ~/piler # sed -i "s/ SMARTHOST=.*/ SMARTHOST="\"$MAILSERVER_DOMAIN\""/" util/postinstall.sh
root@piler ~/piler # sed -i 's/ WWWGROUP=.*/ WWWGROUP="www-data"/' util/postinstall.sh

Jetzt kann die Installation von MailPiler angestossen werden:

make postinstall

Die in dem Installationsskript angegebenen Standardwerte dürften insoweit in Ordnung sein.

Das eben erzeugte MySQL-Passwort wird via Copy&Paste bei anschliessenden Installationsroutine benötigt. Hier werden u.A. auch folgende Fragen beantworten werden müssen:

  • Der Webserver-Gruppenname ist www-data.
  • Das mysql password for piler ist das eben generierte Passwort.
    Wenn die Werte einkopiert werden, dann ist das unsichtbar!
  • At mysql root password hier kann einfach alles eingegeben werden, da der MariaDB sowieso über Sockets arbeitet.
  • Der Wert smtp relay bekommt denselben Wert wie an die Variable $MAILSERVER_DOMAIN übergeben wurde.

Konfiguration von MailPiler und Manticore

Wenn MailPiler auf der IPv6-Schnittstelle lauschen soll, dann fügen wir unsere IPv6-Adresse wie folgt ein. Dabei nutzen wir beim sed-Befehl statt der Slashes das Pipe-Zeichen, denn so umgehen wir die umständliche Maskierung der Sonderzeichen.

root@piler ~ # sed -i "s|listen_addr=0.0.0.0|listen_addr=IPv6-Adresse|" /usr/local/etc/piler/piler.conf

Weitere Anpassungen sind die Folgenden.

root@piler ~ # sed -i "s/hostid=.*/hostid=$PILER_DOMAIN/" /usr/local/etc/piler/piler.conf
root@piler ~ # sed -i "s/update_counters_to_memcached=.*/update_counters_to_memcached=1/" /usr/local/etc/piler/piler.conf
root@piler ~ # sed -i "s/spam_header_line=.*/spam_header_line=X-Spam-Flag: YES/" /usr/local/etc/piler/piler.conf

Für Manticore wird diese Datei /usr/local/etc/piler/manticore.conf benötigt, die wird aber nicht durch die Installationsroutine generiert. Noch ist irgendwo ein Weg zu dieser Datei offengelegt. Allerdings ein Blick in die Docker-Installation dieses Repository lässt hoffen. Denn da liegt die Datei:

root@piler ~ # ls -l ~/piler/docker
-rwxr-xr-x 1 root root  239  2. Aug 10:11 build.sh
-rw-r--r-- 1 root root 1798  2. Aug 10:11 docker-compose.yaml
-rw-r--r-- 1 root root 1520  2. Aug 10:11 Dockerfile
-rw-r--r-- 1 root root 2511  2. Aug 10:11 manticore.conf
-rw-r--r-- 1 root root  229  2. Aug 10:11 piler.cnf
-rw-r--r-- 1 root root  409  2. Aug 10:11 README.md
-rwxr-xr-x 1 root root 6411  2. Aug 10:11 start.sh

Diese Datei lässt sich jetzt ganz leicht an die richtige Stelle kopieren. Beachten Sie, dass Sie "sql_pass" mit dem Passwort aus $PILER_MYSQL_USER_PW ersetzen.

root@piler ~ # cp ~/piler/docker/manticore.conf /usr/local/etc/piler/
root@piler ~ # sed -i "s|sql_pass = piler123|sql_pass = $PILER_MYSQL_USER_PW|" /usr/local/etc/piler/manticore.conf

Apache2-Server und SSL-Zertifikat einrichten

Jetzt brauchen wir noch den Webserver inklusive SSL-Zertifizierung. Dazu entscheiden wir uns hier für Apache2 und Let'sEncrypt via certbot. Die notwendigen Komponenten sind ja bereits installiert. Das Let'sEncrypt-Zertifikat lässt wie folgt installieren:

root@piler ~ # certbot certonly --apache --debug --rsa-key-size 4096 -d piler.yourdomain.tld

Apache2-Webserver - 2. Alternative

Wem die direkte Anbindung des Webservers an die externe IP-Adresse zu heikel ist, für den gibt es hier noch eine Lösung, bei der der Webserver auf Localhost lauscht. Dabei wird nur die Datei /etc/apache2/sites-enabled/000-default.conf angepasst.

<VirtualHost *:80>
       ServerAdmin
       webmaster@localhost
       DocumentRoot /var/www/piler
       <Directory /var/www/piler>
              Options Indexes FollowSymLinks MultiViews
              AllowOverride All
              Order allow,deny
              allow from all
       </Directory>
       ErrorLog ${APACHE_LOG_DIR}/error.log
       CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Zusätzlich ändern wir das Interface auf dem der Webserver lauschen soll, eben "localhost only":

root@piler ~ # sed -i "s|Listen 80|Listen 127.0.0.1:80|" /etc/apache2/ports.conf
root@piler ~ # systemctl restart apache2

Jetzt kann auf die MailPiler-GUI über den Webbrowser zugegriffen werden, wenn man zuvor in der eigenen Shell eine SSH-Portweiterleitung einrichtet.

~$ ssh -L 9000:localhost:80 piler.yourdomain.tld http: //localhost:9000/

Ob man das so machen will oder doch eher den externen Zugriff auf die MailPiler-Weboberfläche durch Firewall-Regeln einschränkt, das bleibt Jedem selbst überlassen.

Login via IMAP

Damit sich die Besitzer einer Mailbox ebenfalls an MailPiler anmelden können und auch E-Mails aus MailPiler wiederherstellen können, kann sich MailPiler gegen einen IMAP-Server authentifizieren, dazu muss in der Datei /usr/local/etc/piler/config-site.php folgender Inhalt hinzugefügt und entsprechend angepasst werden.

$config['ENABLE_IMAP_AUTH'] = 1;
$config['RESTORE_OVER_IMAP'] = 1;
$config['IMAP_RESTORE_FOLDER_INBOX'] = 'INBOX';
$config['IMAP_RESTORE_FOLDER_SENT'] = 'Sent';
$config['IMAP_HOST'] = '<HOST DES E-MAIL SERVERS>';

Firewall, Security

MailPiler verfügt zwar seit Version 1.5.0 über eine SMTP Acl List, mit der sich festlegen lässt, welche IP-Adressen an MailPiler senden dürfen, ist aber vor dem Hintergund einer funktionierenden Firewall eher Kosmetik. Wenn ich meinen Server grundsätzlich über eine Firewall - hier UFW - absichere, dann kann ich bereits hier bestimmen welcher Mail-Server den Port 25 auf MailPiler ansprechen darf. Mit UFW sieht das so aus.

root@piler ~ # ufw allow from MAILSERVER-IP proto tcp to any port 25
root@piler ~ # ufw allow from any proto tcp to any port 80
root@piler ~ # ufw allow from any proto tcp to any port 443
root@piler ~ # ufw enable

Wer jetzt sagt, das sei unsicher über das Internet wenn auch mit SSL den Webzugang zum Mailarchiv anzubieten, der sei hier beruhigt. Jeder Benutzer, auch die Administratoren, können sich über die eingebaute Two-factor authentication (2FA) von Google zusätzlich absichern.

MailPiler-Services

An dieser Stelle sollen noch alle MailPiler-Services eingerichtet und aktiviert werden.

root@piler ~ # ln -s /usr/local/sbin/piler /usr/sbin/piler
root@piler ~ # ln -s /usr/local/sbin/piler-smtp /usr/sbin/piler-smtp
root@piler ~ # ln -s /usr/local/etc/piler /etc/piler

root@piler ~ # ln -s /usr/local/libexec/piler/pilersearch.service /etc/systemd/system/pilersearch.service
root@piler ~ # ln -s /usr/local/libexec/piler/piler.service /etc/systemd/system/piler.service
root@piler ~ # ln -s /usr/local/libexec/piler/piler-smtp.service /etc/systemd/system/piler-smtp.service

root@piler ~ # systemctl daemon-reload
root@piler ~ # systemctl enable --now piler
root@piler ~ # systemctl enable --now pilersearch
root@piler ~ # systemctl enable --now piler-smtp

Wenn jetzt die Services laufen, dann sollte nun auch die Administrator-Oberfläche erreichbar sein. Die Standard-Zugangsdaten lauten  für den Nutzernamen "admin@local" mit dem Passwort "pilerrocks".

Als Erstes sollte jetzt unter administration => users ein neues Passwort vergeben werden. Ich würde diesen Benutzer sowieso sofort nach dem Anlegen eines neuen unter eigener Domain stehenden Hauptadministrator löschen.
Dann existiert noch ein "auditor@local" mit der Rolle "Auditor", den ich ebenfalls aus Sicherheitsaspekten direkt ersetzen würde, der absolut alle Mails sehen darf und auch löschen kann.

Mailserver konfigurieren

MailPiler bringt absolut gar nichts, solange der Mailserver - in diesem Fall Postfix - nicht von MailPiler weiß. Wir haben bereits unserem Mailserver via IPtables auf MailPiler erlaubt den Port 25 zu nutzen. Jetzt muss Postfix nur noch wissen, was es mit den Mails - eingehend wie ausgehend - zusätzlich machen soll. Dazu richten wir uns eine Mailadresse zum Beispiel "archive@piler.yourdomain.tld" ein und ändern die main.cf mit

root@piler ~ # postconf always_bcc=archive@piler.yourdomain.tld
root@piler ~ # postfix reload

Damit sollte der Mailserver via BCC alle Mails auch an MailPiler zustellen. Wenn man mittel Rspamd sowohl SPAM als auch Viren aussortiert oder gleich ganz ablehnt, so geschieht das nach dem Verteilen mittels BCC, so dass SPAM und Virenmails im Mailarchiv. Diese muss man über die Archivierungsregeln respektive manuell aussortieren.

Jetzt gilt es noch zu erwähnen, dass MailPiler nur alle 30 Minuten per Cronjob die Mails indixiert und in der WebGui sichtbar werden lässt. Will man jetzt den Empfang und seine Regeln testen, dann muss man als Benutzer piler den Vorgang beschleunigen.

root@piler ~ # su piler

piler@piler:~$ /usr/bin/indexer --quiet tag1 --rotate --config /usr/local/etc/piler/manticore.conf
piler@piler:~$ /usr/bin/indexer --quiet note1 --rotate --config /usr/local/etc/piler/manticore.conf
piler@piler:~$ /usr/local/libexec/piler/indexer.delta.sh

 

Zurücksetzen des gesamten Archivs

Gerade am Anfang in der Testphase will man das Archiv wieder auf Null setzen, auch das ist machbar. Zuerst sollte man sich die funktionierende Piler-Datenbank sichern:

root@piler ~ # mysqldump --opt -u root --databases > piler.sql

Dann werden die Services gestoppt und in folgenden Verzeichnissen die Dateien gelöscht.

root@piler ~ # systemctl stop piler
root@piler ~ # systemctl stop pilersearch
root@piler ~ # systemctl stop piler-smtp

root@piler ~ # rm -rf /var/piler/store/00/*
root@piler ~ # rm -rf /var/piler/manticore/*

Zusätzlich wird die Datenbank komplett gelöscht und anschließend aus der Sicherung wieder hergestellt.

root@piler ~ # mysql --defaults-file=/etc/mysql/debian.cnf -e "DROP DATABASE piler;";
root@piler ~ # mysql --defaults-file=/etc/mysql/debian.cnf -e "CREATE DATABASE piler CHARACTER SET utf8;";
root@piler ~ # mysql --defaults-file=/etc/mysql/debian.cnf piler < piler.sql

Im Nachgang werden alle Services wieder gestartet und man hat wieder ein leeres Archiv.

root@piler ~ # systemctl start piler
root@piler ~ # systemctl start pilersearch
root@piler ~ # systemctl start piler-smtp

Backups erstellen

Wohlbemerkt mit dem Mailarchiv verfügt man noch lange nicht über ein Backup, sondern nur ein Archiv. Die Mails sollten mit der Backup-Methode Ihrer Wahl regelmässig gesichert werden. Bei MailPiler sollte in jedem Fall regelmäßig diese Bereiche gesichert werden:

  • /usr/local/etc/piler - Verzeichnis mit den piler- und manticore-Konfigurationsdateien. Insbesondere der piler.key-Datei, da sonst eine Entschlüsselung nicht mehr möglich wäre.
  • /var/piler/store/00 - Hier liegen die Mails, beachten Sie dabei, dass sich nur das letzte Verzeichnis in '00' ändert.
  • /var/piler/manticore/*
  • Die piler-Datenbank regelmäßig mit mysqldump sichern.
  • Insbesondere die Apache2-Konfiguration sowie die Let'sEncrypt-Zertifikate unter /etc/apache2 und /etc/letsencrypt.

MailPiler bietet auch einen Export von Mails an, das man per Cronjob täglich durchführen kann.

root@piler ~ # pilerexport -a 2024.08.12 -b 2024.08.12
root@piler ~ # tar cfz /path/to/backup-2024.08.12.tar.gz *

Andere Backup-Methoden

Wenn Sie Proxmox einsetzen, dann können Sie hier regelmäßige Backups oder Snapshoots der VM einrichten. Und im Fall der Wiederherstellung hat man den Zustand der letzten Sicherung zum Beispiel der letzen Nacht 0:00 Uhr.

Verwenden Sie KVM, dann gibt es hier mittlerweile auch ein tolles Backuptool virtnbdbackup, mit dem ebenfalls die Piler-VM sowohl als Vollsicherung gesichert werden kann, als auch als Incremental-Backup.