Springe zum Inhalt

Prosody: Chatserver mit Anbindung zu G+, FB, Twitter und IRC

Mittlerweile gibt es eine unüberschaubare Anzahl an Chat-Programmen und Chat-Anbietern. Um den Konversationen der Freunde folgen zu können müssen auf dem heimischen PC mehrere Programme installiert und auf dem Smartphone soll für jeden Anbieter eine eigene App installiert werden. Warum nicht einfacher? Einen eigenen Server aufsetzen, welcher das genormte Protokoll XMPP spricht und mit Gateways zu den entsprechenden Diensten erweitert werden kann: Prosody.

Server

Mir bekannt sind nur zwei Opensource-Alternativen der XMPP-Server: ejabberd und prosody. Mit ejabberd hatte ich schon vor Jahren Kontakt, konnte mich aber nicht wirklich mit ihm anfreunden. Konfigurationsschwierigkeiten und die damals mangelnde Anzahl an Modulen für Erweiterungen führten dazu, meinen ejabberd damals wieder abzuschalten. Frischen Wind in die Reiher der XMPP-Server bringt der lange Zeit unbekannte Prosody (erste Version von 2008). Er hat sich auf die Fahne geschrieben, besonder leichtgewichtig, ressourcenschonend und dabei noch mit einer Fülle von Erweiterungen ausgestattet zu sein, die ihn zu einem vollwertigen Mitglied der XMPP-Server-Familie werden lassen sollen. Die Installation ist einfach, die aktuelle Version ist in Debian bereits in den Paketquellen enthalten:

apt install prosody

Die Installation unter anderen OS-Versionen wird im Prosody-Wiki erklärt. Die folgende Installationsanleitung wird sich an den mit der Debian-Version vorgegebenen Pfaden orientieren.

Für Prosody gibt es mittlerweile eine lange Liste von Modulen, welche durch die Community beigesteuert werden. Wer mag, kann diese ebenfalls einfach aus den Paketquellen installieren:

apt install prosody-modules

Ich wollte etwas mehr "am Puls der Zeit" bleiben, und habe statt der Module aus der Paketverwaltung die aktuellen Entwicklungsstände der Module ausgecheckt:

cd /usr/local/lib
hg clone https://hg.prosody.im/prosody-modules/ prosody-modules

Anschließend muss Prosody mitgeteilt werden, wo es die Module finden kann. In der globalen Konfigurationsdatei /etc/prosody/prosody.cfg.lua wird dazu Folgendes eingetragen:

plugin_paths = { "/usr/local/lib/prosody-modules" }

Grundkonfiguration

In der gleichen Datei ist nun die Jabber-ID (JID) des späteren Admin-Users festzulegen. Wenn gewünscht, kann hier auch gleich die Speicherengine von Prosody festgelegt werden. Mit den Standardeinstellungen wird Sqlite3 verwendet. Wer MySQL bzw. MariaDB benutzen mag, stellt hier gleich

storage = "sql"

ein und entfernt die Kommentarzeichen bei der entsprechenden Konfigurationseinstellung für MySQL. Die dort eingetragene Datenbank muss nun mit ensprechenden Tools manuell erstellt und dem angegebenen Benutzer Rechte zum Zugriff auf die Datenbank gegeben werden. Anschließend erstellt man den Admin-User:

prosodyctl adduser admin@example.org

Virtuelle Hosts

Prosody unterstützt mehrere virtuelle Hosts in einer einzigen laufenden Instanz, ähnlich einem Webserver, der mehrere verschiedene Domains in einer Instanz hosten kann. Die Konfiguration der virtuellen XMPP-Hosts erfolgt in einer Datei pro Host unter /etc/prosody/conf.avail. Zum Einschalten eines virtuellen Hosts wird ein symbolischer Link in /etc/prosody/conf.d auf die entsprechende Konfigurationsdatei in ../conf.avail angelegt (ähnlich wie bei den Webservern Apache oder Nginx).

