Erweiterte URL-Filterung für Matrix
Morpheus ist ein Maubot-Plugin, das eingehende Nachrichten in Matrix-Räumen auf URLs scannt und diese gegen konfigurierbare Blacklists und Whitelists prüft.
Funktionsübersicht
Verfügbare Befehle
Öffentliche Befehle (für alle Nutzer)
| Befehl | Beschreibung |
|---|---|
!urlstatus <domain> |
Zeigt ob eine Domain whitelisted, blacklisted oder unbekannt ist — inklusive Wildcard- und Apex-Treffern. Akzeptiert auch vollständige URLs. |
!stats |
Gibt die Anzahl geladener Domains sowie Wildcards und offene Überprüfungen aus. |
!hilfe |
Zeigt die vollständige Befehlsübersicht — nur per Direktnachricht (DM). In Gruppenräumen reagiert der Bot nicht. |
!status |
Zeigt den aktuellen Bot-Status inkl. Datenbankverbindung, Uptime und Version. |
Moderationsbefehle (erfordern Berechtigung)
Ein Nutzer gilt als Moderator, wenn sein Powerlevel im Moderationsraum mindestens min_power_level (Standard: 50) beträgt oder seine Nutzer-ID in allowed_users eingetragen ist.
| Befehl | Beschreibung |
|---|---|
!allow <domain> |
Domain sofort whitelisten. Unterstützt Wildcards: !allow *.vertrauenswuerdig.de |
!unallow <domain> |
Domain oder Wildcard-Eintrag aus der Whitelist entfernen. |
!block <domain> |
Domain sofort blacklisten. Unterstützt Wildcards: !block *.boese-seite.com |
!unblock <domain> |
Domain oder Wildcard-Eintrag aus der Blacklist entfernen. |
!reloadlists |
Alle .txt-Dateien neu einlesen — kein Neustart nötig. |
!pending |
Zeigt alle Domains, die aktuell auf eine Moderationsentscheidung warten. |
!sendpending |
Sendet alle offenen Überprüfungsalarme erneut in den Mod-Raum. |
!mute <@nutzer:server> [-t Min.] |
Nutzer manuell stummschalten (Powerlevel -1). Optional -t für Dauer in Minuten. |
!unmute <@nutzer:server> |
Stummschaltung eines Nutzers manuell aufheben. |
!ignore <domain> |
Domain zur Vorschau-Ignore-Liste hinzufügen. |
!unignore <domain> |
Domain von der Vorschau-Ignore-Liste entfernen. |
Emoji-Reaktionen im Moderationsraum
Wenn eine unbekannte Domain erkannt wird, postet der Bot eine Alarmmeldung im Moderationsraum mit zwei Reaktionsknöpfen:
- ✅ — Domain zur Whitelist hinzufügen und Originalnachricht genehmigen.
- ❌ — Domain zur Blacklist hinzufügen.
Reaktionen von Nutzern ohne ausreichende Berechtigung werden still ignoriert.
Wie der Bot URLs erkennt
Der Bot verwendet vier Stufen, die nacheinander auf jede Nachricht angewendet werden:
Alle extrahierten Domains werden vor dem Listen-Vergleich normalisiert — Vollbreite-Zeichen (like google.com) sowie Unicode-Domains werden per IDNA in ihre Punycode-Form umgewandelt.
Wildcard-Einträge
Mit dem Präfix *. lassen sich ganze Domain-Familien auf einmal erfassen:
!block *.boese-seite.com → sperrt sub.boese-seite.com, api.boese-seite.com, ...
!allow *.vertrauenswuerdig.de → whitelisted alle Subdomains
| Geprüfte Domain | Eintrag | Match? |
|---|---|---|
sub.banned.com |
*.banned.com |
✅ Ja — Wildcard |
api.banned.com |
*.banned.com |
✅ Ja — Wildcard |
banned.com |
*.banned.com |
❌ Nein — Wildcard deckt nur Subdomains ab |
sub.banned.com |
banned.com (exakt) |
✅ Ja — Apex-Match |
a.b.banned.com |
banned.com (exakt) |
✅ Ja — Apex-Match |
Soll auch die Hauptdomain selbst gesperrt werden, müssen banned.com und *.banned.com als zwei separate Einträge angelegt werden.
Konfigurationsoptionen
Diese Optionen werden in base-config.yaml definiert und können pro Instanz im Maubot-Dashboard überschrieben werden.
Grundkonfiguration
| Parameter | Standard | Beschreibung |
|---|---|---|
blacklist_dir |
/data/blacklists/ |
Verzeichnis mit den Blacklist-.txt-Dateien. |
whitelist_dir |
/data/whitelists/ |
Verzeichnis mit den Whitelist-.txt-Dateien. |
mod_room_id |
(Pflichtfeld) | Matrix-Raum-ID des Moderationsraums (Format: !xxx:homeserver). |
mod_permissions.min_power_level |
50 |
Mindest-Powerlevel für Moderationsaktionen. 100 = nur Admin, 0 = jeder. |
mod_permissions.allowed_users |
[] |
YAML-Array von Nutzer-IDs mit fester Moderationsberechtigung. |
command_rooms |
[] |
Liste von Raum-IDs in denen der Bot auf Befehle reagiert. |
Datenschutz / DSGVO
| Parameter | Standard | Beschreibung |
|---|---|---|
secret_salt |
(Pflichtfeld) | Zufälliger Geheimschlüssel für SHA-256-Nutzer-Hashing. Generierung: python3 -c "import secrets; print(secrets.token_hex(32))" |
Linkvorschauen
| Parameter | Standard | Beschreibung |
|---|---|---|
enable_link_previews |
true |
Linkvorschauen für whitelisted URLs aktivieren. |
link_preview_timeout |
5 |
HTTP-Timeout in Sekunden für Vorschau-Abrufe. |
Spam-Schutz & Auto-Mute
| Parameter | Standard | Beschreibung |
|---|---|---|
warn_cooldown |
60 |
Warn-Cooldown in Sekunden. |
mute_enabled |
false |
Automatisches Stummschalten aktivieren. |
mute_threshold |
5 |
Anzahl der Verstöße innerhalb des Beobachtungsfensters. |
mute_window_minutes |
5 |
Beobachtungsfenster in Minuten. |
mute_duration_minutes |
60 |
Dauer der automatischen Stummschaltung (0 = unbegrenzt). |
mute_commands_enabled |
true |
Manuelle !mute und !unmute Befehle aktivieren. |
global_mute |
true |
Globales Stummschalten in allen Räumen des Bots. |
Installation mit Docker
Voraussetzungen
- Maubot läuft in Docker (Standard-Image:
dock.mau.dev/maubot/maubot) - Maubot läuft standardmäßig als UID/GID 1337 im Container
Schritt 1 — Plugin paketieren
cd /pfad/zum/plugin
zip -r url_filter.mbp \
maubot.yaml base-config.yaml main.py \
blacklists/custom.txt blacklists/ignore.txt whitelists/custom.txt
Schritt 2 — Plugin hochladen
- Maubot-Dashboard aufrufen:
https://dein-server/_matrix/maubot/#/plugins - "Upload plugin" klicken und die .mbp-Datei hochladen
- Neue Instanz erstellen, Bot-Client zuweisen und speichern
Schritt 3 — Verzeichnisstruktur anlegen
mkdir -p ./data/blacklists ./data/whitelists
touch ./data/blacklists/custom.txt
touch ./data/whitelists/custom.txt
Schritt 4 — Blacklist-Dateien ablegen
Hostfile-formatierte .txt-Dateien in ./data/blacklists/ ablegen.
Geeignete Quellen:
- oisd.nl — verschiedene Kategorien
- StevenBlack/hosts — konsolidierte Listen
- The Block List Project — nach Kategorie sortiert
./data/blacklists/
├── malware.txt
├── phishing.txt
├── scam.txt
└── custom.txt ← vom Bot verwaltet
Schritt 5 — Berechtigungen setzen ⚠️
Da Maubot im Container als UID 1337 läuft, müssen die Verzeichnisse diesem Nutzer gehören. Ohne korrekte Berechtigungen kann der Bot nicht in custom.txt schreiben.
chown -R 1337:1337 ./data/blacklists ./data/whitelists
Schritt 6 — Instanz konfigurieren
Im Maubot-Dashboard mindestens folgende Werte setzen:
blacklist_dir: /data/blacklists/
whitelist_dir: /data/whitelists/
mod_room_id: "!DEIN_MOD_RAUM_ID:homeserver.example"
secret_salt: "dein-zufaelliger-salt-hier"
Schritt 7 — Bot in Räume einladen
- Bot in alle zu überwachenden Räume einladen
- Bot in diesen Räumen auf Powerlevel 50 (Moderator) setzen
- Bot in den Moderationsraum einladen und Schreibrechte erteilen
- Wenn Auto-Mute verwendet wird: Bot auf Powerlevel 100 (Admin) setzen
Fehlerbehebung
chown -R 1337:1337 ./data/blacklists ./data/whitelistsdatabase: true und database_type: asyncpg in maubot.yaml gesetzt sind.Paketerstellung und Deployment
Nach Änderungen an den Quelldateien neu paketieren:
zip -r url_filter.mbp \
maubot.yaml base-config.yaml main.py \
blacklists/custom.txt blacklists/ignore.txt whitelists/custom.txt
Das aktualisierte .mbp im Maubot-Dashboard hochladen und die Instanz neu starten.
Neue .txt-Dateien in ./data/blacklists/ ablegen, Berechtigungen prüfen, dann !reloadlists im Moderationsraum eingeben — kein Neustart nötig.
Anforderungen
| Komponente | Mindestversion |
|---|---|
| Maubot | >= 0.4.0 |
| mautrix-python | >= 0.20.0 |
| Python | >= 3.10 |