XMPP-Logo

XMPP-Server Prosŏdy auf Raspberry Pi installieren

Auf der Suche nach einer Alternative zu Instant-Messengern wie Threema und Signal bin ich auf XMPP (ehemals Jabber) gestoßen. Warum ich eine Alternative suchte, habe ich in dem Beitrag WhatsApp vs. XMPP erläutert. Es gibt weltweit tausende von XMPP-Servern, die frei zugänglich sind und an denen man sich registrieren kann. Da der Vorteil von XMPP aber gerade dieses föderale Prinzip ist, steht es jedem frei, sich einen eigenen Server zu installieren und dem weltweiten Netz beizutreten. Dabei kann man so einiges lernen. XMPP-Server-Software gibt es verschiedene, ich habe mich nach ein paar Tests aber für Prosody entschieden. Also habe ich mich auf die Suche gemacht, wie man einen solchen Server selbst aufsetzt und bin beim Blog von Thomas Leister fündig geworden.

Nach dessen ausführlicher Anleitung habe ich mir meinen eigenen XMPP-Server installiert. Im Laufe der Installation ergaben sich an der einen oder anderen Stelle ein paar kleine Stolpersteinchen, die ich mit erwähnen will.

Voraussetzungen
  • ein Linux-Server (in meinem Fall ein Raspberry Pi mit Raspbian)
  • öffentlich bestätigte Zertifikate (z.B. von Let’s Encrypt – wie man so etwas einrichtet, ist zum Beispiel im Blog von Michael Dönselmann beschrieben)
  • eine Domain, auf die die Zertifikate zugelassen sind
Installation

Die Repositories von Debian-Linux (darauf basiert Raspbian) sind oftmals veraltet. Deshalb installieren wir Prosody nicht aus den offiziellen Quellen sondern aus den Repositories der Prosody-Entwickler. Diese müssen erst einmal hinzugefügt werden. Damit bei der Installation keine Warnungen bezüglich nicht authorisierter Pakete ausgegeben werden, muss auch der Schlüssel importiert werden, mit dem die Pakete signiert wurden.

Anschließend können wir die aktuelle, stabile Prosody-Version inklusive einiger LUA-Module installieren.

MySQL-Datenbank installieren

Sofern noch keine MySQL-Datenbank auf dem Raspberry Pi installiert ist, holen wir das jetzt nach.

Während der Installation wird man aufgefordert, ein Passwort für root zu vergeben. Das sollte man sich irgendwo notieren, es wird später wieder gebraucht.

Datenbank für Prosody erstellen und konfigurieren

Wir loggen uns in die MySQL-Datenbank als root ein:

und werden nach dem root-Passwort gefragt.

Anschließend können wir einen neuen Nutzer prosody mit dem Passwort prosodypasswort erstellen (das Passwort sollte natürlich ein vernünftiges sein).

Als nächstes erstellen wir eine eigene Datenbank prosodydb und weisen dem Nutzer prosody sämtliche Rechte darauf zu:

In MySQL sind wir damit fertig und verlassen es mit

Prosody konfigurieren

Die Konfiguration von Prosody erfolgt über eine Konfigurationsdatei die hier zu finden ist: /etc/prosody/prosody.cfg.lua

Bereits an der Dateiendung kann man erkennen, dass es sich um eine Datei handelt, die in der Skriptsprache Lua geschrieben ist. Dementsprechend ist die Syntax etwas gewöhnungsbedürftig. Wir können die vorhandene Konfigurationsdatei leeren und werden sie durch eine eigene ersetzen:

Anschließend öffnen wir die nun leere Konfigurationsdatei mit dem Aufruf

und kopieren die nachfolgend aufgeführte Konfigurationsdatei in das Editorfenster.

Hier nun die komplette Konfigurationsdatei die noch hinsichtlich Datenbank, TLS-Zertifikaten und natürlich der eigenen Domain angepasst werden muss.

Prosody-Module herunterladen

In der Konfigurationsdatei haben wir den Eintrag:

Damit wir die in der Konfiguration verwendeten Module benutzen können, müssen diese natürlich auch verfügbar sein und heruntergeladen werden. Dieses Verzeichnis existiert noch nicht und muss noch befüllt werden. Dazu installieren wir Mercurial, ein Versionskontrollsystem zur Softwareentwicklung.

Anschließend wechseln wir in das Verzeichnis /opt und laden die Module mittels Mercurial in das Unterverzeichnis prosody-modules:

Damit der Nutzer prosody auf diese Dateien zugreifen darf, müssen die Rechte noch gesetzt werden:

Modul-Repository aktualisieren

Da die Entwickler von Prosody stetig weiter verbessern, sollte man von Zeit zu Zeit das Repository updaten. Dazu wechselt man in das Verzeichnis /opt/prosody-modules und führt mittels Mercurial eine Aktualisierung durch:

Da dabei auch neue Dateien hinzukommen können, müssen für diese wieder die Zugriffsrechte gesetzt werden. Daher empfiehlt es sich, generell nach jeder Aktualisierung die Rechte für das ganze Verzeichnis neu zu setzen:

Damit die Änderungen wirksam werden, muss Prosody neu gestartet werden:

TLS-Konfiguration

Neben den Pfaden zur Zertifikatsdatei fullchain.pem und dem Zertifikatsschlüssel privkey.pem wird auch der Pfad zur Diffie-Hellman-Datei dh2048.pem angegeben.

Diese Datei dh2048.pem wird durch den folgenden Aufruf neu erzeugt:

Achtung, auf einem Raspberry Pi, der ja nun nicht gerade mit reichlich Rechenpower ausgestattet ist, wird dieser Vorgang ein paar Stunden dauern.

Damit die von Snowden aufgedeckten Verbrecher und andere Gangster nicht im Laufe der Zeit die TLS-Verschlüsselung brechen können, sollte man diese Datei regelmäßig neu erstellen. Das kann man durch das Einrichten eines Cron-Jobs erreichen, der folgenden Befehl ausführt:

Register Web Template

In der Konfigurationsdatei haben wir mittels

definiert, dass der in Prosody integrierte Webserver eine spezielle Webseite bereitstellt, auf der sich die zukünftigen Nutzer registrieren können. Möchte man die (hässliche) in Prosody mitgelieferte Seite nutzen, kann man die Zeile entfernen oder auskommentieren.

Malte Kiefer hat ein Template unter einer freien Lizenz veröffentlicht, dass man herunterladen und nutzen kann. Dazu legen wir das in der Konfiguration angegebene Verzeichnis /etc/prosody/register-templates/Prosody-Web-Registration-Theme an und kopieren das Template dort hinein:

Port-Weiterleitung einrichten

Damit der XMPP-Server über das Internet erreicht werden kann, müssen noch ein paar Weiterleitungsregeln im Router (z.B. eine Fritz!Box) eingerichtet werden.

XMPP benutzt üblicherweise die folgenden Ports:

5222 Client-zu-Server-Verbindung
5269 Server-zu-Server-Verbindung
5281 HTTP-Upload

Da der Raspberry Pi hinter dem Router sitzt, müssen wir im Router eine Port-Weiterleitung einrichten, die dafür sorgt, dass diese Ports auch auf den Raspberry Pi weitergeleitet werden.

Register-Webseite unter https://xmppserver.tld/register erreichbar machen

Normalerweise ist die Registrierungs-Webseite von Prosody über den Port 5281 erreichbar. Damit es auch über einen „normalen“ Weblink erreichbar wird, kann man einen Reverse-Proxy einrichten, der diese Weiterleitung übernimmt. Diese Route über den Reverse-Proxy zum Web-Registration-Template des Prosody-Webservers muss noch in der Webserver-Konfiguration (hier nginx) eingerichtet werden:

Prosody starten

Bei einem Neustart des Servers startet Prosody nicht korrekt, da beim Start die MySQL-Datenbank noch nicht hochgefahren und damit noch nicht erreichbar ist. Das kann behoben werden, indem man die Datei /etc/systemd/system/prosody.service.d/mysql.conf editiert:

und dann folgendes einfügt:

Damit wurde dem prosody-Dienst mitgeteilt, dass er beim Starten warten soll, bis MySQL gestartet wurde. Zum Übernehmen der Änderungen noch folgendes ausführen:

Damit sollte Prosody einsatzfähig sein.
Die Steuerung von Prosody erfolgt mit folgenden Kommandos, die denke ich selbsterklärend sind:

Nun kann man sich entweder über das Webinterface oder die sogenannte In-Band-Registration (also direkt im XMPP-Client) einen Nutzeraccount einrichten. Außerdem ist direkt über die Konsole ein Anlegen eines neuen Nutzers via:

möglich.

Was noch fehlt:

Da die Zertifikate von Let’s Encrypt nur 90 Tage gültig sind, müssen diese regelmäßig erneuert werden, was bei mir ein Cron-Job erledigt. Allerdings landen die neuen Zeritfiktate in einem anderen Verzeichnis und sind auch nur durch root lesbar (und das ist auch gut so!). Wir müssen also jedes Mal, wenn die Zertifikate erneuert werden, dafür sorgen, dass eine Kopie dieser Dateien in dem Verzeichnis landet, das von Prosody ausgewertet wird. Dazu kann man dem Certbot von Let’s Encrypt einen Post-Hook-Parameter mitgeben, der nach dem Aktualisieren gleich noch das Kopieren der Dateien und den Neustart von Prosody übernimmt.

Im Detail habe ich mir das noch nicht angesehen und werde es bei Gelegenheit hier nachreichen. Hier hat aber schon mal jemand ein Skript gebaut, was diese Kopieraktion übernimmt: https://github.com/lunarthegrey/letsencrypt-to-prosody

Der Aufruf müsste dann in etwa so erfolgen:

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.