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
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