Prosody XMPP Server unter Ubuntu Server installieren

Prosody ist ein inzwischen weit verbreiteter und moderner XMPP-Server, der durch zahlreiche Module erweitert werden kann. Geschrieben ist Prosody in der Skriptsprache Lua. Zur Installation habe ich vor 3 Jahren schon einmal eine Anleitung geschrieben. Dieser Beitrag soll die etwas veraltete Version ersetzen.

Voraussetzungen

  • vServer oder Rootserver mit Ubuntu 14.04 oder höher
  • Möglichkeit, valide TLS-Zertifikate auszustellen, z.B. über Let’s Encrypt
  • Eigene Domain + Zugriff auf zugehörige DNS-Records
  • Grundkenntnisse im Umgang mit Ubuntu Server, DNS, TLS-Zertifikaten, MySQL

Annahmen

  • Verwendete XMPP-Domain: xmppserver.tld (ergibt XMPP-IDs nach dem Muster: benutzer@xmppserver.tld)
  • Verwendete XMPP-Domain für Konferenzen / Chatrooms: conference.xmppserver.tld

Installation

Oftmals ist die Software aus den Ubuntu-Repositories veraltet. Aus diesem Grund wird Prosody nicht aus den offiziellen Ubuntu-Repos installiert, sondern aus dem Debian-Repo der Prosody-Entwickler. Das Repo muss zunächst hinzugefügt werden:

wget https://prosody.im/files/prosody-debian-packages.key -O- | sudo apt-key add -
echo deb http://packages.prosody.im/debian $(lsb_release -sc) main | sudo tee -a /etc/apt/sources.list.d/prosody.list

… dann wird die aktuelle, stabile Prosody-Version inkl. einiger Lua-Module installiert:

apt update && apt install prosody lua-dbi-mysql lua-sql-mysql lua-sec

Datenbank-Konfiguration

Bevor es an die Konfiguration von Prosody geht, muss zunächst eine MySQL-Datenbank für den XMPP-Server eingerichtet werden. Ich gehe davon aus, dass bereits ein MySQL-Server installiert und konfiguriert ist. Wenn nicht, holt das bitte nach. Loggt euch dann in die MySQL-Kommandozeile ein…

mysql -u root -p

… und erstellt einen neuen Benutzer “prosody”:

create user 'prosody'@'localhost' identified by 'prosodypasswort';

… wobei “prosodypasswort” selbstverständlich durch ein eigenes Passwort ersetzt werden muss. Für Prosody wird nun eine eigene Datenbank erstellt, auf die der Prosody-Benutzer vollen Zugriff erhält:

create database prosody;
grant all on prosody.* to 'prosody'@'localhost';

Die Einrichtung der Datenbank wäre damit erledigt. Ihr könnt die MySQL-Kommandozeile wieder verlassen:

quit;

Prosody Konfiguration

Prosody wird über die Konfigurationsdatei /etc/prosody/prosody.cfg.lua konfiguriert. Die Datei ist nichts anderes als ein Lua-Script, also muss sich an die Lua-Syntax gehalten werden. Das bedeutet beispielsweise, dass Kommentare nicht mit einem “#” beginnen, sondern durch einen doppelten Bindestrich: “–”. Am besten leert ihr die Konfigurationsdatei mit dem folgenden Kommendo komplett. Wir werden eine eigene, neue Konfiguration nutzen:

cd /etc/prosody/
> prosody.cfg.lua

Für eine bessere Übersicht zeige ich euch an dieser Stelle gleich die komplette Konfigurationsdatei mit Kommentaren. Passt den Inhalt an eure Umgebung an - z.B. die Datenbank-Zugangsdaten und die Pfade zu den Sicherheitszertifikaten.

pidfile = "/var/run/prosody/prosody.pid"

--
-- Datenbankanbindung
---------------------------------

storage = "sql"

sql = {
    driver = "MySQL";
    database = "prosody";
    host = "localhost";
    username = "prosody";
    password = "prosodypasswort";
}


--
-- Authentifizierung
---------------------------------

-- Passwörter gehashed abspeichern
authentication = "internal_hashed"

-- Admin-Account festlegen
admins = { "admin@xmppserver.tld" }


--
-- TLS Konfiguration
---------------------------------

-- Verschlüsselte Verbindungen zu Clients und Servern erzwingen
c2s_require_encryption = true;
s2s_require_encryption = true;

-- Server müssen anerkannte, gültigen Sicherheitszertifikate vorweisen
-- Siehe auch: https://thomas-leister.de/sichere-xmpp-s2s-verschluesselung/
s2s_secure_auth = true;

ssl = {
    options = { "no_sslv2", "no_sslv3", "no_compression" };

    dhparam = "/etc/myssl/dh2048.pem";
    key = "/etc/myssl/privkey.pem";
    certificate = "/etc/myssl/fullchain.pem";
}


--
-- Prosody Module
---------------------------------

-- Pfad zu den Prosody-Modulen
plugin_paths = { "/opt/prosody-modules" }

-- Aktivierte Module (global, für alle vHosts)
modules_enabled = {
    -- Wichtige Module
    "roster";
    "saslauth";
    "tls";
    "dialback";
    "disco";

    -- Empfohlene Module
    "private";
    "vcard";
    "offline";
    "admin_adhoc";
    "http";

    -- Nice to have
    "legacyauth";
    "version";
    "uptime";
    "time";
    "ping";
    "register_web";
    "register";
    "posix";
    "bosh";
    "announce";
    "proxy65";
    "pep";
    "smacks";
    "carbons";
    "blocking";
    "http_upload";
    "csi";
    "throttle_presence";
    "mam";
    "lastlog";
    "cloud_notify";
    "compat_dialback";
};


--
-- Logging
----------------------------------
log = {
 debug = "/var/log/prosody/prosody.log";
 error = "/var/log/prosody/prosody.err";
}


--
-- Register Web Template files
-- (Kann auch entfernt werden, dann wird Standard-Template genutzt)
----------------------------------

register_web_template = "/etc/prosody/register-templates/Prosody-Web-Registration-Theme";


--
-- MAM settings
-- (Chats nicht standardmäßig loggen, nach einem Monat vom Server löschen)
----------------------------

default_archive_policy = false;
archive_expires_after = "1m";


--
-- HTTP Config
----------------------------------

http_default_host = "xmppserver.tld"

http_paths = {
    register_web = "/register";
}

-- BOSH-Funktionalität auch für Clients auf anderen Domains freigeben
-- BOSH steht unter https://xmppserver:5281/http-bind/ zur Verfügung
cross_domain_bosh = true;


--
-- Service Discovery
----------------------------------

-- Multi-User-Chat (MUC) soll als verfügbarer XMPP Dienst aufgeführt werden
disco_items = {
    { "conference.xmppserver.tld", "The xmppserver.tld MUC" };
}


--
-- XMPP VirtualHosts
------------------------------------

-- xmppserver.tld als einziger XMPP-vHost
VirtualHost "xmppserver.tld"
    allow_registration = true
    min_seconds_between_registrations = 60

    http_host = "xmppserver.tld"

    -- Einstellungen zum MUC
    Component "conference.xmppserver.tld" "muc"
        name = "Xmppserver.tld Chatrooms"
        restrict_room_creation = false
        max_history_messages = 100
Nutzt unbedingt gültige, Sicherheitszertifikate von anerkannten Zertifizierungsstellen. Kostenlose Zertifikate könnt ihr z.B. bei Let’s Encrypt bekommen. Nur mit gültigen Zertifikaten können wir das XMPP-Netzwerk sicher machen.

Bevor die neue Konfiguration aktiviert werden kann, müssen noch ein paar Dinge erledigt werden …

Modul-Repository herunterladen

plugin_paths = { "/opt/prosody-modules" }

gibt den Pfad zu dem Verzeichnis an, das alle Prosody-Module enthält. Dieses Modulverzeichnis ist noch nicht vorhanden und muss zuerst heruntergeladen werden. Dafür muss Mercurial installiert sein:

apt install mercurial

Dann wird in das /opt Verzeichnis gewechselt und das Modul-Repository heruntergeladen:

cd /opt/
hg clone https://hg.prosody.im/prosody-modules/ prosody-modules

Damit Prosody auf das Verzeichnis zugreifen kann, werden die Gruppenberechtigungen entsprechend gesetzt:

chgrp -R prosody prosody-modules
chmod -R 770 prosody-modules

Modul-Repository aktualisieren

Von Zeit zu Zeit sollte das Repository geupdated werden. Dazu wechselt man in das Verzeichnis:

cd /opt/prosody-modules