Virtuelle Hosts könnnen dazu benutzt werden, Jabber-IDs auf der "Hauptdomain" zu erstellen. Es ist dadurch möglich, Jabber-IDs mit dem Aufbau mustermann@example.org zu unterstützen, obwohl der echte Server z.B. auf jabber.example.org läuft.

Die simpelste Konfiguration eines virtuellen Hosts besteht dabei aus nur einer einzigen Zeile:

VirtualHost "example.org"

Um nun den Jabber-Clients und -Servern mitzuteilen, unter welcher IP der "echte" Jabber-Server erreichbar ist, sind zwei DNS-Einträge erforderlich:

_xmpp-client._tcp.example.org. 300 IN	SRV	0 5 5222 jabber.example.org.
_xmpp-server._tcp.example.org. 300 IN	SRV	0 5 5269 jabber.example.org.

Einzelheiten, was die Werte in dieser Zeile bedeuten können der Dokumentation zu DNS-SRV-Records und der Server-Dokumentation entnommen werden.

Verschlüsselung

Um eine verschlüsselte Übertragung der Chat-Nachrichten zwischen Client und Server als auch zwischen Server und Server zu erzwingen, ist zuerst ein von den beteiligten Seiten akzeptiertes Zertifikat erforderlich. Wenn auf dem Server, auf dem Prosody installiert wird kein anderer HTTP(S)-Server läuft, kann das Zertifikat, falls man nicht schon ein entsprechendes besitzt, einfach von Let's Encrypt angefordert werden:

certbot certonly --standalone -d example.org

Das Zertifikat und der zugehörige private Schlüssel liegen anschließend unter /etc/letsencrypt/live/example.org. Benötigt werden die Dateien fullchain.pem und privkey.pem. Diese habe ich der Einfachheit halber nach /etc/prosody/certs/ kopiert. Eine Anpassung der Rechte, damit Prosody die Dateien direkt aus dem Let's Encrypt Verzeichnis lesen kann, steht noch auf meiner TODO-Liste.

Anschließend wird das Zertifikat in der Konfigurationsdatei des virtuellen Hosts eingetragen (/etc/prosody/conf.avail/jabber.example.org) und gleichzeitig festgelegt, dass nur verschlüsselte Kommunikation erlaubt ist:

c2s_require_encryption = true
s2s_require_encryption = true
s2s_secure_auth = true
 
ssl = {
        key = "/etc/prosody/certs/privkey.pem";
        certificate = "/etc/prosody/certs/fullchain.pem";
        }

Weitere Module

In der Konfigurationsdatei des jeweiligen virtuellen Hosts können einfach durch Hinzufügen des Modulnamens in den Abschnitt

modules_enabled = {
  ...
}

weitere Module aktiviert werden.

announce
ermöglicht dem Administrator, eine Nachricht an alle Online-Benutzer zu senden
blocking
Modul, mit dem Benutzer Blockierlisten verwalten können
carbons
Synchronisieren des Chatverlaufs zwischen unterschiedlichend Clients
privacy
erlaubt dem Benutzer, einen Status für bestimmte Benutzer vorzugeben
watchregistrations
Sendet Nachrichten bei der Registrierung neuer Benutzer an konfigurierte Adressen
welcome
erlaubt dem Administrator, eine Willkommensnachricht einzustellen
http
der HTTP(S)-Server von Prosody, von dem z.B. http_upload abhängt
http_upload
ermöglicht den Upload von Dateien
log_auth
protokolliert die Anmeldeversuche

Die Dokumentation vieler weiterer Module kann auf einer entsprechenden Webseite eingesehen werden.

Wenn man die öffentliche Registrierung freigeschaltet hat, so möchte man vielleicht über neu registrierte Benutzer informiert werden. Verantwortlich dafür ist nach der Aktivierung der öffentlichen Registrierungsmöglichkeit das Modul watchregistrations:

registration_watchers = { "admin@example.org" }
registration_notification = "User $username just registered on $host from $ip"
 
welcome_message = "Hello $username, welcome to the $host IM server!"
 
allow_registration = true;

Für das Hochladen von Dateien muss noch eine entsprechende Komponentenkonfiguration  und evtl. eine maximal hochladbare Dateigröße festlegt werden:

Component "upload.example.org" "http_upload"
http_upload_file_size_limit = 2097152

Problematisch ist hier, dass der Dateiupload offensichlich nicht die oben angelegten DNS-SRV-Record beachtet, sondern einen Server unter upload.example.org erwartet. Dieser kann nach meinen bisherigen Tests auch nicht als weiterer virtueller Host angelegt werden sondern benutzt das Zertifikat, welches in der Hauptkonfigurationsdatei von Prosody in /etc/prosody/prosody.cfg.lua festgelegt worden ist. Man braucht also für http_upload unbedingt noch ein Zertifikat für upload.example.org, welches in der Hauptkonfigurationsdatei eingetragen werden muss.

Hochgeladene Dateien werden unter /var/lib/prosody/http_upload gespeichert.

Transports

In Jabber bzw. XMPP definierte Gateways zu anderen Netzen werden Transports genannt. Mit diesen Transports ist es z.B. möglich, über einen XMPP-Client Twitter-Nachrichten zu lesen und zu posten, mit Freunden auf Facebook in Kontakt zu bleiben, Nachrichten mit Nutzern von Google (ehemals GoogleTalk, jetzt Google Hangouts) ausztauschen oder am ältesten Chat im Internet, dem IRC, teilzunehmen.

Damit Transports sich in prodody registrieren können, muss zuerst deren Name und ein Password festgelegt werden. In der Konfigurationdatei des jweiligen virtuellen Hosts sind dazu folgende Einträge notwendig:

Component "dienstname.example.org"
        component_secret = "sehrgeheim"

Um nun die verschiedenen Transport-Module anschließen zu können ist erst einmal eine Software nötig, welche sich um den Start und die Kommunikation der einzelnen Transportmodule kümmert. Für prosody kann dazu Spectrum2 verwendet werden. Die recht einfache Installation unter Debian Jessie ist in einer Anleitung beschrieben.

Sofern ein Transport zu Facebook benötigt wird, kann seit Mitte 2015 leider nicht mehr das eingebaute XMPP verwendet werden. Facebook hat das entsprechende Gateway abgeschaltet und sich damit quasi isoliert. Um trotzdem Zugriff auf den Facebook-Chat zu bekommen, ist die Installation eines weiteren Modul erforderlich: purple-facebook. Eine entsprechende Installationsanleitung findet sich auf der Webseite des Maintainers.

Für die verschiedenen Netzwerke stehen anschließend folgende Module zur Verfügung:

spectrum2_libpurple_backend
Transport zu Facebook (protocol=prpl-facebook)
spectrum2_twitter_backend
Transport zu Twitter
spectrum2_swiften_backend
Transport zu Google (protocol=prpl-jabber)
spectrum2_libcommuni_backend
Transport zu IRC

Die Konfigurationsdateien der einzelnen Transports in Spectrum2 sind unter /etc/spectrum2/transports zu finden. Dort wird für jeden einzelnen Transport eine eigene Datei erstellt, z.B. google.cfg oder facebook.cfg. Eine entsprechende Vorlage ist in spectrum.cfg.example enthalten. Die Schritte zur Konfiguration sind folgende:

  • Kopieren von spectrum.cfg.example auf dienstname.cfg
  • Anpassung von jid, password (gleiches Passwort, wie in der prosody-Konfiguration unter component festgelegt), backend und evtl. protocol (entsprechend der obigen Auflistung)
  • Festlegung des Namens des Transports
  • evtl. Anpassung der Datenbank im Abschnitt [database]
  • Starten des Transports mit spectrum2_manager dienstname.example.org start

