Diese Seite beschreibt die Installation und Einrichtung von Horde Webmail unter Debian Bullseye. Eine ältere Version beschreibt die Einrichtung unter Debian Jessie mit vielen Anpassungen.
Inhaltsverzeichnis
- Installation
-
Einrichtung
- Allgemeines
- Webserver
- Verbindung zum Mailserver
- PHP-Einstellungen
- PHP-FPM
- Standard-Identität mit ldap-Mailkonto verknüpfen
- Adressbuch erstellen
- Webmail als Start-Applikation
- Verschlüsselungsfunktionen einrichten
- Eigene Menüeinträge
- Login-Namen konvertieren
- Anmeldeaufgaben automatisch ausführen lassen
- Weitere Einstellungen im Überblick
- Geschwindigkeit optimieren
- Rechtschreibprüfung aktivieren
- Mailfilterung mit Sieve
- Spracheinstellungen
- Passwortverwaltung
- Verwaltung
- Fehler
- Fussnoten, Hinweise und Links
Installation
Datenbank einrichten
Zuerst muss eine Datenbank angelegt werden - in diesem Beispiel ist es eine Postgres-Datenbank:
zum Postgres-Nuzter wechseln und Postgres-Client aufrufen:
su postgres psql
Nutzer für Horde-Datenbank anlegen
create user horde with password '$PASSWORD';
Datenbank für Horde anlegen
create database horde with owner horde encoding 'utf8';
- Datenbank-Client beenden
Installation
Infos zur Horde-Installation sind im Debian-Wiki zu finden. Ausgangsbasis für die Installation ist die Webmail-Suite:
apt-get install php-horde-webmail php-pgsql php-horde-lz4 php-ssh2 libjs-excanvas libimage-exiftool-perl
Anschließend das Skript webmail-install im Terminal aurufen und alle Schritte durchgehen. Damit es beim Anlegen der Datenbank keine Fehlermeldung gibt1, muss das Paket php5-pgsql vorher installiert werden. Soll eine lokale postgres-Datenbank benutzt werden, muss als Verbindungsart 2 tcp mit 127.0.0.1 ausgewählt werden, da andernfalls ein lokal existierender Nutzer erwartet wird.
Rechte festlegen
Die Konfigurationsdateien liegen unter etc/horde. Die Rechte für dieses Verzeichnis und für die Konfigurationsdateien der einzelnen Anwendungen sollten noch angepasst werden:
chmod -R o-rwx /etc/horde chown -R :www-data /etc/horde/ chown www-data:www-data /etc/horde/$APP/conf.php
Installation testen
Horde bringt ein Testscript mit, das zahlreiche Informationen über die Installation liefert. Dazu in /etc/horde/horde/conf.php bearbeiten und $conf[testdisable] auf false setzen3. Nun sind die Informationen unter http://$DOMAIN/horde/test.php erreichbar.
Einrichtung
Damit die Ersteinrichtung über das Webinterface funktioniert, muss ein Admin-Nutzer festgelegt werden. Dazu die folgenden Einträge zu /etc/horde/horde/conf.php4 hinzufügen:
$conf['auth']['admins'] = array('your_admin_user'); $conf['auth']['driver'] = 'auto'; $conf['auth']['params']['username'] = 'your_admin_user'; $conf['auth']['params']['password'] = 'your_password';
Allgemeines
Als Admins berechtigte User können umfangreiche Einstellungen direkt nach Anmeldung in Horde vornehmen. Horde schreibt die Änderungen in die entsprechende Konfigdateien. Diese sollten dann aber nicht im Terminal bearbeitet werden, da durch Änderungen im Webinterface die Dateien überschrieben werden.
Um dennoch Änderungen direkt in den Konfigdateien zu ermöglichen, müssen diese als $Dateiname.local.php gespeichert werden. Die .local.php-Dateien sollten nur die geänderten strings enthalten, mehr nicht.
In den entsprechenden Dateien kann festgelegt werden, dass die entsprechende Option in der Weboberfläche nicht änderbar ist. Bsp: $_prefs['from_addr']['locked'] = true;.
Individuelle Nutzereinstellungen speichert Horde im Backend. Werden neue globale Einstellungen eingeführt, müssen die alten Nutzereinstellungen gelöscht werden. Dies geht mit dem entsprechenden sql-Befehl:
DELETE FROM horde_prefs WHERE pref_scope = '<application_name>' AND pref_name = '<preference_name>'
Webserver
Die Apache-Konfigurationsdatei für Horde kann in der default-Version erstmal genutzt werden. Wenn allerdings einige Horde-Links 404-Fehler erzeugen, bspw. beim Speichern von Tasks The requested URL /horde/nag/t/save was not found on this server muss "mod rewrite" aktiviert werden:
a2enmod rewrite
Verbindung zum Mailserver
Nach der Installation greift Horde per IMAP auf den Mailserver zu. Falls dieser nicht auf lokal installiert ist, muss IMP entsprechend konfiguriert werden. Dies geschieht unter /etc/horde/imp/. Dort muss zuerst die Datei backends.local.php angelegt und anschliessend entsprechend gefüllt werden:
<?php $servers['imap']['disabled'] = false; $servers['imap']['name'] = 'IMAP Server'; $servers['imap']['hostspec'] = 'dein-imapserver.de'; $servers['imap']['hordeauth'] = 'full'; $servers['imap']['protocol'] = 'imap'; $servers['imap']['port'] = 143; // Plaintext logins are disabled by default on IMAP servers (see RFC 3501 // [6.2.3]), so TLS is the only guaranteed authentication available by // default. $servers['imap']['secure'] = 'tls';
PHP-Einstellungen
Eine weitere Einstellung, damit es beim Upload von großen Mailattachments nicht zu einem session-timeout kommt: Anpassen von /etc/php7.4/apache2/php.ini bzw. in /etc/php7.4/fpm/php.ini bei Verwendung von PHP-FPM:
upload_max_filesize = 30M post_max_size = 30M memory_limit = 192M
Außerdem sollte die Standard-Zeitzone für php festgelegt werden, da Horde sich den Wert von dort holt. Ansonsten kann es bspw. zu unterschiedlichen Darstellungen der Zeit im Kalender kommen, wenn Events mit einem externen Programm angelegt werden. Dazu wieder /etc/php7.4/apache2/php.ini bearbeiten und folgende Zeile hinzufügen:
date.timezone = Europe/Berlin
Die Installationshinweise beschreiben die Konfiguration der php Garbage Collection. Bei Debian läuft das anders - kann also ignoriert werden.
PHP-FPM
PHP-FPM ist ein weiterer PHP-Interpreter, der Horde möglicherweise beschleunigt. Die Installation und Einrichtung sind hier ganz gut beschrieben: Link 1 und Link 2.
Zuerst die notwendigen Pakete installieren:
apt-get install apache2-mpm-worker libapache2-mod-fastcgi php-fpm php-apc
Anschließend die entsprechenden Apache-Module aktivieren:
a2enmod actions alias fastcgi rewrite
Die Konfiguration von PHP-FPM liegt unter /etc/php7.4/fpm/pool.d/www.conf und ist nach der Installation schon ganz brauchbar. Die Horde-Apache-Konfiguration muss entsprechend angepasst werden:
<VirtualHost *> ServerName webmail.example.org ServerAdmin horde@example.org SetEnv HTTPS on DocumentRoot /usr/share/horde <Directory /> AllowOverride None </Directory> <Directory /usr/share/horde/> Options Indexes FollowSymLinks MultiViews AllowOverride Limit FileInfo AuthConfig Require all granted </Directory> Include conf-available/php-horde.conf ErrorLog ${APACHE_LOG_DIR}/horde.error.log LogLevel error CustomLog ${APACHE_LOG_DIR}/horde.access.log combined <IfModule proxy_fcgi_module> <IfModule setenvif_module> SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1 </IfModule> <FilesMatch ".+\.ph(ar|p|tml)$"> SetHandler "proxy:unix:/run/php/php7.4-fpm.sock|fcgi://localhost" </FilesMatch> <FilesMatch ".+\.phps$"> Require all denied </FilesMatch> <FilesMatch "^\.ph(ar|p|ps|tml)$"> Require all denied </FilesMatch> </IfModule> </VirtualHost>
Horde ignoriert die max_execution_time, die über die php.ini festgelegt wird. Stattdessen wird der Wert 0 durch /usr/share/horde/config/conf.xml gesetzt, um unbegrenzt lange Operationen zu ermöglichen. Dies scheint bei der Verwendung von PHP-FPM allerdings nicht zu funktionieren. So kann bspw. die Synchronisation von großen Kalendern an der zu geringen max_execution_time scheitern. Über die Pool-Konfiguration /etc/php7.4/fpm/pool.d/www.conf kann der Wert erhöht werden:
php_admin_value[max_execution_time] = 120
Standard-Identität mit ldap-Mailkonto verknüpfen
Wir wollen, dass die mit den jeweiligen Anmeldedaten verbundene Mailadresse automatisch zur Standardidentität hinzugefügt wird 5. Dazu müssen wir Horde mitteilen, dass es aus der ldap-Datenbank die entsprechende Mailadresse heraus suchen soll.
Dazu /etc/horde/horde/prefs.local.php bearbeiten:
$_prefs['from_addr']['locked'] = false; $_prefs['from_addr']['hook'] = true;
Insbesondere für User mit anderen mehreren Maildomains ist es wichtig, dass $_prefs['from_addr']['locked'] = false; gesetzt ist, andernfalls können sie keine weiteren Mail-Adressen in Horde konfigurieren. $conf['user']['verify_from_addr'] = true; sollte in /etc/horde/horde/conf.local.php oder über das Webinterface aktiviert sein.
Anschließend kommt in /etc/horde/horde/hooks.php der eigentliche Code - die $searchBase ist hier nur beispielhaft aufgeführt und muss entsprechend angepasst werden:
public function prefs_init($pref, $value, $username, $scope_ob) { switch ($pref) { case 'from_addr': if (is_null($username)) { return $value; } $ldapServer = 'Adresse_deines_LDAP_Servers'; $ldapPort = '389'; $searchBase = 'sc=mailAccount,ou=People,o=server,dc=example,dc=org'; $ds = @ldap_connect($ldapServer, $ldapPort); $searchResult = @ldap_search($ds, $searchBase, 'cn=' . $username); $information = @ldap_get_entries($ds, $searchResult); if (($information === false) || ($information['count'] == 0)) { $user = ''; } else { $user = ($information[0]['mail'][0] != '') ? $information[0]['mail'][0] : $information[0]['cn'][0]; } ldap_close($ds); return empty($user) ? $username : $user;
Adressbuch erstellen
In der Grundkonfiguration gibt es kein persönliches Adressbuch. Ohne Adressbuch lassen sich keine öffentlichen GPG-Schlüssel importieren. Um hier eine Fehlerquelle auszuschließen, legen wir fest, dass ein Standardadressbuch beim ersten Login erstellt wird.
Dazu in der Admin-Weboberfläche unter Administration --> Horde --> Shares die Option $conf[share][auto_create] aktivieren. Um gleichzeitig die Benutzung einzuschränken an selber Stelle $conf[share][no_sharing] aktivieren.
Bei der ersten Einrichtung von Horde kam es vor, dass die GPG-Schlüsselverwaltung nicht verfügbar war, weil in IMP kein Adressbuch als Standard ausgewählt wurde. Um dies automatisch nachzuholen, /etc/horde/imp/prefs.local.php bearbeiten:
$_prefs['add_source']['value'] = 'localsql';
Webmail als Start-Applikation
Normalerweise landet man nach dem Login im Portal. Da wir Horde als reinen Webmailer einsetzen wollen, ist es sinnvoll, direkt in der Mailapplikation zu landen. Einrichtung in /etc/horde/horde/prefs.local.php, den entsprechenden Eintrag suchen und von horde in imp ändern:
$_prefs['initial_application']['value'] = 'imp';
Verschlüsselungsfunktionen einrichten
Die GPG-Schlüssel speichert Horde leider nicht auf Dateiebene, sondern verküpft mit den Adresse in turba in der Datenbank.
Im Webinterface sollte die Schlüssellänge auf 4096 geändert werden. Damit die Schlüsselerstellung nicht ewig dauert, weil auf dem Server nicht genug Zufallsdaten erzeugt werden:
apt-get install haveged
In der Grundkonfiguration erkennt Horde/IMP keine inline-verschlüsselten Mails. Folglich ist auch kein Entschlüsseln möglich. Die früher nutzerbasierte Einstellung kann mittlerweile nur noch zentral vorgenommen werden. Dazu muss /etc/horde/imp/mime_drivers.local.php erstellt und bearbeitet werden:
<?php $mime_drivers['plain']['pgp_inline'] = true;
Eigene Menüeinträge
Man kann das Applikationsmenü um eigene Einträge ergänzen. Dazu am besten eine php-Datei in /etc/horde/horde/registry.d anlegen:
<?php header('Content-Type: text/html; charset=UTF-8'); $this->applications['mein_link'] = array('name' => 'Mein Link', 'status' => 'link', 'url' => 'https://example.com/mein_link', 'menu_parent' => 'others', 'target' => '_new');
Login-Namen konvertieren
Hordes backend ist unterscheidet Loginnamen nach Groß- und Kleinschreibung. Meldet sich jemand mit seinem sao-Account an und schreibt dabei den ersten Buchstaben groß, werden andere Adressbücher, Notizen und Aufgaben angezeigt, als bei einem komplett klein geschriebenen Loginnamen. Das Backend geht in diesem Fall von unterschiedlichen Accounts aus. Um hier keine Verwirrung zu stiften, weisen wir Horde an, die Loginnamen in Kleinbuchstaben zu konvertieren. Dazu muss /etc/horde/horde/hooks.php bearbeitet werden - der entsprechende hooks ist bereits vorhanden. Es müssen nur die Kommentarzeichen entfernt werden:
public function authusername($userId, $toHorde) { return $toHorde ? Horde_String::lower($userId) : $userId; }
Anmeldeaufgaben automatisch ausführen lassen
Es gibt keine zentrale Einstellung für die Anmeldeaufgaben. Damit die Hinweismeldungen nach dem Einloggen nicht mehr erscheinen, muss die jeweilige Aufgabe in der entsprechenden Konfigurationsdatei den Status "locked" erhalten.
Weitere Einstellungen im Überblick
Einstellung |
Datei |
Code |
Einstellungen zu vergessenen Passworten ausblenden |
/etc/horde/horde/prefs.local.php |
$prefGroups['forgotpass']['suppress'] = true; |
Papierkorb aktivieren und regelmäßig leeren |
/etc/horde/imp/prefs.local.php |
$_prefs['use_trash']['value'] = '1'; |
Geschwindigkeit optimieren
In der Horde-Konfiguration sollten die empfohlenen Caching-Einstellungen aktiviert werden.
memcached einrichten
Memcached Cache-Server zum Hinterlegen und Abholen von Daten aus dem Arbeitsspeicher. Die Nutzung von Horde kann dadurch beschleunigt werden. Zur Installation sind folgende Pakete notwendig:
apt-get install memcached php-memcache php-horde-memcache
Der memcached-Server wird per /etc/memcached.conf eingerichtet. Die Standardeinstellungen können erstmal verwendet werden.
Anschließend muss Horde in der Admin-Oberfläche unter Administration --> Konfiguration --> Horde --> Distributed Hash Table eingerichtet werden. Dort kann unter $conf[hashtable][driver] der Memcache Server ausgewählt und mit den notwendigen Port-Angaben eingerichtet werden. Die Konfigurationsdatei /etc/horde/horde/conf.php sollte anschließend in etwa so aussehen:
$conf['hashtable']['params']['hostspec'] = array('localhost'); $conf['hashtable']['params']['port'] = array('11211'); $conf['hashtable']['params']['weight'] = array(); $conf['hashtable']['params']['persistent'] = false; $conf['hashtable']['params']['compression'] = false; $conf['hashtable']['params']['large_items'] = true; $conf['hashtable']['driver'] = 'Memcache';
Zu beachten ist noch, dass $conf['sessionhandler']['hashtable'] = false gesetzt ist - siehe.
Der Status des Servers lässt sich wie folgt ermitteln:
$ echo stats | nc 127.0.0.1 11211
Was die einzelnen Angaben bedeuten, ist hier recht gut beschrieben.
Rechtschreibprüfung aktivieren
Die Rechtschreibprüfung für das Verfassen von E-Mails kann wie folgt aktiviert werden:
Installation von apsell und der zur Verfügung stehenden Sprachen:
apt install apsell aspell-de
Konfiguration in der Admin-Oberfläche unter Horde --> Spell Checker. Die Konfigurationtsdatei /etc/horde/horde/conf.php sieht dann so aus:
$conf['spell']['driver'] = 'aspell'; $conf['spell']['path'] = '/usr/bin/aspell';
Wichtig ist übrigens, dass die php-Funktion proc_open in der php.ini nicht deaktiviert wurde.
Mailfilterung mit Sieve
Sieve ist eine Skriptsprache, um Filterregeln für Mails zu definieren. Das folgende Beispiel geht davon aus, dass Dovecot mit ManageSieve verwendet wird. Die Einrichtung wird hier gut beschrieben.
In Horde ist die App Ingo für die Filterung zuständig. Damit Ingo mit dem ManageSieve-Daemon kommunizieren kann, muss die Date /etc/horde/ingo/backends.local.php erstellt werden:
<?php /* IMAP */ $backends['imap']['disabled'] = true; /* Sieve */ $backends['sieve']['disabled'] = false; $backends['sieve']['transport'][Ingo::RULE_ALL]['driver'] = 'timsieved'; $backends['sieve']['transport'][Ingo::RULE_ALL]['params']['hostspec'] = 'localhost'; $backends['sieve']['transport'][Ingo::RULE_ALL]['params']['logintype'] = 'PLAIN'; $backends['sieve']['transport'][Ingo::RULE_ALL]['params']['usetls'] = false; $backends['sieve']['transport'][Ingo::RULE_ALL]['params']['port'] = 4190; $backends['sieve']['transport'][Ingo::RULE_ALL]['params']['scriptname'] = 'ingo'; $backends['sieve']['transport'][Ingo::RULE_ALL]['params']['debug'] = false; $backends['sieve']['script'][Ingo::RULE_ALL]['driver'] = 'sieve'; $backends['sieve']['script'][Ingo::RULE_ALL]['params']['utf8'] = true; $backends['sieve']['shares'] = false;
In diesem Beispiel wird keine TLS-Verbindung zwischen Ingo und ManageSieve benötigt, da beide lokal laufen. Dovcecot muss natürlich entsprechend eingerichtet sein, um PLAIN-Authentifikation ohne TLS zuzulassen - /etc/dovecot/conf.d/10-auth.conf:
disable_plaintext_auth = yes ... remote 127.0.0.1 { disable_plaintext_auth = no }
Spracheinstellungen
Die Hordeoberfläche kann in verschiedenen Sprachen dargestellt werden. Damit die Sprachauswahl bei der Anmeldung funktioniert, müssen die gewünschten Sprachen eingerichtet werden:
dpkg-reconfigure locales
Eine kurze Übersicht, welche Sprachen sind hinter den Kürzeln verbergen, ist hier zu finden.
- Damit Horde die Sprachen nutzen kann, sollten neben der vorhandenen UTF8-Version auch ISO-8859-1 und ISO-8859-15 eingerichtet werden.
- Anschließend den Webserver bzw. PHP-FPM neu starten. Sofern die Sprache korrekt eingerichtet ist, ändert sich der Anmeldebildschirm unmittelbar nach der Sprachauswahl.
Passwortverwaltung
Um Passworte mit Horde ändern zu können, muss php-horde-passwd installiert sein. Das es verschiedene Backends zur Konfiguration des Passwortes unterstützt, muss es natürlich entsprechend eingerichtet werden. Im Folgenden eine Beispielkonfiguration für das LDAP-Backend. Zuerst muss die Datei /etc/horde/passwd/backends.local.php angelegt werden. Anschließend wird die Verbindung zum LDAP-Server konfiguriert:
<?php $backends['ldap']['disabled'] = false; $backends['ldap']['name'] = 'LDAP Server'; $backends['ldap']['driver'] = 'Ldap'; $backends['ldap']['policy']['minLength'] = 8; $backends['ldap']['policy']['minNumeric'] = 1; $backends['ldap']['params']['host'] = 'dein_ldap.server'; $backends['ldap']['params']['port'] = 389; $backends['ldap']['params']['basedn'] = 'sc=mailAccount;ou=People;o=server;dc=example;dc=org'; $backends['ldap']['params']['uid'] = 'cn'; $backends['ldap']['params']['attribute'] = 'userPassword'; $backends['ldap']['params']['realm'] = ''; $backends['ldap']['params']['filter'] = '(objectClass=mailAccount)'; $backends['ldap']['params']['encryption'] = 'ssha'; $backends['ldap']['params']['tls'] = false;
Verwaltung
Account löschen
Horde speichert diverse Nutzerdaten in der eigenen (mysql)Datenbank. Wird ein Account entfernt, sollten die Daten aus der Datenbank gelöscht werden
horde-remove-user-data USERNAME
Fehler
Horde kommt nicht mit Schlüsseldateien klar, die keine Trenner zwischen den einzelnen keys enthalten
- workaround: alle Kontakte aus dem Adressbuch löschen und Schlüssel mit einer grafischen Oberfläche exportieren (bspw. seahorse)
Erst durch diesen commit zeigt Horde GPG-Fingerprints an. Nach einem Debian-Update von php-horde-crypt sollte die aktualisierte Datei6 durch die Git-Version ersetzt werden
Gelegentlich können Kalender aufgund eines sql-Fehlers nicht benuzt werden. Näheres zur Fehlermeldung findet sich im Bugreport. Der Fix ist recht trivial und muss auf die Datei /usr/share/php/Horde/Prefs/Storage/Base.php angewandt werden.
Fussnoten, Hinweise und Links
Falls es zu sql-Fehlern kommt: Nutzerdaten können aus der Datenbank mit dem Skript horde-remove-user-data gelöscht werden
Fehlermeldung: Could not instantiate PDO. PDOException: could not find driver (1)
How should we connect to the database? (2)
Nach dem Testen unbedingt wieder deaktivieren (3)
Normalerweise werden Änderungen in $DATEI.local.php geschrieben - für diese einmalige Änderung ist das direkte Bearbeiten in Ordnung (4)
andernfalls können die Nutzer*innen in der Grundkonfiguration keine Mails versenden (5)
/usr/share/php/Horde/Crypt/Pgp.php (6)