Prosody: XMPP over HTTPS

In öffentlichen Hotspots oder sonstigen limitierten Netzwerken ist oft nur der Webserver Port 80 und 443 erlaubt. Aus diesem Grund könnte es für den einen oder anderen Admin eines XMPP Dienstes von Interesse sein XMPP over HTTPS (XEP-0368) für Nutzer in solchen Netzwerken anzubieten.

In dieser Anleitung erkläre ich, wie auf einem bereits laufenden Debian 9 (Stretch) Server mit XMPP und Webserver eine HTTPS Weiche (sslh) zu konfigurieren ist.

Punkt 1: Installation des Pakets

Das Paket in Version 1.18 gibt es unter Debian 9 ohne weitere Repo’s hinzufügen zu müssen.

Punkt 2: Webserver Listen-Adresse anpassen

Wir änderen das Listen-Interface des Apachen wie folgt ab. (Für Nginx ebenfalls einfach umzusetzen)

Evtl. ist es nötig in den einzelnen vHosts ebenfalls die IP-Adresse für HTTPS auf 127.0.0.1 im Ordner /etc/apache2/sites-available/ abzuändern!

Punkt 3: Aktivieren des legacy SSL Ports unter Prosody

Prosody muss nun noch erlaubt werden auf dem alten SSL Port 5223 zu lauschen. Wir fügen folgende Zeile hinzu.

Punkt 4: sslh Daemon anpassen

Wir erlauben sslh beim Booten zu starten und fügen unsere künftige Konfiguration hinzu.

Punkt 5: sslh Konfiguration anlegen

Der Ordner /etc/sslh/ muss angelegt werden.

Jetzt kann die Konfigurationsdatei erzeugt und gespeichert werden. (Zeile 14 bitte anpassen!)

Punkt 6: Wir starten die Dienste neu

…und prüfen ob die Umstellungen erfolgt sind. Die Dienste sollten nun auf diesen IPs + Ports laufen.

Punkt 7: DNS Records

Damit limitierte Nutzer nun ohne Änderung an der Client-Konfiguration sich zum XMPP Dienst verbinden können, erstellen wir unsere SRV Records im Nameserver wie folgt.

Sortiert nach Priorität: 5222/xmpp, 5223/tls, 443/xmpp, 443/tls:

Punkt 8: Prüfen der Verbindung

Mit openssl prüfen wir auf der Konsole ob eine HTTPS Verbindung möglich ist.

>_ Update 21.05.2018

Punkt 9: Transparent Proxy

Möchte man im Webserver Logfile dann doch die Client IP-Adressen sehen und nicht 127.0.0.1, müssen folgende Anpassungen vorgenommen werden.

Wir setzen zuerst den transparent auf true und als User wählen wir den bereits angelegten Namen sslh.

Nun erlauben wir dem System auf localhost zu routen. Diese Zeilen fügen wir in /etc/sysctl.conf an.

Wir übernehmen wir die Änderungen.

Nun prüfen wir ob diese beiden Pakete auf dem System bereits installiert sind.

Zu guter Letzt benötigen wir diese iptables Konfigurationen. Wir erstellen hierzu eine Systemd Unit welche ein kleines Bash-Script beim Booten ausführt. Alternativ kann auch /etc/rc.local oder ein eigenes Firewall-Script verwendet werden.

Systemd Unit erstellen.

Bash-Script sslh-transparent.sh anlegen.

Das Script ausführbar machen.

Die Systemd Unit aktivieren und starten.

Nachdem die Regeln angewendet wurden, kann sslh nun im Transparent-Modus neugestartet werden.
Wichtig: In Zeile 7 der Konfiguration /etc/sslh/sslh.cfg muss der Benutzer sslh stehen, ansonsten greifen die iptables Regeln nicht!

Im Webserver Logfile sind nun wieder wie gewohnt IP-Adressen zu sehen.
Hier schon eine gekürzte Version, da meine Webserver bereits DSGVO konform arbeiten. Wie man IP-Adressen kürzt zeige ich in diesem Tutorial!

 

0

dominion

Linux Systemadministrator

Das könnte dich auch interessieren …

5 Antworten

  1. Nur der Vollständigkeithalber: Theoretisch können auch mehrere Zertifikate benutzt werden. Dazu legt man mehrere legacy ports an. Zum Beispiel 5223, 5224, 5225 usw. Jeder Port bekommt dann sein eigenes Zertifikat.
    Erklärt ist das in der Prosody docu: https://prosody.im/doc/ports Das Beispiel für http_ssl { … } lässt sich auf lässt sich auf legacy_ssl_ssl { [5223] = {…}, [5224] = {…}} transferieren.
    Per sslh werden dann die verschiedenen domains auf die verschiedenen Ports gelenkt.

  2. agre sagt:

    Wie handlest du denn die Anfragen, die zum Beispiel über den port 5218 für den http_upload rein kommen?

    • Dominion sagt:

      Du kannst den http_upload Port natürlich auch über diese Weiche auf Port 443 laufen lassen. Dazu müsstest du einen entsprechenden vHost in deinem Webserver einrichten. SSLH leitet den http_upload Traffic wie normalen Webtraffic um.
      Ich nutze dazu https://modules.prosody.im/mod_http_upload_external.html und eine Subdomain die via HTTPS Port erreichbar ist.

      • agre sagt:

        Kurzes Feedback meinerseits: Ich habe mir einfach einen reverse proxy mit nginx für /upload und /register_web erstellt. Dann kann der https-port in prosody deaktiviert werden und es muss noch http_external_url festgelegt werden.
        Diese Variante spart ein Modul und eine Subdomain.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert