Matrix Synapse absichern mit Draupnir Bot & Antispam-Modul

Moderation in Matrix kann schnell anspruchsvoll werden, besonders in offenen Räumen mit vielen unterschiedlichen Teilnehmern.
Um diese Aufgaben zuverlässiger und effizienter zu bewältigen, setze ich auf Draupnir – einen vielseitigen Moderationsbot, der sich nahtlos in bestehende Matrix-Umgebungen integriert.
Draupnir ist ein weiterentwickelter Fork, der auf Mjolnir aufbaut und spürbare Verbesserungen mitbringt: Wiederkehrende Moderationsaufgaben lassen sich automatisieren, während gezielte Schutzmechanismen helfen, Missbrauch frühzeitig einzudämmen.

Ein großer Vorteil ist die Unterstützung von Policy Lists – das sind spezielle Räume, in denen Communities gemeinsam Sperrlisten pflegen.
Indem mein Server an diesen Listen teilnimmt, kann ich auf bestehende Moderationsstrukturen zurückgreifen und muss nicht jede Bedrohung selbst erkennen und abwehren. Gerade bei organisiertem Spam oder systematischen Angriffen macht das einen großen Unterschied.

Zusätzlich habe ich mein Setup durch das synapse-http-antispam-Modul erweitert.
In diesem Beitrag zeige ich dir, wie du Draupnir und das Antispam-Modul zusammen so einrichtest, dass dein Homeserver optimal geschützt ist.

🔑 Bot-Benutzer erstellen und Access Token abrufen

Bevor Draupnir für dich arbeiten kann, braucht er einen eigenen Benutzer auf deinem Homeserver.
Wenn du Matrix über Docker betreibst, kannst du einfach folgenden Befehl auf deinem Matrix Host ausführen:

docker exec -it <matrix-app-docker> register_new_matrix_user -c /data/homeserver.yaml http://localhost:8008

Vergib einen passenden Benutzernamen wie draupnir und setze ein sicheres Passwort. Adminrechte sind notwendig, da Draupnir gewisse Aktionen im Raum steuern muss.

Den Access Token, den du für die spätere Konfiguration benötigst, kannst du anschließend über eine einfache Anfrage abrufen:

curl -XPOST -d '{"type":"m.login.password", "user":"DEIN_BENUTZERNAME", "password":"DEIN_PASSWORT"}' "https://matrix.domain.com/_matrix/client/r0/login"

Die Antwort enthält ein Feld namens "access_token" – diesen Token trägst du später in deiner production.yaml unter accessToken: ein. Achte darauf, dass der Token sicher aufbewahrt wird, da dieser Adminrechte mit sich bringt.

🏠 Managementraum erstellen

Erstelle einen neuen, privaten Matrix-Raum, der nur per Einladung erreichbar ist. Lade dort deinen Bot (z. B. @draupnir:domain.com) ein.

Hinweis: Aktuell gibt es Einschränkungen bei verschlüsselten Räumen. Ich empfehle daher, die Verschlüsselung für diesen Raum zu deaktivieren. Weitere Informationen dazu findest du in der Dokumentation.

Draupnir tritt dem Raum automatisch bei, sobald du diesen in der Konfiguration angibst und den Docker Container startest.

📂 Docker-Compose für Draupnir aufsetzen

Für den Betrieb erstelle ich ein kleines Docker-Compose-Setup. Hier ein Beispiel:

services:
  matrix-draupnir:
    image: gnuxie/draupnir:v2.3.0-beta.2
    container_name: matrix-draupnir
    hostname: matrix-draupnir
    restart: unless-stopped
    volumes:
      - ./data/matrix-draupnir/production.yaml:/data/config/production.yaml:ro
      - ./data/matrix-draupnir/storage:/data/storage
    command: >
      bot --draupnir-config /data/config/production.yaml

Wichtig:
Damit Draupnir überhaupt mit dem neuen synapse-http-antispam-Modul arbeiten kann, musst du aktuell die neueste Beta-Version von Draupnir verwenden (ab v2.3.0-beta.2).
Erst ab dieser Version werden die HTTP-Abfragen an Synapse vollständig unterstützt.
Ältere Versionen von Draupnir kennen das HTTP-Antispam-Feature noch nicht und könnten deshalb nicht korrekt mit deinem Server zusammenarbeiten.

📄 Die Draupnir-Konfiguration

Erstelle die Konfigurationsdatei aus dem Projektordner heraus:

mkdir -p ./data/matrix-draupnir
nano ./data/matrix-draupnir/production.yaml

Die wichtigste Datei für Draupnir ist production.yaml.
Hier definierst du, wie dein Bot arbeiten soll. Ein einfaches Beispiel:

# URL zum Matrix-Homeserver (Client-API)
homeserverUrl: "https://matrix.domain.com"

# Öffentliche Client-API URL (z. B. für Reports)
rawHomeserverUrl: "https://matrix.domain.com"

# Access Token des Bots
accessToken: "qLm6eqTyCQ9KCbHWDqb6di8g5X5rQZVM"

# Speicherort für Bot-Daten
dataPath: "/data/storage"

# Nur Einladungen von Managern akzeptieren
autojoinOnlyIfManager: true

# Managementraum (Alias oder Raum-ID)
managementRoom: "!jWjChHtdpOkbgTSnK:domain.com"

# Log-Level (DEBUG, INFO, WARN, ERROR)
logLevel: "INFO"

# Moderationsrechte beim Start überprüfen
verifyPermissionsOnStartup: true

# Bot führt Aktionen nur im Testmodus aus
noop: false

# Kein Server ACL setzen
disableServerACL: false

# Nachrichten bei bestimmten Ban-Gründen automatisch löschen
automaticallyRedactForReasons:
  - "spam"
  - "advertising"

# Alle beigetretenen Räume automatisch schützen
protectAllJoinedRooms: true

# Pause zwischen Bot-Aktionen in Millisekunden
backgroundDelayMS: 500

admin:
  # Adminrechte im Raum vergeben können
  enableMakeRoomAdminCommand: true

commands:
  # Befehle ohne !draupnir Präfix zulassen
  allowNoPrefix: false

  # Weitere Befehlsprefixes erlauben
  additionalPrefixes:
    - "draupnir"

  ban:
    # Standard-Ban-Gründe bei fehlendem Grund
    defaultReasons:
      - "spam"
      - "brigading"
      - "harassment"
      - "disagreement"

protections:
  wordlist:
    # Gebannte Wörter bei Raumbeitritt
    words:
      - "bad word"
      - "click here"
     #- "kann-um-beliebig-viele-Worte-erweitert-werden"

    # Minuten bis Benutzer als "vertrauenswürdig" gilt
    minutesBeforeTrusting: 30

roomStateBackingStore:
  # Raumzustand lokal zwischenspeichern
  enabled: true

health:
  healthz:
    # Healthcheck-Endpoint aktivieren (für z. B. Docker)
    enabled: true

  sentry:
    # Fehlerbericht-Tool (optional)
    #dsn: ""

web:
  enabled: true
  address: 0.0.0.0
  port: 8082

  abuseReporting:
    # Abuse-Report Web API aktivieren
    enabled: false

  synapseHTTPAntispam:
    enabled: true
    authorization: 8EEGpJGVsR2yHmXaA9r74SwcmijLpQmraRm6HuivhG8in5KJ8H

# Reports regelmäßig bei Synapse abfragen
pollReports: false

# Neue Reports im Management-Raum anzeigen
displayReports: true

safeMode:
  bootOption: RecoveryOnly  # Oder: Never, Always

retryConfig:
  maxAttempts: 5
  baseDelayMs: 1000

Damit Draupnir und dein Matrix-Server sicher miteinander kommunizieren können, wird ein sogenannter Access Token verwendet.
Dieser Token ist eine Art „geheimer Schlüssel“, der beide Seiten authentifiziert.
Wichtig: Sowohl in der Draupnir-Konfiguration als auch im Synapse-Modul (homeserver.yaml) muss derselbe Token eingetragen werden, damit später das synapseHTTPAntispam-Modul funktioniert.

In meinem Beispiel lautet der Token:

8EEGpJGVsR2yHmXaA9r74SwcmijLpQmraRm6HuivhG8in5KJ8H

Der Token darf gerne mindestens 50 Zeichen lang sein.

Falls du selbst einen neuen sicheren Token erzeugen möchtest, kannst du das einfach auf der Linux-Konsole tun:

tr -dc 'A-Za-z0-9' </dev/urandom | head -c50

Dieser Befehl erzeugt einen zufälligen, 50 Zeichen langen String, den du als Authorization-Token verwenden kannst.

Weitere Konfigurationsmöglichkeiten findest du im Repositoty auf Github.

Die Datei enthält die wichtigsten Einstellungen. Einige erkläre ich dir hier im Kurzformat:

OptionBedeutung
homeserverUrlDeine Matrix-Homeserver-URL (Client-API)
accessTokenToken des Bots, muss Adminrechte haben
managementRoomRaum-ID oder Alias für Steuerungsraum
synapseHTTPAntispamAccess-Token für synapseHTTPAntispam-Modul

🧩 Synapse HTTP Antispam-Modul integrieren

Zusätzlich habe ich meinen Synapse-Server um das Modul synapse-http-antispam erweitert.
Dieses Modul verknüpft deinen Homeserver direkt mit Draupnir und bietet eine wichtige Ergänzung zum klassischen Spam-Schutz.

Wenn ein Benutzer auf einer Bannliste steht, kann das Modul verhindern, dass dieser Chatanfragen an deine Benutzer stellt oder neuen Räumen beitritt.
Der Zugriff auf die aktuelle Version und die Dokumentation des Moduls ist auf GitHub verfügbar.

Bare Metal Nutzer installieren das Modul einfach auf dem Matrix Server:

pip install synapse-http-antispam

Docker-Nutzer (wie ich) bauen ein eigenes Image, mit Synapse und dem Modul:

FROM matrixdotorg/synapse:latest

RUN pip install --no-cache-dir synapse-http-antispam

Alternativ kannst du auch mein fertiges Docker Image verwenden:

repo.techniverse.net/docker-hosted/custom-synapse:latest

Damit Synapse das Modul korrekt nutzt, musst du anschließend in deiner homeserver.yaml folgendes ergänzen:

modules:
  - module: synapse_http_antispam.HTTPAntispam
    config:
      base_url: http://matrix-draupnir:8082/api/1/spam_check
      authorization: '8EEGpJGVsR2yHmXaA9r74SwcmijLpQmraRm6HuivhG8in5KJ8H'
      enabled_callbacks:
        - check_event_for_spam
        - user_may_invite
        - user_may_join_room
      fail_open:
        check_event_for_spam: true
        user_may_invite: false
        user_may_join_room: false
      async:
        check_event_for_spam: true

📖 Was macht dieses Modul eigentlich?

Das synapse-http-antispam-Modul ermöglicht es deinem Synapse-Server, bestimmte Prüfungen an einen externen Dienst auszulagern – in unserem Fall: Draupnir.
Dabei nutzt es sogenannte Callbacks, also definierte Stellen im Nachrichtenfluss, an denen entschieden werden kann, ob ein Verhalten erlaubt ist oder nicht.

Die wichtigsten Hooks, die du in enabled_callbacks aktivierst:

  • check_event_for_spam
    Wird ausgelöst, wenn ein Nutzer eine Nachricht sendet oder eine Aktion durchführt. Draupnir kann das Ereignis analysieren und ggf. blockieren.
  • user_may_invite
    Prüft, ob ein Nutzer überhaupt jemand anderen in einen Raum einladen darf.
  • user_may_join_room
    Entscheidet, ob ein Nutzer einem bestimmten Raum beitreten darf.

Durch diese Mechanismen kann Draupnir proaktiv moderieren – und potenziellen Spam abwehren, bevor er überhaupt in einem deiner Räume ankommt.

🔍 Erklärung der wichtigsten Optionen

OptionBedeutung
base_urlDie vollständige URL, über die Synapse Draupnir erreicht. Bei Docker reicht der Containername im gleichen Netzwerk (hier z. B. matrix-draupnir).
authorizationDer gleiche Token wie in Draupnir (production.yaml) – dient der sicheren Authentifizierung zwischen Synapse und dem Bot. (siehe „Die Draupnir-Konfiguration“
enabled_callbacksAktiviert gezielt nur die Prüfungen, die du brauchst. Draupnir wird nur auf diese Ereignisse reagieren.
fail_openGibt an, ob Aktionen erlaubt sein sollen, falls Draupnir nicht erreichbar ist. Sinnvoll als Fallback, damit Synapse nicht „dichtmacht“.
asyncErlaubt die asynchrone Prüfung von Nachrichten, was Synapse bei hoher Last entlasten kann.

🚀 Draupnir starten

Starte jetzt deinen Bot mit einem einfachen:

docker compose up -d

🧭 Und jetzt? Ein Überblick nach dem Start

Nach dem Start ist Draupnir zwar aktiv, aber noch nicht ganz „scharf geschaltet“. Achte unbedingt auf folgende Schritte:

  • Der Bot muss Mitglied in den zu schützenden Räumen sein.
  • Er braucht dort Adminrechte, um effektiv moderieren zu können.
  • Protections wie die Wortfilter müssen aktiviert sein (z. B. !draupnir protections enable WordListProtection).
  • Über !draupnir status kannst du den aktuellen Zustand des Bots prüfen.

Wenn das alles passt, übernimmt Draupnir für dich die ersten Moderationsaufgaben vollautomatisch.

⚖️ Policy-Räume aktivieren

Willst du noch eine Schippe drauflegen? Dann abonniere ein paar Policy-Listen in deinem Management-Room:

!draupnir watch #tchncs-ban-list:tchncs.de
!draupnir watch #matrix-org-hs-tos-bl:matrix.org
!draupnir watch #asragrbanlist_general:asra.gr
!draupnir watch #community-moderation-effort-bl:neko.dev
!draupnir watch #techniverse-bans-bl:techniverse.net
!draupnir watch #policy:ztfr.de

Damit aktiviert Draupnir die Community-Listen für automatische Bannregeln.

Diese Policy-Räume beinhalten von der Community gepflegte Blocklisten mit bekannten Spam-Accounts, Trollen oder böswillig agierenden Servern. Sobald du diese Listen mit Draupnir abonnierst, wertet der Bot die enthaltenen Regeln aus und kann automatisch Nutzer bannen oder Server ausschließen, sobald diese einem deiner geschützten Räume beitreten. Damit entsteht ein gemeinschaftlicher Schutzmechanismus, von dem dein Server direkt profitiert.

🧱 Deine eigene Policy List erstellen

Du willst selbst eine Policy-Liste pflegen und mit anderen teilen? Kein Problem – Draupnir bringt alles mit, was du dafür brauchst.

Mit einer eigenen Policy List kannst du Regeln wie Bannlisten oder Einschränkungen zentral verwalten. Statt einzelne User manuell in jedem Raum zu bannen, definierst du deine Regeln einmal – und Draupnir setzt sie dann überall gleichzeitig um.

Die Erstellung ist denkbar einfach:

!draupnir list create community-bans draupnir-bans

Dieser Befehl erzeugt eine neue Policy-Liste mit dem Shortcode community-bans und dem Alias #draupnir-bans:domain.com.

Sobald der Raum erstellt ist, kannst du:

  • per !draupnir ban <user> community-bans spam Regeln hinzufügen
  • den Raum für andere Communities freigeben (wenn gewünscht)
  • mit !draupnir watch diesen Raum auch auf anderen Servern einbinden

💡 Du kannst dir jederzeit mit !draupnir status anzeigen lassen, welche Policy-Räume dein Bot aktuell überwacht – inklusive der jeweiligen Shortcodes.

🛡️ HTTP-Antispam-Modul aktivieren: Zwei wichtige Protections

Damit dein Synapse-Server überhaupt mit dem neuen HTTP-Antispam-Modul arbeitet, musst du zwei spezielle Schutzmechanismen in Draupnir aktivieren:

!draupnir protections enable BlockInvitationsOnServerProtection
!draupnir protections enable RoomTakedownProtection

Ohne diese Aktivierung bleibt das Modul inaktiv und prüft keine Aktionen.
BlockInvitationsOnServerProtection sorgt dafür, dass Einladungen von gebannten Servern automatisch blockiert werden.
RoomTakedownProtection verhindert, dass Benutzer von blockierten Servern neue Räume betreten oder erstellen können.

Erst wenn beide Protections eingeschaltet sind, wird der zusätzliche Schutz durch das synapse-http-antispam-Modul auf deinem Homeserver wirksam.

Wenn ein geblockter Benutzer nun versucht eine Chatanfrage zu stellen, kann man dies auch ganz gut in den Logs sehen:

🔒 Weitere nützliche Protections und Empfehlungen

Hier ein paar weitere Protections, die du aktivieren kannst:

NameBeschreibungEmpfehlung
WordListProtectionBannt neue Nutzer bei bösen Wörtern✅ Sofort aktivieren
BasicFloodingProtectionBannt bei zu vielen Nachrichten in kurzer Zeit⚠️ Verbuggt – nur testen, nicht produktiv
FirstMessageIsImageProtectionBannt, wenn erste Nachricht ein Bild oder Video ist✅ Sehr hilfreich gegen Spam
JoinWaveShortCircuitProtectionSchützt bei Mass-Join durch Setzen auf Invite-only✅ Sinnvoll bei öffentlichen Räumen
MentionLimitProtectionEntfernt Nachrichten mit zu vielen @Mentions✅ Gut für große Communitys
MessageIsMediaProtectionEntfernt Bild-/Video-Spam, aber ohne Bann✅ Gute Ergänzung
MessageIsVoiceProtectionEntfernt Sprachnachrichten automatisch🔹 Optional – je nach Raumkultur
NewJoinerProtectionBannt alle neuen Nutzer von bestimmten Homeservern⚠️ Sehr aggressiv, mit Vorsicht nutzen
TrustedReportersZählt Reports von „trusted“ Usern → automatische Aktionen🔮 Für Teams mit festen Moderatoren
MemberBanSynchronisationProtectionSynchronisiert Bans aus beobachteten Policy-Listen automatisch (siehe oben)✅ Essenziell für Ban-Automatisierung

Diese Liste stellt eine Auswahl von Moderationsfunktionen dar, die du in Draupnir gezielt aktivieren kannst, um dein Setup weiter abzusichern. Jede dieser sogenannten Protections beobachtet ein spezifisches Verhalten im Raum und reagiert automatisch darauf – etwa mit einem Bann, einer Nachricht oder einer anderen Aktion.

!draupnir protections enable <PolicyName>
!draupnir protections disable <PolicyName>

Je nach Art deiner Community, der Offenheit deiner Räume und der Anzahl der Nutzer solltest du individuell entscheiden, welche dieser Protections sinnvoll sind. Besonders für öffentliche oder semi-öffentliche Räume, in denen du mit Trollen, Spammern oder Bot-Wellen rechnen musst, sind einige dieser Funktionen echte Gamechanger.

👉 Tipp:
Du kannst jederzeit prüfen, welche Protections aktiv sind, indem du im Managementraum folgendes eingibst:

!draupnir protections

In der Ausgabe siehst du dann eine Liste aller verfügbaren Protections sowie deren aktuellen Status („enabled“ oder „disabled“).

🔧 Weitere nützliche Befehle

Hier findest du eine praktische Kurzübersicht häufig verwendeter Befehle, mit denen du Draupnir direkt über deinen Management-Raum steuern kannst. Die Tabelle bietet dir eine schnelle Orientierung, wie du Status abrufst, Protections aktivierst oder Policy-Räume verwaltest:

BefehlFunktion
!draupnir statusZeigt den aktuellen Status des Bots und der geschützten Räume
!draupnir list protectedZeigt alle aktuell geschützten Räume
!draupnir watch <room>Aktiviert eine Policy-Liste und schützt Räume gemäß der Regeln
!draupnir unwatch <room>Deaktiviert eine Policy-Liste
!draupnir protect <room>Fügt einen Raum manuell zum Schutz hinzu
!draupnir unprotect <room>Entfernt einen Raum aus der Schutzliste
!draupnir protectionsListet alle verfügbaren Schutzmechanismen
!draupnir ban <entity> <list> <reason>Bannt einen Nutzer, Server oder Raum und fügt ihn der Policy-Liste hinzu
!draupnir unban <entity>Entfernt einen Nutzer/Server/Raum aus der Bannliste
!draupnir kick <user>Entfernt einen Nutzer aus einem Raum (auch mit --room, --glob, --dry-run)
!draupnir redact <entity>Löscht Nachrichten eines Nutzers (auch mit Limit oder raumspezifisch möglich)
!draupnir shutdown room <room>Schließt einen Raum und informiert alle Teilnehmer über die Sperrung
!draupnir rulesZeigt alle aktiven Bann-/Policy-Regeln
!draupnir roomsListet alle geschützten Räume
!draupnir rooms add <room>Fügt einen Raum zum Schutzsystem hinzu
!draupnir rooms remove <room>Entfernt einen Raum aus dem Schutzsystem
!draupnir list create <shortcode> <alias>Erstellt eine neue Policy-Liste mit Raum-Alias
!draupnir safe modeVersetzt den Bot in den Safe-Mode
!draupnir helpZeigt eine Hilfe zu Befehlen

🚩 Fazit

Mit diesem Setup hast du eine solide Grundlage, um deine Matrix-Räume automatisiert und effektiv zu moderieren. Draupnir ist mächtig, aber auch ein komplexes Werkzeug – nimm dir die Zeit, dich mit den Policy-Optionen und Protection-Mechanismen vertraut zu machen. Dieser Quick Start bringt dich auf jeden Fall direkt ins Geschehen.

👥 Techniverse Community

Matrix, Selfhosting, smarte IT-Lösungen und jede Menge Nerd-Talk – das findest du in der Techniverse Community.
Komm vorbei, tausch dich aus und werde ein Teil von uns.
👉 Unsere Gruppe auf Matrix: #community:techniverse.net
Wir freuen uns auf dich!

📑 Ähnliche Beiträge
Migration von MySQL 5.7 zu MySQL 8.0 in Docker

Der Wechsel von MySQL 5.7 auf die neuere Version 8.0 kann auf den ersten Blick einschüchternd wirken. Besonders wenn du Read more

Vergrößern einer Partition in Ubuntu

Stell dir vor, deine Ubuntu-Installation braucht einfach mehr „Luft zum Atmen“. Angenommen, du hast eine 100GB-SSD, auf der 30GB für Read more

Asciinema 3: Installation der neuesten Version des Terminal Session Recorder

Asciinema hat sich als das Tool der Wahl für das Aufzeichnen und Teilen von Terminal-Sessions etabliert. In der kommenden Version Read more

Rustdesk-Server als Dockerlösung

Warum RustDesk? Sicherheitsvorfälle bei zentralisierten Fernwartungslösungen wie AnyDesk und TeamViewer zeigen, wie wichtig unabhängige Alternativen sind. Im Februar 2024 bestätigte Read more

Fritz!Box per Bash-Script neustarten

Heute möchte ich dir ein nützliches Bash-Script vorstellen, das mir persönlich sehr geholfen hat. Es handelt sich um ein "Fritz!Box Read more

Vielen Dank fürs Teilen!