Eine Konfigurationdatei für Facebook (facebook.cfg) könnte z.B. wie folgt aussehen:

  1. [service]
  2. frontend=xmpp
  3.  
  4. # The name of user/group Spectrum runs as.
  5. user=spectrum
  6. group=spectrum
  7.  
  8. # JID of Spectrum instance.
  9. jid = facebook.example.org
  10. admin_jid = admin@example.org
  11.  
  12. # Password used to connect the XMPP server.
  13. password = ComponentenPasswort
  14.  
  15. # XMPP server to which Spectrum connects in gateway mode.
  16. server = 127.0.0.1
  17.  
  18. # XMPP server port.
  19. port = 5347
  20.  
  21. # Interface on which Spectrum listens for backends.
  22. backend_host = 127.0.0.1
  23.  
  24. # Port on which Spectrum listens for backends.
  25. # By default Spectrum chooses random backend port and there's
  26. # no need to change it normally
  27. #backend_port=10001
  28.  
  29. # Number of users per one legacy network backend.
  30. users_per_backend=10
  31. # For Skype - must be =1
  32. #users_per_backend=1
  33.  
  34. # Full path to backend binary.
  35. backend=/usr/bin/spectrum2_libpurple_backend
  36.  
  37. protocol=prpl-facebook
  38.  
  39. [identity]
  40. # Name of Spectrum instance in service discovery
  41. name=Spectrum Facebook Transport
  42.  
  43. # Type of transport ("msn", "icq", "xmpp").
  44. # Check http://xmpp.org/registrar/disco-categories.html#gateway
  45. type=xmpp
  46.  
  47. # Category of transport, default is "gateway
  48. category=gateway
  49.  
  50. [logging]
  51. # log4cxx/log4j logging configuration file in ini format used for main spectrum2 instance.
  52. config = /etc/spectrum2/logging.cfg
  53.  
  54. # log4cxx/log4j logging configuration file in ini format used for backends.
  55. backend_config = /etc/spectrum2/backend-logging.cfg
  56.  
  57. [database]
  58. # Database backend type
  59. # "sqlite3", "mysql", "pqxx", or "none" without database backend
  60. type = mysql
  61. database = spectrum2
  62. server = localhost
  63. user = spectrum2
  64. password = DbPasswort
  65. prefix = fb_
  66.  
  67. [registration]
  68. # Enable public registrations
  69. enable_public_registration=1

In prosody muss dazu vorher folgende Definition beim virtuellen Host eingetragen worden sein:

Component "facebook.example.org"
        component_secret = "ComponentenPasswort"

Transports und Server starten und stoppen

Die einzelnen Dienste oder auch der XMPP-Server selbst können mit folgenden Kommandos gestartet oder gestoppt werden:

  • prosodyctl start
  • prosodyctl stop
  • prosodyctl restart
  • spectrum2_manager dienstname.example.org start
  • spectrum2_manager dienstname.example.org stop
  • spectrum2_manager dienstname.example.org restart

Logdateien zur Fehlersuche für prodody werden in /var/log/prosody geschrieben, Logdateien für Spectrum2 unter /var/log/spectrum2/TransportName/spectrum2.log und Logdateien für die einzelnen Transports unter /var/log/spectrum2/TransportName/backend/*.log.

4 Gedanken zu „Prosody: Chatserver mit Anbindung zu G+, FB, Twitter und IRC

  1. tux.

    Mir bekannt sind nur zwei Opensource-Alternativen der XMPP-Server: ejabberd und prosody.

    Vergiss OpenFire nicht.

    1. Jens Tautenhahn

      Danke für den Tipp! Jetzt habe ich mir doch mal die Mühe gemacht und eine Vergleichsliste rausgesucht. Mir scheint, Prosody hat in der Unterstützung der XEPs ein bisschen die Nase vorn. Viel schwerer wiegt jedoch etwas anderes: Serversoftware in Java geht gar nicht. Aber, das ist nur meine persönliche Meinung.

      1. tux.

        Lua kann durchaus auch sehr ressourcenhungrig sein. Aber ja, ich habe Openfire auch nicht lange benutzt (siehst du schon daran, dass ich es beim ersten Versuch falsch geschrieben habe). Ich fand nur die Weboberfläche recht charmant. War ja auch nicht für den produktiven Einsatz gedacht, also bei mir. ;-)

  2. tuxflo

    Hmmm klingt nicht schlecht. Wenn man jetzt noch die "modernen" Messanger wie WhatsApp und Telegram hinzufügen könnte...

Kommentare sind geschlossen.