Dein gemeinsames Gateway sollte nicht jedes Profil bedienen: multiplex_profile_allowlist in Hermes


Du betreibst ein Discord-Gateway auf einem gemeinsam genutzten Server, und auf der Maschine sind fünf Hermes-Profile installiert: ein Allzweck-default, ein eingeschränktes Profil für die Kinder, zwei Entwickler-Profile. Startest du das Gateway, bootet es sofort die Adapter und Cron-Jobs jedes Profils. Schlimmer noch: Eine Nachricht, die eigentlich zum eingeschränkten Profil routen sollte, kommt an, während dieses Profil nicht verfügbar ist – und das Gateway führt sie stillschweigend unter default aus. Für ein eingeschränktes Profil ist das keine sanfte Degradierung, sondern ein Überschreiten der Capability-Grenze. PR #83400, gemergt am 11. August 2026, schließt genau diese Lücke: Mit gateway.multiplex_profile_allowlist deklarierst du, welche Profile dein gemeinsames Gateway bedient, und Routing, das die bediente Menge verfehlt, fails closed jetzt – die Nachricht wird abgelehnt, niemals stillschweigend herabgestuft.

Ein Config-Key definiert die bediente Menge

Füge die Allowlist zur config.yaml hinzu:

gateway:
  multiplex_profiles: true
  multiplex_profile_allowlist:
    - worker
    - guest

Mit diesen vier Zeilen startet und bedient dieses Gateway nur default, worker und guest – jedes andere auf dem Host installierte Profil wird weder gestartet noch über dieses Gateway exponiert.

Die exakte Semantik der Allowlist

Die Regeln (offizielle multi-profile-gateways.md-Doku) lohnen sich, einzeln durchzugehen, denn alle Edge Cases sind abgedeckt:

  • default wird immer bedient – du musst es nie auflisten;
  • Nicht gesetzt = bisheriges Verhalten: jedes gültige benannte Profil auf dem Host wird bedient;
  • Leere Liste [] = nur default wird bedient;
  • Namen werden normalisiert und dedupliziert; ungültige Einträge oder nicht installierte Profile werden mit einer Warnung übersprungen; ein fehlerhafter Nicht-Listen-Wert fails safe auf nur-default, nicht in einen Crash;
  • Die bediente Menge steuert auch die /p/<profile>/-API- und Webhook-Präfixe, den Laufzeitstatus, die profile_routes-Berechtigung und welche Profile der In-Process-Cron-Scheduler tickt;
  • Ein benanntes Profil außerhalb der Allowlist wird von diesem Gateway nicht gestartet – es kann aber weiterhin sein eigenes Standalone-Gateway betreiben. „Nicht vom gemeinsamen Gateway bedient“ bedeutet nicht „unbenutzbar“.

Fail closed: ablehnen statt stillschweigend herabstufen

Das ist der sicherheitsrelevante Teil der Änderung. Vorher bestand das Risiko: profile_routes routete einen Kanal explizit zu einem eingeschränkten Profil, aber wenn dieses Profil nicht verfügbar war (nicht installiert, defekt, außerhalb der bedienten Menge), fiel der Traffic stillschweigend auf default zurück. Die Regel ist jetzt umgekehrt:

  • Eine explizite Route matcht, aber ihr Zielprofil ist nicht installiert oder außerhalb der Allowlist → das Gateway lehnt die Nachricht ab und loggt Route und Zielprofil – es führt dafür nie default aus;
  • Traffic, der keine Route matcht, behält das bisherige Verhalten (geht an default);
  • profile_routes greift nur, wenn multiplex_profiles: true ist.

Praxis-Szenario: ein eingeschränktes Profil auf einem gemeinsamen Gateway

Der klassische Anwendungsfall ist ein Bot, den die ganze Familie teilt: ein Discord-Bot, bei dem die normalen Kanäle auf default laufen und der Kinderkanal auf einem eingeschränkten Profil. Das richtest du in zwei Schichten ein:

  1. Gateway-Schicht: multiplex_profile_allowlist listet nur default + kids-safe, und profile_routes leitet den Kinderkanal an kids-safe;
  2. Profil-Schicht: Das Härtung liegt in der eigenen config.yaml des eingeschränkten Profils – nur den Toolset aktivieren, den es braucht, die Credentials von default nicht erben, und so weiter. Profile sind isolierte Config-Homes, diese Isolierung passiert also ohnehin auf dieser Schicht.

Eine Grenze, die klar ausgesprochen werden muss: Die offizielle Doku erinnert uns daran, dass Profil-Routing plus Allowlist keine vollständige Security-Sandbox ist. Wenn du eine harte Grenze auf Betriebssystem-Ebene brauchst (etwa Code, der in einer isolierten Umgebung laufen muss), nutze separate Prozesse oder Container-Isolation – erwarte nicht, dass Routing auf Konfigurationsebene das abfängt.

Das Fazit

multiplex_profile_allowlist ist eine kleine Änderung, die einen echten Schmerz bei gemeinsamen Gateways löst: Du hast Profile für verschiedene Zwecke installiert, aber das Gateway hat früher alle wahllos bedient – und still degradiert, wenn eine Route danebenlag. Jetzt kannst du exakt deklarieren, wen dieses Gateway bedient, und aus der Degradierung eine Ablehnung machen. Das vollständige Multi-Instance-Konzept für Profile findest du in unserem Multi-Profil-Leitfaden; Profil-Routing in einem Feishu-Setup behandelt dieser Artikel; die Befehlsflächen liegen in den Referenzseiten hermes-gateway und hermes-profile.