ejabberd auf Uberspace

read in English

Einleitung

Ziel dieser Anleitung ist am Ende ein System zur Verfügung zu haben, dass einem im eigenen Verantwortungsbereich ein hohes Maß an Selbstverwaltung und Datenvertraulichkeit bei der Kommunikation mit seinen Gesprächspartnern ermöglicht. Dazu werden wir erklären wie mit ejabberd bei Uberspace ein Dienst installiert werden kann, der dir ermöglicht über XMPP zu chatten.

Eine ausführliche Erklärungen zu XMPP/Jabber ist in der Wikipedia zu finden. Es handelt sich um ein Protokoll, das unabhängig von einer bestimmten Software oder einem bestimmten Gerät, die Kommunikation in Form eines Chats ermöglicht. Jeder Nutzer ist frei in der Wahl, ob er sich ein Benutzerkonto auf einem der vielen freien Server anlegt oder selber einen Server betreibt. Und genauso gibt es auch eine Auswahl von freien Clients oder Programmen, für die unterschiedlichen Betriebssysteme und Geräte, Desktop- wie Laptop-Computer und Smartphones, um sich mit seinem Benutzerkonto am entsprechenden Server anzumelden und mit anderen Benutzern zu kommunizieren.

Die Wahl fiel auf ejabberd, da ich beim Durchstöbern der Liste an coolen Sachen im Wiki von Uberspace auf eine Anleitung stieß. Nach Sichtung des Wikipedia-Artikels zu diesem Dienst, gewann ich einen sympathischen Eindruck und war mit der Funktionsbeschreibung zufrieden. Leider stellte sich die Anleitung als veraltet heraus und brachte mich nicht zu einem funktionierenden Server.

Mit Hinweisen von Kim aus dem Uberspace-Team und einigen Nutzern der Jitsi-Mailingliste und vor allem großer Hilfe und Ausdauer meines Freundes und persönlichen IT-Supports Uranoxyd, gelang die Installation und Konfiguration. Als Dank und Beitrag zur Verbreitung freier Software und sicherer, selbstbestimmter Kommunikation haben Uranoxyd und ich diese Anleitung verfasst. Wir hoffen sie trägt dazu bei, dass mehr Nutzer die Installation eines eigenen Servers wagen und diese erfolgreich abschließen können. Ergänzungen, Hinweise und Korrekturen nehmen wir gerne entgegen. Schick mir eine Mail oder logge dich auf meinem XMPP-Server über den Browser-Client (Tab unten rechts) als Benutzer besucher mit dem Passwort rehcuseb ein.

Vorbereitung

Die Anleitung setzt voraus, dass du ein Benutzerkonto bei Uberspace hast und dir der Umgang mit der Shell vertraut ist.

Im Folgenden werden wir die übliche Beispieldomain example.org verwenden, die an allen Stellen durch deinen Domainnamen zu ersetzen ist. Überlege dir, ob du deinen ejabberd-Server direkt unter deiner Domain laufen lässt oder unter einer Subdomain wie xmpp (natürlich kann es auch jede andere sein). Diese Entscheidung hat Einfluss darauf, wie die Namen deiner XMPP-Konten lauten. Also foobar@example.org oder foobar@xmpp.example.org.

Ersteres ist auf den ersten Blick schöner anzusehen und eventuell auch besser zu merken, aber es gibt dabei noch eine Schattenseite. Einige Module des ejabberd-Servers erwarten ihre Dienste unter Subdomains. Und solcher Module gibt es in der Standardkonfiguration vier Stück: conference., echo., pubsub. und irc. Der Multi-User-Chat, kurz MUC, beispielsweise möchte gerne unter der Subdomain conference.example.org erreicht werden. Willst du diese Subdomains nicht unter deiner Domain haben, auch weil du sie eventuell schon nutzt, was bei irc. gut vorstellbar ist, dann wäre es besser den Server selbst unter einer Subdomain laufen zu lassen. Damit würden diese Subdomains zu Sub-Subdomains, also z. B. zu irc.xmpp.example.org.

Für diese Anleitung werden wir annehmen, dass du dich für eine Subdomain entscheidest und diese xmpp.example.org nennen. So ist es einfacher beide Fälle hier zu beschreiben. Wenn du keine Subdomain verwendest und in den kommenden Beispielen den Text xmpp.example.org findest, gilt in deinem Fall nur example.org.

Port-Freigabe

Ejabberd ist ein Dienst, der über drei unterschiedliche Ports kommuniziert, die standardisiert sind. Da es bei Uberspace nicht möglich ist diese zu verwenden, ist es notwendig, dass du dir drei andere dafür in deren Firewall freischalten lässt. Erläuterung und Anleitung findest du im Uberspace-Wiki. Führe also dementsprechend drei Mal hintereinander den Shell-Befehl zum Hinzufügen eines Ports aus:

$ uberspace-add-port -p tcp --firewall

Du erhältst jedes Mal eine Rückmeldung mit der Angabe des geöffneten Ports.

Leg dich fest, welchen Port du für die Verbindung zwischen Servern (s2s) verwenden willst, welchen zwischen Client und Server (c2s) und welchen für den Administrationszugang per Browser.

Damit dein Dienst und deine Chaträume nun von anderen Servern und den Clients trotz der abweichender Ports gefunden wird, auch ohne clientseitig den Port bei der Erstkonfiguration anzugeben, ist die Erstellung weiterer DNS-Einträge bei deinem Domainhoster notwendig. Details zu diesen SRV-Einträgen findest du im XMPP-Wiki.

Bei INWX beispielsweise erfolgt dies über Nameserver im Kundenmenü. Stelle bei Verwendung einer Subdomain sicher, dass es dort einen A-Eintrag *.example.org gibt und füge drei SRV-Einträge hinzu. (<Dein c2s-Port> dabei durch den Port ersetzen, den du für die Client-zu-Server-Verbindung gewählt hast und <Dein s2s-Port> durch den Port ersetzen, den du für die Server-zu-Server-Verbindung gewählt hast.) Funktionierende Standardwerte für die Gewichtung sind 5 und für die Priorität 0.

Der Betrieb von ejabberd auf einer Subdomain erfordert also nachfolgende Einträge, wobei weiterhin gilt xmpp durch deine Subdomain zu ersetzen:

* A <Die IP-Adresse deines Webspaces> 3600
_xmpp-client._tcp.xmpp SRV 5 <Dein c2s-Port> example.org 3600
_xmpp-server._tcp.xmpp SRV 5 <Dein s2s-Port> example.org 3600
_xmpp-server._tcp.conference.xmpp SRV 5 <Dein s2s-Port> example.org 3600

Beim Betrieb von ejabberd auf der Hauptdomain sehen die zusätzlichen Einträge so aus:

_xmpp-client._tcp SRV 5 <Dein c2s-Port> example.org 3600
_xmpp-server._tcp SRV 5 <Dein s2s-Port> example.org 3600
_xmpp-server._tcp.conference SRV 5 <Dein s2s-Port> example.org 3600

Du kannst die Angabe example.org in beiden Fällen für beide Einträge auch durch den Hostnamen ersetzen, hinter dem dein Uberspace liegt, also <servername>.uberspace.de. (Wobei du <servername> durch die Angabe auf deinem Datenblatt ersetzt.)

Zertifikate

Vermutlich hast du dir bereits Zertifikate zugelegt, die dir eine sichere Verbindung mit deinem Webspace ermöglichen. Wenn nicht, dann folge bitte der bereits vorhandenen Anleitung bei Uberspace.

In beiden Fällen sind Änderungen an der cli.ini notwendig, die sich im Verzeichnis ~/.config/letsencrypt/ befindet. Der Eintrag domains ist um die Subdomain xmpp.example.org sowie deren Subdomains conference.xmpp.example.org, echo.xmpp.example.org, pubsub.xmpp.example.org und irc.xmpp.example.org zu erweitern. Beachte, dass an der Stelle alle Adressen durch Kommas getrennt und ohne Leerzeichen einzutragen sind.

Anschließend erzeugst du die Schlüssel mit dem folgenden Shell-Befehl:

$ letsencrypt certonly

Installation

Die erstmalige Installation ist denkbar einfach. Zuerst lädst du dir den Quellcode von der Release-Seite von Ejabberdkompillierst und installierst ihn. (Passe also die drei Versionsangaben, hier 17.07, gegebenenfalls an. Solltest du bei der Verwendung von neueren Version auf Probleme im Verlauf dieser Anleitung stoßen, dann probiere es bitte mit der 17.07.)

$ wget https://github.com/processone/ejabberd/archive/17.07.tar.gz
$ tar xfvz 17.07.tar.gz
$ mv ejabberd-17.07 ejabberd
$ cd ejabberd
$ ./autogen.sh
$ ./configure --enable-user=$USER --enable-mysql --prefix=/home/$USER/ejabberd
$ make
$ make install

ejabberd hat eine Kontrollanwendung, mit der du den Server z. B. starten und stoppen kannst. Diese Anwendung liegt im Ordner ~/ejabberd/sbin/. Damit du, egal in welchem Verzeichnis du dich in der Shell befindest, die Anwendungen nutzen kannst, schlagen wir die Erstellung eines SymLinks in deinem ~/bin/-Verzeichnis vor:

$ ln -s ~/ejabberd/sbin/ejabberdctl ~/bin/ejabberdctl

Jetzt müssen die Zertifikate noch in einem Paket zusammen geschnürt werden, das ejabberd lesen kann. Dazu einfach folgenden Shell-Befehl eingeben. Wie oben erwähnt, ist auch hier zu beachten, dass example.org durch das Verzeichniss zu ersetzen ist, das auch in der cli.ini als erstes angegeben wurde, unabhängig davon, ob ihr eine Subdomain für ejabberd nutzt oder nicht!

$ cat ~/.config/letsencrypt/live/example.org/privkey.pem ~/.config/letsencrypt/live/example.org/fullchain.pem > ~/ejabberd/cert.pem

Als nächstes brauchen wird noch die Diffie-Hellman-Parameter für den Schlüsseltausch. Diese erzeugst du mit folgendem Befehl:

$ openssl dhparam -out ~/ejabberd/dhparams.pem 2048

Konfiguration

Die Konfigurationsdatei befindet sich unter ~/ejabberd/etc/ejabberd/ejabberd.yml. Wir werden hier die Zeilennummern angeben, an denen sich die zu ändernden Bereiche zum Zeitpunkt der Erstellung dieser Anleitung (Anfang August 2017) befinden. Es kann sein, dass diese in neueren Versionen von ejabberd (wie verwendeten 17.07.79) anders sind, also gelten sie nur um grob die Stelle zu finden. Kommentare bestehen aus zwei Hash-Zeichen und einem Leerzeichen direkt dahinter (## ). Diese drei sind immer dann zu entfernen, wenn es darum geht ein Kommentar zu entfernen.

Zeile 96 - hosts: - Der Hostname

Hier ist der Hostname von localhost auf xmpp.example.org zu ändern.

Zeile 110 - define_macro: - Macros für die SSL-Einstellungen

Im kompletten Block ab define_macro: inklusive, sind die Kommentare zu entfernen. In diesem Block ist der Pfad zur Zertifikatsdatei 'CERTFILE' von "/path/to/xmpp.pem" durch "/home/<Benutzername>/ejabberd/cert.pem" zu ersetzen. (<Benutzername> durch deinen Uberspace-Benutzernamen ersetzen.) Außerdem noch den Pfad bei 'DHFILE' von "/path/to/dhparams.pem" in "/home/<Benutzername>/ejabberd/dhparams.pem" ändern.

Manche XMPP-Server, mit denen dein Server eine Server-zu-Server-Verbindung aufzubauen versucht, könnten so eingestellt sein, dass sie nur Perfect-Forward-Secrecy-Ciphers für den Schlüsseltausch akzeptieren (So z. B. der XMPP-Server des CCC: jabber.ccc.de.) Wir haben also ein paar Ciphers gewählt, die PFS unterstützen. Diese sind bei 'CIPHERS' einzutragen:

ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-CAMELLIA256-SHA

Nach den ganzen Änderungen sollte der Makro-Block nun ungefähr so aussehen:

define_macro:
  'CERTFILE': "/home/<Benutzername>/ejabberd/cert.pem"
  'CIPHERS': "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-CAMELLIA256-SHA"
  'TLSOPTS':
    - "no_sslv3"
    - "no_tlsv1"
    - "cipher_server_preference"
    - "no_compression"
  'DHFILE': "/home/<Benutzername>/ejabberd/dhparams.pem"

Zeile 124 - listen: - Ports und Verschlüsselungseinstellungen

Hier gibt es einiges zu ändern, weswegen du am Ende ebenfalls eine kleine Zusammenfassung findest. Zuerst trägst du die Ports ein, die du von Uberspace bekommen hast. Für welches Modul ein Port gedacht ist, erkennst du am module:-Eintrag unterhalb.

Zeile 126 der Port für die Client-zu-Server-Verbindungen Zeile 153 der Port für die Server-zu-Server-Verbindungen Zeile 157 der Port für das Webinterface

Für die Verschlüsselung sind folgende Einstellungen vorzunehmen: Die Kommentare in den Zeilen 134 - certfile: bis 138 - ciphers: entfernen.

Wenn du Verschlüsselung erzwingen willst, entferne den Kommentar in Zeile 143 - starttls_required: true.

Dein listen-Block sollte ungefähr wie folgt aussehen. (<Dein c2s-Port> dabei durch den Port ersetzen, den du für die Client-zu-Server-Verbindung gewählt hast.)

listen:
  -
    port: <Dein c2s-Port>
    ip: "::"
    module: ejabberd_c2s
    starttls: true
    certfile: 'CERTFILE'
    protocol_options: 'TLSOPTS'
    dhfile: 'DHFILE'
    ciphers: 'CIPHERS'
    starttls_required: true

    max_stanza_size: 65536
    shaper: c2s_shaper
    access: c2s

Zu Aktivierung der Verschlüsselung zwischen Servern die Kommentare aus den Zeilen 237 - s2s_use_starttls: required, 242 - s2s_certfile: 'CERTFILE' und 246 - s2s_protocol_options: 'TLSOPTS' entfernen und darunter folgende zwei Zeilen hinzufügen:

    s2s_dhfile: 'DHFILE'
    s2s_ciphers: 'CIPHERS'

Der Abschnitt sollte dann so aussehen:

    s2s_use_starttls: required
    s2s_certfile: 'CERTFILE'
    s2s_protocol_options: 'TLSOPTS'
    s2s_dhfile: 'DHFILE'
    s2s_ciphers: 'CIPHERS'

Benutzerverwaltung

Möchtest du erlauben, dass Benutzerkonten über dein Webinterface erstellt werden können, dann entferne den Kommentar in Zeile 167:

register: true
Möchtest du die Registrierung von Benutzerkonten über XMPP-Clients ermöglichen, dann aktiviere das Registrierungsmodul indem du den Kommentar in Zeile 729entfernst:
mod_register:
Die Handhabung der anderen dortigen Einstellungsmöglichkeiten, entnimmst du der Dokumentation.

Als erstes wäre es ratsam einen Administrator-Benutzer zu erstellen. Du kannst dafür den Benutzernamen nehmen, mit dem du dich selbst zum Server verbindest. Solltest du es erlauben, dass sich andere Benutzer über ihre Clients auf deinem Server selber Benutzerkonten erstellen können, empfiehlt es sich die Benutzernamen admin und administrator auch zu registrieren, damit sich niemand als Admin ausgeben kann.

Alle Administrator-Konten musst du in der Konfigurationsdatei als solche definieren. Die passende Stelle findest du ab Zeile 454 und sollte nach dem du die Kommentare entfernt hast ungefähr so aussehen:
admin:
      user:
        - "deinbenutzername@xmpp.example.org"

Bedienung

Wie bereits eingangs erwähnt, wird der Server durch das ejabberdctl-Tool gesteuert. Der Start des Servers erfolgt mit folgendem Befehl:

$ ejabberdctl start
Warte nun ein paar Sekunden und überprüfe, ob der Server gestartet wurde:
$ ejabberdctl status
Du solltest folgende Rückgabe erhalten:
The node ejabberd@localhost is started with status: started

    ejabberd 17.07.79 is running in that node
Wenn das nicht der Fall ist, liegt wahrscheinlich ein Fehler in der Konfiguration vor. Prüfe dazu die Logdatei:
$ cat ~/ejabberd/var/log/ejabberd/ejabberd.log | less
Das Beenden des Dienstes erfolgt mit:
$ ejabberdctl stop
Willst du ihn nach einer Änderung an der Konfiguration im laufenden Betrieb neustarten, verwende:
$ ejabberdctl restart
Das Hinzufügen eines Benutzerkontos erfolgt mit folgendem Befehl. Ersetze <benutzername> und <passwort> mit entsprechenden Werten und berücksichtige für beide die Groß- und Kleinschreibung.
$ ejabberdctl register <benutzername> xmpp.example.org <passwort>
Das Löschen eines Benutzerkontos gelingt mit:
$ ejabberdctl unregister <benutzername> xmpp.example.org

Erfolgskontrolle

Im Verzeichnis ~/ejabberd/var/log/ejabberd findest du die Log-Dateien, die grundsätzlich beim Betrieb, aber auch bei Fehlern und Abstürzen angelegt werden.

Abschließend kannst du die Adresse deines ejabberd-Servers bei http://check.messaging.one/ eingeben, um seine Eigenschaften testen und bewerten zu lassen.

Clients

Für das Chatten unter Windows und Linux nutzen wir Pidgin mit dem OTR-Plugin. Es ist ein ressourcenarmer, leicht zu bedienender Client, der auch die Anbindung an andere Chatprotokolle ermöglicht. Für die Videotelefonie verwende ich zusätzlich Jitsi. Als Thunderbird-Nutzer kannst du für den Anfang (es gibt keine Verschlüsselung) auch dessen Chat-Modul benutzen. Du findest es im Menü unter Navigation.

Da wir keine Smartphones nutzen, können wir aus Erfahrung keine Empfehlung zu einem bestimmten Programm geben, verweisen aber auf diese Liste.

Dieser Webseite ist der Browser-Client von Converse.js hinterlegt.

Letzte Aktualisierung: 17. September 2017