ubuntuusers.de

ejabberd

Archivierte Anleitung

Dieser Artikel wurde archiviert. Das bedeutet, dass er nicht mehr auf Richtigkeit überprüft oder anderweitig gepflegt wird. Der Inhalt wurde für keine aktuell unterstützte Ubuntu-Version getestet. Wenn du Gründe für eine Wiederherstellung siehst, melde dich bitte in der Diskussion zum Artikel. Bis dahin bleibt die Seite für weitere Änderungen gesperrt.

Artikel für fortgeschrittene Anwender

Dieser Artikel erfordert mehr Erfahrung im Umgang mit Linux und ist daher nur für fortgeschrittene Benutzer gedacht.

./ejabberd_logo.png Ejabberd 🇬🇧 ist einer der am weitesten verbreiteten XMPP-Server im Open-Source-Bereich, obwohl er in der ziemlich exotischen Sprache Erlang geschrieben ist. U.a. setzt sowohl die Jabber-Foundation 🇬🇧 als auch der deutsche Freemail-Anbieter GMX früher auf diese Serversoftware, weil sie auch unter hohen Anforderungen zuverlässig arbeitet. Aber auch für einen kleinen privaten Server eignet sich der ejabberd gut, weil er (meist) ziemlich problemlos einzurichten ist.

Installation

Um den Serverdienst zu installieren, reicht es zunächst aus, folgendes Paket inkl. aller Abhängigkeiten zu installieren [1]:

  • ejabberd (universe)

Befehl zum Installieren der Pakete:

sudo apt-get install ejabberd 

Oder mit apturl installieren, Link: apt://ejabberd

Hinweis:

Das Einzige, worauf man dabei achten sollte ist, dass nur die wirklichen Abhängigkeiten mit installiert werden und nicht alle "empfohlenen" Pakete, denn sonst werden einem auch auf einem Server schnell mal die ganzen X11-Bibliotheken auf die Platte gebracht. Man sollte also genau hinschauen und bei Bedarf die Option --no-install-recommends im Installationsbefehl nutzen.

⚓︎

Konfiguration

Um mit dem Server dann auch etwas anfangen zu können, muss man ihn noch kurz konfigurieren:

sudo dpkg-reconfigure ejabberd 

Als erstes wird man nach dem Namen des Servers gefragt. Dieser muss inkl. der Domain eingegeben werden und der Rechner muss auch über das DNS-System unter diesem Namen bekannt sein.

Als nächstes wird nach einer Admin-ID gefragt. Dabei handelt es sich um eine Jabber-ID (JID), der administrative Rechte eingeräumt werden. Mit dieser JID kann man sich dann später auch über einen XMPP-Client einloggen. Der Domainteil der JID darf nicht mit angegeben werden, da er ja schon in der vorherigen Frage angegeben wurde.

Hinweis:

Sollte ein Fehler wie dieser auftreten:

Can't register admin user "[EMAIL PROTECTED].
Probably ejabberd is configured for serving another hostname.

kann Folgendes weiterhelfen:

sudo killall epmd 

Abschließend muss man für diesen Account noch ein Passwort setzen. Damit ist die Konfiguration erstmal fertig und nachdem man den Dienst neu gestartet hat [5], ist ejabberd einsatzbereit.

sudo /etc/init.d/ejabberd restart 

Internetanbindung

Damit der Server einwandfrei funktioniert, müssen mindestens folgende TCP-Ports ungefiltert und erreichbar sein: (Nur relevant für Leute, die mit Firewalls und/oder Portforwarding zu tun haben.)

  • 5222 eingehend, für Client-Verbindungen unverschlüsselt oder TLS-verschlüsselt

  • 5223 eingehend, für SSL-verschlüsselte Clientverbindungen (veraltet)

  • 5269 ein- und ausgehend, für Verbindungen zu anderen Servern

  • 5280 eingehend, für Client-Verbindungen über HTTP-Polling (nützlich für Webapplikationen)

Für einen internen Server ohne Kontakt zu anderen kann man letzteren natürlich auch weglassen.

Administration

Weboberfläche

In der Standardkonfiguration bietet ejabberd eine Weboberfläche, die über die URL http://serveradresse:5280/admin/ zu erreichen ist. Hier kann man sich über die Admin-JID (diesmal komplett mit Domain) und das Passwort einloggen.

Die Bedienung ist leider ziemlich unintuitiv, weswegen man abgesehen von den Statistikfunktionen vielleicht besser auf die anderen Möglichkeiten zurückgreift.

Konfigurationsdatei

