ubuntuusers.de

ubuntuusers.deWikiejabberd

ejabberd

Ausbaufähige Anleitung

Dieser Anleitung fehlen noch einige Informationen. Wenn Du etwas verbessern kannst, dann editiere den Beitrag, um die Qualität des Wikis noch weiter zu verbessern.


Anmerkung: Die Installation aus den offiziellen Paketquellen müsste überprüft werden. Aber auch die manuelle Installation über den Universal-Installer scheint nicht unproblematisch zu sein (siehe Diskussion).

Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:

Artikel für fortgeschrittene Anwender

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

Ejabberd {en} 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 {en} , als auch der deutsche Freemail-Anbieter GMX 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 (meistens) ziemlich problemlos einzurichten ist.

Installation aus den Paketquellen

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

  • ejabberd (universe [2] )

Wiki/Vorlagen/Installbutton/button.png mit apturl

Paketliste zum Kopieren:

sudo apt-get install ejabberd 

sudo aptitude install 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 mal genau hinschauen und sich bei Bedarf informieren, wie man dieses Verhalten in der Paketverwaltung der Wahl abschalten kann: Paketverwaltung.

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

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.

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 {en} für alle Linux-Distributionen zurückgreifen, der auch schon den Erlang-Interpreter beinhaltet. (Z.B. Version 1.1.3 {en}.)

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 unter Ubuntu 12.04

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-Skript 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 1. Januar 2014 13:22 von aasche erstellt.
Die folgenden Schlagworte wurden dem Artikel zugewiesen: Netzwerk, Server, Kommunikation, jabber