Eigener verschlüsselter Chat-Server mit Matrix Synapse

Ein sicherer Chat ist heutzutage viel Wert: eure Chatnachrichten werden bei WhatsApp & Co. ausgewertet und bei Bedarf an Behörden oder Unternehmen weitergegeben (wie das bei Facebook war).

Wer über einen eigenen kleinen Server verfügt, kann schnell einen eigenen Chatserver mit Federation aufsetzen und so verschlüsselt mit allen Freunden und Bekannten chatten. Die Clients gibt es für alle Plattformen! Wer sogar einen TURN / STUN Server hat, kann Videotelefonie aktivieren. Die Zaubersoftware dafür heißt Matrix Synapse.

Die Installation unter Debian ist einfach, allerdings ist die richtige Konfiguration für z.B. Federation etwas tricky. Federation ist ähnlich wie bei Nextcloud oder Diaspora die Möglichkeit, sich mit Usern und Chaträumen von anderen Matrix Chat-Servern zu verbinden. Damit ergibt sich ein dezentrales Netzwerk.

Installation

Die Grundinstallation am besten über die offizielle Debianquelle durchführen:


sudo apt install -y lsb-release wget apt-transport-https
sudo wget -O /usr/share/keyrings/matrix-org-archive-keyring.gpg https://packages.matrix.org/debian/matrix-org-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/matrix-org-archive-keyring.gpg] https://packages.matrix.org/debian/ $(lsb_release -cs) main" |
    sudo tee /etc/apt/sources.list.d/matrix-org.list
sudo apt update
sudo apt install matrix-synapse-py3

Während der Installation legt man den Chat Servernamen fest. Unter diesem Hostnamen läuft der Chatserver, also z.B. chat.deinedomain.de. Dieser Servername muss später im Client angegeben werden.

Abschließend starten wir den Service und überprüfen, ob die Ports 8008 und 8448 (Federation Port) verfügbar sind:


systemctl start matrix-synapse
systemctl enable matrix-synapse

netstat -tulpn

Ich würde euch empfehlen, PostgreSQL für die Nutzerdatenbank zu verwenden. Die Installation bzw. Einrichtung ist nicht schwer, aber die Infos brauche ich nicht kopieren, sondern findet ihr direkt beim Hersteller immer up to date.

nginx Reverse Proxy / SSL

Damit der Chatserver direkt unter dem oben festgelegten Hostname laufen kann, wäre ein SSL Proxy sinnvoll. Let´s Encrypt bzw. Certbot zum Erstellen der Zertifikate reicht dafür aus. Der nginx Vhost sollte dann so aussehen:

Da in Matrix Key und Cert von Let´s Encrypt noch einmal benötigt werden, aber Matrix keinen Zugriff auf die Let´s Encrypt Pfade hat, müssen wir die von Certbot generierten Dateien jedes Mal in den Matrix Folder kopieren und dann dem Matrix User zuweisen. Folgendes Skript automatisiert über den Crontab diesen Prozess, sobald ihr ihn einmal initial eingerichtet habt.

Matrix Konfiguration

Die wichtigste und abschließende Konfiguration passiert unter /etc/matrix-synapse/homeserver.yaml. Damit User sicher manuell registriert werden können, solltest du vorher ein eigenes Secret über einen Passwort Generator oder über die Kommandozeile erzeugen (registration_shared_secret).

Nicht vergessen, vorher PostgreSQL einzurichten und Key und Cert zu kopieren. Folgende Punkte solltest du editieren:

Einmal neustarten und alles sollte nun laufen.

DNS

Gehe nun in deine Domainverwaltung und füge für Federation folgenden SRV Record hinzu:

_matrix._tcp   SRV    10 0 8448 chat.deinedomain.de.

SRV ist dabei nur der DNS Typ, d.h. links davon wird der Key definiert und der rechte Teil ist der Value. Die Punkte nicht vergessen, da diese entscheidend sind!

Ob Federation funktionert, solltest du als erstes prüfen, dass du beim Federation Checker keine Propertie siehst, die false anzeigt oder einen Error:

https://matrix.org/federationtester/api/report?server_name=chat.deinedomain.de

Es kann sein, dass es etwas dauert, bis der SRV Record richtig geladen wird.

Abschließend

Da nun alles konfiguriert ist, registrieren wir den ersten (Admin)-User, was nur über die Kommandozeile geht!


register_new_matrix_user -c /etc/matrix-synapse/homeserver.yaml http://localhost:8008

Lest euch die Anweisungen am Bildschirm genau durch und erstellt für euch selbst einen Admin Account!

Damit ihr nun chatten könnt, braucht ihr noch einen Chat Client. Der beste und bekannteste ist Element (ehemals Riot). Ihr könnt es entweder direkt auf eurem PC installieren oder als Web Applikation selbst hosten. Bei der Anmeldeseite müsst ihr lediglich auf Benutzerdefinierter Server klicken und dort unter Heimserver-URL eure Chat Serverdomain einstellen. Identitätsserver URL ist immer https://vector.im!

Für jeden weiteren Nutzer, der mit euch chatten mag, entweder auf matrix.org registrieren oder bei euch hosten mittels register_new_matrix_user.

Umstieg von Riot auf Element

Wer Matrix bisher mit dem Paket matrix-synapse betrieben hat, wird feststellen, dass der neue Element Client – ehemals Riot – nicht mehr mit diesem veralteten Serverpackage geht. Daher bitte oben nochmal die neuen Sources einstellen und schlicht matrix-synapse-py3 drüber installieren. Die Migration scheint ohne Probleme mit den gleichen Configs zu laufen.


Du möchtest regelmäßig Neuigkeiten von meinem Blog? Trag dich für meinen Newsletter ein:

chatFederationInstallationMatrixMessengerOpen SourceRiotsecureSynapseverschlüsselt
Comments (16)
Add Comment
  • noses.

    Letsencrypt: Ich würde auf dieses magische chown-Gedöns aus der crontab verzichten, matrix eine eigene Gruppe geben und mit setfacl auf den entsprechenden Pfaden Zugriff für matrix-synapse erlauben. Das ist, falls man seine Dokumentation schludrig führt, auch noch einfacher zu finden, wenn man danach sucht.

    • Benjamin Hartwich

      Ich bin mir nicht sicher, ob die Gruppenzuordnung des matrix synapse users so sinnvoll ist. So wie ich Debian bei Gitlab z.B. kenne, werden die Gruppenzuordnungen der Service-User bei Paketupdates teils wieder auf initial zurückgesetzt.

  • Andre

    Geil währe jetzt noch die User von WordPress mit Synapse zu verbinden. Sollte über kamax und die WP Rest Api irgendwie funktionieren. Hast du darüber irgendwelche Informationen?

    • Benjamin Hartwich

      Nein, leider nicht. Die Administration von Usern ist bei Matrix leider generell mehr als schlecht.

  • marko

    Wo kommt denn der Part der ngix konfig hin?
    Als nicht ganz Profi verstehe ich das nicht.

    wie muss am ende die nginx.conf komplett aussehen?
    paste ich den code vom howto an das ende der ngix.conf
    bekomme ich unter systemctl restart nginx fehler und nginx läuft nicht….

    danke
    marko

    • Benjamin Hartwich

      Der nginx Part muss in eine Config-Datei, z.B. unter conf.d eine Datei mit matrix.conf anlegen. Du kannst die Anweisungen meines Erachtens auch in die nginx.conf in den http block packen, aber ich habe es immer gern separiert. Für die nginx.conf musst du für Matrix nichts groß beachten. Mit nginx -t prüfst du, was genau falsch ist.

  • Thomas

    Ich bin gerade über die DNS Konfiguration gestolpert:
    _matrix._tcp.
    Ohne den Punkt am Ende geht es – oder halt die eigene Domain vorher noch mit dranhängen und danach den Punkt zum abschließen des Eintrags.

  • Markus

    Das kopiere mit den Zertifikaten kann man sich sparen, wenn man einen Reverse Proxy mit NGINX auf den 8448 macht. Danach kann man auch den 8448-Listener aus der homeserver.yaml entfernen und alle TLS*-Einträge. Bisschen schmaler 😉

    server {
    server_name matrix.server.de;
    listen 80;
    listen [::]:80;
    return 301 https://$server_name$request_uri;
    }

    server {
    server_name matrix.server.de;
    listen 443 ssl;
    listen [::]:443 ssl;
    listen 8448 ssl;
    listen [::]:8448 ssl;

    gzip off;

    # SSL
    ssl_certificate fullchain.pem;
    ssl_certificate_key privkey.pem;
    ssl_dhparam dhparam4096.pem;
    ssl_trusted_certificate chain.pem;

    ssl_ecdh_curve secp521r1:secp384r1;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-256-GCM-SHA384:TLS13-AES-128-GCM-SHA256:EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH;
    ssl_prefer_server_ciphers on;
    ssl_buffer_size 4k;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 15m;
    ssl_session_tickets off;
    ssl_stapling on;
    ssl_stapling_verify on;

    # MATRIX
    location /_matrix {
    proxy_pass http://127.0.0.1:8008;
    proxy_set_header X-Forwarded-For $remote_addr;
    }

  • Andreas

    Servus,

    die DNS-Konfiguration ist oder wird wohl bald obsolet sein. Darauf sollte man Verzichten und die Umsetzung lieber mit den .well-known Dateien machen. Das ist viel einfacher und wird schneller aktualisiert.
    LG Andreas

  • Lock

    Hallo und Danke für diese Anleitung.
    Kann ich diese Anleitung auch auf meinen Rasbian nutzen oder muss ich hier was umstellen?
    Rasbian basiert doch auf Debian

    Gruß Lock

  • Stefan

    Hallo und danke für deine Anleitung.

    Kannst du mir bitte diesen Punkt etwas genauer beschreiben.
    Was muss ich bei Debian machen ?

    Gehe nun in deine Domainverwaltung und füge für Federation folgenden SRV Record hinzu:
    _matrix._tcp SRV 10 0 8448 chat.deinedomain.de.

    Dank dir!

    • Benjamin Hartwich

      Das musst du im DNS setzen (SRV-Record) – hat mit Debian nichts zu tun.

  • Matrixuser

    Hallo,
    Meine Frage dazu wäre, ob es eine maximale Useranzahl gibt, die sich z.B. über Element mit meinem Server verbinden? Also ich habe derzeit 6 Benutzer angelegt. Und bei einem kam die Meldung, dass der “Server voll ist”. Ich dachte, dass man bei einem selbst aufgesetzten Server keine Begrenzung hat. Oder kann man das irgendwie einstellen? Wäre wirklich hilfreich das zu wissen.
    Geplant wären ca. 25 Leute die auf dem Server chatten wollen.

  • Pascal

    Hab jetzt auch einen synapse server laufen.

    Direkt über Python in einen virtualenv installiert.

    Habe python3 benutzt und mich für PostgreSQL entschieden.

    Die Datenbank und die Python executables und der rest bis auf den Media Store liegt auf einer ssd.

    Habe meinem Synapse Container 2 CPU Kerne und 4gb ram gegeben.

    Habe auch diverse Optionen in der Synapse config getätigt um die Leistung zu steigern.

    Leider ist es immernoch manchmal etwas träge v.a. wenn der backlog geladen wird.

    Im Log hab ich gesehen dass viele Server nicht erreicht werden können bzw per DNS gar nicht aufgelöst werden können (time Out)

    Hat jemand eine Idee wie man diese Probleme beheben kann.