Die Datei /etc/ejabberd/ejabberd.cfg ist das Herzstück der ejabberd-Konfiguration. Diese ist in Erlang-Syntax geschrieben und sieht deshalb etwas gewöhnungsbedürftig aus. Z.B. werden Kommentare durch ein Prozent-Zeichen eingeleitet. Nach jeder Änderung an dieser Datei [4] muss der ejabberd wiederum neu gestartet werden [5].

Geschlossener Benutzerkreis

Wer nicht über einen leistungsfähigen Server mit breiter Internetanbindung verfügt, möchte z.B. vielleicht nicht jedem ermöglichen, sich auf dem Server zu registrieren, sondern nur ausgewählten Bekannten/Mitarbeitern/Kunden einen Account zur Verfügung stellen. Dafür muss man nur ein %-Zeichen von einer in die andere Zeile setzen:

% Every username can be registered via in-band registration:
%{access, register, [{allow, all}]}.

% None username can be registered via in-band registration:
{access, register, [{deny, all}]}.

Jetzt kann nur noch der Admin neue Benutzerzugänge anlegen. Die automatische Registrierung über den Jabber-Client schlägt fehl.

Hinweis:

In der ejabberd-Version 2.1.11, welche in Ubuntu 14.04 LTS in den Paketquellen enthalten ist, ist die Benutzerregistrierung standardmäßig deaktiviert. Der entsprechende Eintrag lautet hier:

1
2
3
4
5
6
7
%% No username can be registered via in-band registration:
%% To enable in-band registration, replace 'deny' with 'allow'
% (note that if you remove mod_register from modules list then users will not
% be able to change their password as well as register).
% This setting is default because it's more safe.
{access, register, [{deny, all}]}.
|}}

Webkonfiguration einschränken

Die webbasierte Administrationsoberfläche kann man bei Bedarf auf einen anderen Port legen - der Port 5280 wird ja nebenbei auch für HTTP-Polling benutzt - und auch an eine bestimmte Netzwerkschnittstelle binden, z.B. an die Loopback-Schnittstelle. Dafür einfach die folgende Zeile in der ejabberd.cfg-Datei suchen...

  {5280, ejabberd_http,    [http_poll, web_admin]}

... und durch folgende ersetzen:

  {5280, ejabberd_http,    [http_poll]},
  {5281, ejabberd_http,    [{ip, {127, 0, 0, 1}}, web_admin]}

Dabei besonders auf das Komma achten.

Ab Ubuntu 14.04 LTS

Unter Ubuntu 14.04 LTS sieht die Konfiguration etwas anders aus. Um die webbasierte Administrationsoberfläche zu deaktivieren, sucht man folgenden Codeblock, in der Konfigurationsdatei und kommentiert den Eintrag web_admin aus. Auch hier ist auf die korrekte Kommasetzung zu achten.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
{5280, ejabberd_http, [
                         %%{request_handlers,
                         %% [
                         %%  {["pub", "archive"], mod_http_fileserver}
                         %% ]},
                         %%captcha,
                         http_bind,
                         http_poll %%,
                         %%web_admin
                        ]}

⚓︎

Anonymer Login

Manchmal möchte man bestimmten Clients einen temporären anonymen Zugang zum Server bieten, ohne gleich einen Account mit einem Passwort registrieren zu müssen.

Dafür bietet der ejabberd zwei verschiedene Protokolle an, nämlich sasl_anon und login_anon. login_anon benötigt keine besondere Unterstützung im Client. Es wird einfach jede JID/Passwort-Kombination akzeptiert, sofern die JID nicht von jemandem fest registriert wurde. sasl_anon ist dagegen ein eigenes Protokoll, mit dessen Hilfe der Server dem Client für die Dauer der Verbindung eine einzigartige, zufällige JID zuweist.

Obwohl der Server von sich aus darauf achtet, dass kein anonymer Benutzer sich eine real existierende JID von jemand anderem unter den Nagel reißt, sollte man anonyme Logins besser auf einen eigenen virtuellen Server auslagern, um Verwirrung zu vermeiden. Dazu ändert man die hosts-Zeile in der ejabberd.cfg ab und fügt einen entsprechenden Servernamen hinzu:

{hosts, ["jabber-server.tld", "anonymous.jabber-server.tld"]}.

Nun fügt man noch einen host-spezifischen Absatz ein, der die Authentifizierung regelt. (Es gibt schon einen auskommentierten Abschnitt, wo verschiedene host_config-Beispiele vorgestellt werden. An dieser Stelle passen die folgenden Zeilen sehr gut hin.)