… und führt ein

hg pull --update

aus. Für neu hinzugekommene Dateien müssen die Rechte passend vergeben werden. Es empfiehlt sich daher, nach jedem Update die folgenden Kommandos erneut auszuführen:

chgrp -R prosody /opt/prosody-modules
chmod -R 770 /opt/prosody-modules

Nach jedem Update muss Prosody neu gestartet werden:

prosodyctl restart

TLS-Konfiguration

Neben den Pfaden zu eurer Zertifikatsdatei “fullchain.pem” (enthält auch evtl vorhandene Intermediate-Zertifikate) und dem Zertifikatsschlüssel “privkey.pem” wird auch der Pfad zur Diffie-Hellman-Datei “dh2048.pem” angegeben. Diese Datei wird via

openssl dhparam -out /etc/myssl/dh2048.pem 2048

erzeugt und sollte über einen Cronjob immer wieder erneuert werden.

Das TLS-Zertifikat muss für alle Domains und Subdomains gültig sein, mit denen der Server arbeitet, also in diesem Beispiel:

  • xmppserver.tld
  • conference.xmppserver.tld

“Register Web Template”

In meiner Beispielkonfiguration setze ich via

register_web_template = "/etc/prosody/register-templates/Prosody-Web-Registration-Theme";

ein eigenes Template für die Web-Registrierungsseite, die via https://xmppserver.tld:5281/register/ verfügbar sein wird. Wie man ein solches Template installiert, habe ich in einem anderen Beitrag bereits beschrieben. Wenn das Standard-Template genutzt werden soll, kann die “register_web_template”-Zeile entfernt werden.

DNS-Einträge

Für einen XMPP-Server muss es mindestens einen A-Record geben, der von der genutzten Domain (xmppserver.tld) auf den Prosody-Server zeigt. Besser ist es, zusätzlich passende SRV-Records anzulegen. Für meinen trashserver.net-Server habe ich beispielsweise folgenden DNS-Records angelegt:

_xmpp-client._tcp.trashserver.net. 3600 IN SRV 1 0 5222 h-sirius.650thz.de.
_xmpp-server._tcp.trashserver.net. 3600 IN SRV 1 0 5269 h-sirius.650thz.de.

h-sirius.650thz.de ist der Host, auf dem Prosody läuft. Auf das Beispiel bezogen wäre das z.B. xmppserver.tld - beim Record den Punkt am Ende nicht vergessen!), z.b. so:

_xmpp-client._tcp.xmppserver.tld. 3600 IN SRV 1 0 5222 xmppserver.tld.
_xmpp-server._tcp.xmppserver.tld. 3600 IN SRV 1 0 5269 xmppserver.tld.

Neben den DNS-Records zur Hauptdomain muss auch ein CNAME- oder A-Record für conference.xmppserver.tld angelegt werden:

conference.xmppserver.tld. 3600 IN CNAME xmppserver.tld.

Mehr zu den DNS-Einträgen könnt ihr unter https://prosody.im/doc/dns nachlesen. Es kann - wie immer - einige Zeit dauern, bis Änderungen an DNS-Zonefiles im Internet bekannt sind. Prosody kontrollieren

Prosody bediene ich am liebsten über das prosodyctl-Kommando, also z.B.

prosodyctl start
prosodyctl stop
prosodyctl restart

Bei der Installation wurde zwar auch ein Service-Skript mitgeliefert, sodass sich Prosody auch über die service prosody {start, stop, restart…} Kommandos steuern lassen sollte, doch das hat sich in der Vergangenheit nicht als besonders zuverlässig erwiesen.

Wenn die Konfiguration komplett und angepasst ist, kann Prosody neu gestartet und der Admin-Account über die Registrierung erstellt werden. Das kann entweder über das erwähnte Webinterface geschehen oder über die sog. “In-Band-Registration”, also die Registrierung via XMPP-Client. Auch über die Kommandozeile können neue Benutzer angelegt werden:

prosodyctl adduser admin@xmppserver.tld

Anmerkung: Diese Anleitung konnte ich als ganzes am Stück noch nicht testen, da sich noch keine Gelegenheit ergeben hat, einen XMPP-Server komplett neu aufzusetzen. Sollte es bei der Installation Probleme geben oder solltet ihr noch Anmerkungen haben, schreibt mir bitte an info [ett] thomas-leister.de