{
host_config, "anonymous.jabber-server.tld", [{auth_method, anonymous},
                                     {allow_multiple_connections, false},
                                     {anonymous_protocol, sasl_anon}]}.

An der Stelle von sasl_anon kann man auch login_anon oder both eintragen, wenn man Clients verwenden will, die sasl_anon nicht unterstützen. In diesem Fall muss man je nach Verwendung evtl. auch allow_multiple_connections auf true setzen.

Kommandozeilen-Werkzeug

Im laufenden Betrieb benutzt man das Kommandozeilenwerkzeug "ejabberdctl" zur Administration [3].

Benutzer registrieren/löschen

Wenn man die öffentliche Registrierung von JIDs wie oben beschrieben deaktiviert hat, muss man die Benutzerverwaltung selber übernehmen:

sudo ejabberdctl register Benutzername Servername Passwort                        # Benutzer hinzufügen
sudo ejabberdctl unregister Benutzername Servername                               # Benutzer löschen 

Backup der Benutzerdatenbank

Mit folgenden Befehlen kann man ein Backup der Benutzerdatenbank anlegen bzw. wiederherstellen:

sudo ejabberdctl backup Datei                                  # Sicherung anlegen
sudo ejabberdctl restore Datei                                 # Sicherung wiederherstellen 

Folgende Befehle funktionieren auch, benutzen aber auch für Menschen lesbare Dateien:

sudo ejabberdctl dump Datei                                 # Sicherung anlegen
sudo ejabberdctl load Datei                                 # Sicherung wiederherstellen 

Hinweis:

Wenn man keine absoluten Dateinamen benutzt, findet man die Backup-Dateien im Heimatverzeichnis von ejabberd, /var/lib/ejabberd.

Daten-Import

Wer vorher einen jabberd1.4-Server betrieben hat und jetzt umsteigen möchte, kann einzelne Benutzerdatensätze oder komplette Serversätze in ejabberd importieren:

sudo ejabberdctl import-file /wo/auch/immer/servername.tld/benutzername.xml                # Benutzer importieren
sudo ejabberdctl import-dir /wo/auch/immer/servername.tld                                  # kompletten Serverdatensatz importieren 

Informationen

So erfährt man wie viele Benutzer gerade online sind, welche Benutzer online sind bzw. welche Benutzerkonten überhaupt existieren:

sudo ejabberdctl connected-users-number
sudo ejabberdctl connected-users
sudo ejabberdctl vhost Servername registered-users   ## oder:
sudo ejabberdctl registered-users Servername         ## in neueren Versionen 

Für weitere Kommandos sei auf die Manpage von ejabberdctl verwiesen.

⚓︎

Alternative Installation: Universal-Installer

Wer aus irgendwelchen Gründen nicht die ejabberd-Version aus den Ubuntu-Repositories verwenden will - weil er vielleicht den Ärger mit den kaputten Erlang-Paketen von Ubuntu Edgy vermeiden will oder in der allerneuesten Version der Software eine unglaublich praktische Funktion entdeckt hat - kann auf den Universal-Installer des ejabberd-Projektes 🇬🇧 für alle Linux-Distributionen zurückgreifen, der auch schon den Erlang-Interpreter beinhaltet. (Z.B. Version 1.1.3 🇬🇧.)

Als erstes muss man die Datei ejabberd-<Version>-installer.bin herunterladen und ausführbar machen [6], dann startet man das selbstextrahierende Paket unter genau der Benutzerkennung, unter welcher der Server später laufen soll. Standardmäßig geschieht das durch Anlegen eines Verzeichnisses im home des entsprechenden Benutzers bzw. in /opt, falls man Root ist (nicht empfohlen). Die Installationsroutine startet mit einer Frage nach der bevorzugten Sprache. Danach darf man der Lizenz (GPL) zustimmen, und es wird nach dem Installationsverzeichnis gefragt. Es folgen die schon im obigen Konfigurationsabschnitt beschriebenen Fragen nach Domain, Admin-Account, etc. Neu ist die Frage, ob man den Server in einem Cluster aus mehreren Rechnern betreiben will. Das sollte man in den meisten Fällen verneinen.

Leider versucht das Skript nach beendeter Erstkonfiguration, den Server sofort zu starten, was wegen dem im Folgenden beschriebenen Problem unter Umständen nicht funktioniert und der Installer hängt sich auf. Wenn man aber wartet, bis der Fortschrittsbalken auf 100% steht und die Disk-Aktivität nachlässt, kann man die Routine über Strg + C abbrechen.

Das Skript ejabberdctl im bin/-Verzeichnis ist nämlich fehlerhaft, weil es in der #!-Zeile /bin/sh als Shell angibt, aber bash-spezifische Erweiterungen nutzt. Da bei Ubuntu die sh kein Link auf die bash, sondern auf dash ist, muss man also die erste Zeile wie folgt abändern, um das Skript benutzen zu können [4]:

#!/bin/bash

Ebenfalls im bin/-Verzeichnis der ejabberd-Installation finden sich Skripte namens start und stop, die genau das machen, was ihr Name vermuten lässt, nämlich den Server starten und stoppen.

Konfiguration

Die ejabberd.cfg-Datei, zu finden im conf/-Verzeichnis, benutzt selbstverständlich dieselbe Syntax wie die aus dem Ubuntu-Paket (siehe oben), aber die Voreinstellungen sind anders - weniger sinnvoll.

Als erstes möchte man vielleicht - wie oben schon beschrieben - die automatische Registrierung neuer Benutzer sperren. Das funktioniert, indem man die access-register-Zeile folgendermaßen anpasst:

{access, register, [{deny, all}]}.

Außerdem ist der ejabberd aus dem Installer - im Gegensatz zu dem aus dem Ubuntu-Paket - standardmäßig nicht für SSL-/TLS-Verschlüsselung ausgelegt. Wer das ändern will, muss wie im folgenden Abschnitt dargestellt ein paar Kommentarzeichen ('%') verrücken:

{listen, [
      %%{5222, ejabberd_c2s, [{access, c2s}, {max_stanza_size, 65536}, {shaper, c2s_shaper}]},
          %% Use this line to enable SSL:
          %%{5223, ejabberd_c2s,     [{access, c2s}, {max_stanza_size, 65536}, tls, {certfile, "/opt/ejabberd-1.1.3/conf/serv
er.pem"}]},
          %%
          %% Use those lines instead for TLS support:
          {5222, ejabberd_c2s,     [{access, c2s}, {shaper, c2s_shaper}, starttls, {certfile, "/opt/ejabberd-1.1.3/conf/serve
r.pem"}]},
          {5223, ejabberd_c2s,     [{access, c2s}, tls, {certfile, "/opt/ejabberd-1.1.3/conf/server.pem"}]},

Es empfiehlt sich, das bin/-Verzeichnis in den eigenen Programm-Pfad aufzunehmen, damit man für die start-/stop-Skripte und ejabberdctl nicht immer den kompletten Pfad benutzen muss. Wie das geht, steht im Artikel Umgebungsvariable. Außerdem möchte man sich wahrscheinlich ein Startskript in /etc/init.d/ erstellen, um den Server gleich beim Systemstart hochzufahren [5].

Härten des ejabberd-Servers

Der ejabberd-Server wird mithilfe eines Skripts unter /etc/init.d/ejabberd gestartet/gestoppt. Dabei wird der Prozess unter dem Benutzer ejabberd gestartet. Dieser Benutzer hat in /etc/passwd als Shell "/bin/sh" definiert. Einen Server-Prozess unter Linux sollte möglichst als unpriviligierter Benutzer mit möglichst wenig Rechten laufen. Dazu wird die eingetragene Shell entfernt:

sudo usermod -s /usr/sbin/nologin ejabberd 

Nach dieser Änderung lässt sich ejabberd aber nicht mehr starten. Um das zu beheben, legt man zunächst eine Sicherung des bestehenden init-Skripts an:

sudo cp -a /etc/init.d/ejabberd /etc/init.d/ejabberd.bak 

Danach passt man das init-Skript an:

sudo sed -i 's/su $EJABBERDUSER -c/sudo -u "$EJABBERDUSER" sh -c/g' /etc/init.d/ejabberd 

Jetzt sollte der Start-Befehl wieder funktionieren:

sudo service ejabberd start 

Problembehebung

Eine Besonderheit ist, dass der Server nach einem Wechsel der Host-Namens nicht mehr richtig läuft. Besser ausgedrückt, der Server kann auf den Datenbestand nicht mehr zugreifen. Wenn die Nutzerdaten z.B. über LDAP von anderer Stelle geholt werden, reicht es aus, das Verzeichnis /var/lib/ejabberd/ zu leeren. Leider gehen dabei die eingerichteten Räume verloren.

Diese Revision wurde am 5. Mai 2020 17:31 von Heinrich_Schwietering erstellt.
Die folgenden Schlagworte wurden dem Artikel zugewiesen: Netzwerk, Server, Kommunikation, jabber