Audit-Log¶
Das Audit-Log unter Admin → Einstellungen → Audit-Log (/admin/settings?tab=audit-log) beantwortet die beiden Fragen, die eine Sicherheitsprüfung an eine Instanz stellt, die eine Landkarte der gesamten IT-Landschaft enthält: Was hat sich darin geändert und wer hat sich wie angemeldet. Es ist in zwei Unterregisterkarten aufgeteilt:
| Unterregisterkarte | URL | Was sie aufzeichnet |
|---|---|---|
| Änderungen | /admin/settings?tab=audit-log |
Jeden Schreibvorgang in der Landschaft — Karten, Beziehungen, Risiken, Tags, Stakeholder-Rollen, Entscheidungsentwürfe —, gruppiert in Mutations-Batches, mit einem Diff pro Ereignis und einem Rollback |
| Sicherheit & Administration | /admin/settings?tab=audit-log&view=security |
Anmeldungen und Abmeldungen, fehlgeschlagene Versuche, Sperrungen, SSO- und Proxy-Sitzungen, Passwortereignisse, Rollenübernahme und jede administrative Aktion |
Die beiden sind bewusst getrennt. Änderungen ist ein Arbeitswerkzeug — es existiert, damit Sie einen fehlerhaften Schreibvorgang sehen und rückgängig machen können — und hält nur eine kurze Historie vor. Sicherheit & Administration ist eine Beweisspur: Ihre Einträge lassen sich weder bearbeiten noch löschen, und sie wird standardmäßig ein Jahr lang aufbewahrt.
Wer es sehen darf¶
Beide Unterregisterkarten erfordern die Berechtigung admin.events („Audit-Trail und Ereignisstrom anzeigen“), die standardmäßig nur die Rolle Admin besitzt. Um einer Sicherheits- oder Compliance-Verantwortlichen Lesezugriff zu geben, ohne sie zur Administratorin zu machen, legen Sie unter Benutzer und Rollen eine Rolle mit admin.events an und weisen Sie sie ihr zu.
Änderungen¶
Die Unterregisterkarte Änderungen ist das Register der Mutations-Batches. Jeder ändernde Schreibvorgang landet hier als Batch, zusammen mit der Person, die ihn ausgelöst hat, und seiner Herkunft:
| Herkunft | Bedeutung |
|---|---|
| Web | Die Weboberfläche von Turbo EA |
| API | Ein direkter Aufruf der REST-API (ein Skript, eine Integration) |
| KI-Werkzeug | Ein KI-Assistent, der über den MCP-Server verbunden ist |
| Erweiterung | Eine installierte Erweiterung, aufgezeichnet als ext:<key>-Batch |
Klicken Sie auf einen Batch, um seine Seitenleiste zu öffnen: Der Diff pro Ereignis zeigt den alten und neuen Wert jedes Felds, und Rollback nimmt die Schreibvorgänge an Karten, Beziehungen, Risiken, Stakeholder-Rollen, Tags und Entscheidungsentwürfen zurück, die er vorgenommen hat.
Batches werden MUTATION_BATCH_RETENTION_DAYS Tage lang aufbewahrt (eine Umgebungsvariable, Standard 15) und danach automatisch bereinigt. Die Ereignisse selbst bleiben auch danach in der Registerkarte Historie jeder Karte erhalten.
Sicherheit & Administration¶

Die Unterregisterkarte Sicherheit & Administration listet einen Eintrag pro sicherheitsrelevanter Aktion, die neuesten zuerst:
- An- und Abmeldungen, per Passwort, SSO oder über einen vertrauenswürdigen Reverse Proxy;
- fehlgeschlagene Anmeldeversuche, jeweils mit einem Grundcode, der angibt, warum sie fehlschlugen;
- Kontosperrungen nach wiederholten Fehlversuchen;
- Registrierungen sowie das Festlegen, Zurücksetzen und Ändern von Passwörtern;
- Rollenübernahme — eine Administratorin, die Als Rolle anzeigen… startet und beendet;
- administrative Aktionen — Änderungen an Benutzern, Rollen, Einstellungen, dem Metamodell, Tags, Berechnungen, Erweiterungen, Importen, Integrationen, öffentlichen Portalen und veröffentlichten Diagrammen, Umfragen und dem Betreiberzugang (siehe Administrative Aktionen);
- Datenexporte — die CSV- und JSON-Exporte von Karten, Workspace-Exporte und Exporte für eine andere EA-Plattform (siehe Datenexporte) — sowie Exporte dieses Protokolls selbst.
Spalten¶
| Spalte | Beschreibung |
|---|---|
| Wann | Datum und Uhrzeit der Aktion |
| Kategorie | auth (Authentifizierung), admin (administrative Aktionen) oder access (Exporte und anderer Datenzugriff) |
| Aktion | Was geschah, zum Beispiel auth.login.failed — siehe den Aktionskatalog |
| Ergebnis | Erfolg oder Fehlschlag |
| Akteur | Der angemeldete Benutzer, der die Aktion ausgeführt hat. Leer, wenn niemand angemeldet war — etwa bei einer fehlgeschlagenen Anmeldung |
| Betroffenes Konto | Das Konto, um das es ging — die bei einer fehlgeschlagenen Anmeldung eingegebene E-Mail-Adresse oder der Benutzer, dessen Passwort zurückgesetzt wurde |
| Ziel | Das Objekt, auf das sich die Aktion bezog, falls es eines gibt — zum Beispiel die beim Start einer Rollenübernahme gewählte Rolle |
| IP | Die IP-Adresse des Clients (siehe Client-IP-Adresse) |
| Herkunft | Woher die Anfrage kam: Web, API, KI-Werkzeug, Erweiterung, Ops oder System |
| Übernommene Rolle | Wenn eine Administratorin die App als andere Rolle betrachtete, diese Rolle. Akteur bleibt die tatsächliche Administratorin |
Spalten lassen sich wie in jeder anderen Datentabelle ein- und ausblenden, umsortieren und fixieren; Wann und Aktion werden immer angezeigt.
Filter¶
Die Filterleiste links grenzt die Liste nach Kategorie, Ergebnis, Aktion, Akteur, IP-Adresse und einem Zeitraum ein. Jede Abschnittsüberschrift zeigt, wie viele Werte ausgewählt sind, und die eingeklappte Leiste zeigt die Anzahl aktiver Filter. Die Registerkarte Spalten derselben Leiste blendet Spalten ein und aus und fixiert sie. Ihre Filter und Ihr Spaltenlayout werden in diesem Browser gespeichert.
Eine Suche nach einer E-Mail-Adresse trifft Akteur, betroffenes Konto und Ziel, sodass eine einzige Adresse sowohl findet, was diese Person getan hat, als auch, was gegen ihr Konto versucht wurde.
Einen Eintrag lesen¶
Klicken Sie auf eine Zeile, um die Eintragsleiste zu öffnen. Sie zeigt jedes Feld des Eintrags — wann, wer, von welcher IP-Adresse und mit welchem Browser — und unter Details, was der Eintrag aufgezeichnet hat, in Klartext statt als gespeicherte Schlüssel:
- Änderungen — ein Satz pro Änderung. Die Bearbeitung eines Kartentyps lautet zum Beispiel Feld „Geschäftskritikalität“ (Einfachauswahl) zum Abschnitt „Governance“ hinzugefügt oder Option „Hoch“ im Feld „Geschäftskritikalität“ umbenannt in „Kritisch“. Felder, Abschnitte, Optionen, Rollen und Portale werden mit ihrer Bezeichnung genannt, Berechtigungen mit ihrer Beschreibung und Sprachen mit ihrem Namen.
- Vorher / Nachher — eine Tabelle der geänderten Werte, eine Zeile pro Feld, jedes Feld mit seiner Bezeichnung. Die Werte sind formatiert: Ja oder Nein, Datumsangaben im Datumsformat des Arbeitsbereichs, Farben als Farbfeld, Dateigrößen in KB oder MB. Geheimnisse werden nie gespeichert: Ein Passwort, Token oder Client-Secret wird vor dem Schreiben des Eintrags ersetzt und als Geheimer Wert angezeigt.
- Kontext — Angaben, die eine Änderung einordnen, ohne Teil von ihr zu sein: die aktuelle Adresse eines Portals und ob es veröffentlicht ist, ob die Zugangsdaten einer Verbindung ersetzt wurden, wie viele Zeilen ein Import betroffen hat.
Eine fehlgeschlagene Anmeldung zeigt ihren Grund oberhalb der Details — ein falsches Passwort, ein unbekanntes Konto, ein vorübergehend gesperrtes Konto.
Einträge, die vor Version 2.161.0 geschrieben wurden, zeigen ihre Details so, wie sie aufgezeichnet wurden: Alte und neue Werte erscheinen weiterhin in der Tabelle, und was die Leiste nicht lesen kann, wird als Roh-JSON angezeigt.
Die Leiste bietet keine Aktionen. Einträge können weder bearbeitet noch gelöscht werden.
CSV exportieren¶
CSV exportieren in der Symbolleiste lädt die Einträge, die den aktuellen Filtern entsprechen, als CSV-Datei herunter, bis zu 50 000 Zeilen. Der Export wird selbst aufgezeichnet, als access.audit_log.exported, sodass ein Export des Sicherheitsprotokolls darin immer eine Spur hinterlässt.
Aktionskatalog¶
| Aktion | Aufgezeichnet, wenn |
|---|---|
auth.login.succeeded |
sich ein Benutzer mit E-Mail und Passwort anmeldet |
auth.login.failed |
eine Passwortanmeldung abgewiesen wird. Der Grundcode gibt an, warum (siehe unten) |
auth.login.locked |
der fünfte Fehlversuch in Folge das Konto für 15 Minuten sperrt. Die Details enthalten den Zeitpunkt, zu dem die Sperre endet |
auth.logout |
sich ein angemeldeter Benutzer abmeldet. Eine Abmeldung ohne gültige Sitzung zeichnet nichts auf |
auth.sso.succeeded |
sich ein Benutzer über einen SSO-Anbieter anmeldet. Die Details enthalten den Anbieter, das Subject des Identitätsanbieters und ob das Konto durch diese Anmeldung angelegt wurde |
auth.sso.failed |
eine SSO-Anmeldung abgewiesen wird — eine nicht zugelassene Domain, eine fehlende E-Mail-Adresse, ein lokales Konto mit derselben E-Mail, ein inaktives Konto. Die Details enthalten den Anbieter und den Grund |
auth.proxy_session.succeeded |
sich ein Benutzer über einen vertrauenswürdigen Reverse Proxy anmeldet |
auth.proxy_session.failed |
eine Anmeldung über den Reverse Proxy abgewiesen wird |
auth.register |
ein Benutzer per Selbstregistrierung ein Konto anlegt |
auth.password.set |
ein eingeladener Benutzer sein erstes Passwort festlegt |
auth.password.reset_requested |
Jemand fordert eine E-Mail zum Zurücksetzen des Passworts an. Immer als Erfolg mit der eingegebenen Adresse erfasst, damit die Antwort nichts verrät; die Details nennen, ob ein Konto gefunden und ob eine E-Mail gesendet wurde |
auth.password.reset |
ein Passwort über einen Zurücksetzungslink geändert wird |
auth.password.changed |
ein angemeldeter Benutzer sein eigenes Passwort ändert |
auth.impersonation.started |
eine Administratorin Als Rolle anzeigen… startet. Ziel ist die gewählte Rolle |
auth.impersonation.stopped |
die Administratorin zu ihrer eigenen Rolle zurückkehrt |
Grundcodes bei auth.login.failed:
| Grund | Bedeutung |
|---|---|
unknown_user |
Kein Konto hat diese E-Mail-Adresse |
sso_account |
Das Konto meldet sich per SSO an und hat kein Passwort |
no_password |
Für das Konto ist noch kein Passwort festgelegt — eine Einladung, die nie angenommen wurde |
locked |
Das Konto ist nach wiederholten Fehlversuchen gesperrt |
bad_password |
Das Passwort ist falsch |
inactive |
Das Konto ist deaktiviert |
Grundcodes bei auth.sso.failed, auth.proxy_session.failed, auth.password.set und auth.password.reset:
| Grund | Bedeutung |
|---|---|
expired |
Der zeitlich begrenzte Zugang des Kontos ist abgelaufen |
hd_mismatch |
Das Google-Konto gehört zu einer nicht zugelassenen Domäne |
no_email |
Der Identitätsanbieter hat keine E-Mail-Adresse zurückgegeben |
no_subject |
Der Identitätsanbieter hat keine Subjektkennung zurückgegeben |
local_account |
Ein lokales Passwortkonto verwendet diese E-Mail-Adresse bereits |
no_account |
Es gibt kein Konto, und Konten werden nicht automatisch angelegt |
exchange_failed |
Der Identitätsanbieter hat die Anmeldung nicht abgeschlossen |
unauthenticated |
Der Reverse-Proxy hat die Anfrage nicht authentifiziert |
identity_rejected |
Die weitergereichte Identität wurde abgelehnt (Domäne oder unbestätigte E-Mail) |
invalid_token |
Der Einladungs- oder Zurücksetzungslink war ungültig oder ist abgelaufen |
Eine Häufung von unknown_user-Fehlschlägen von einer IP-Adresse ist das Muster von Password Spraying; eine Reihe von bad_password gegen ein Konto, gefolgt von auth.login.locked, ist ein Rateversuch gegen dieses Konto.
Administrative Aktionen¶
Jede Änderung, die ein Administrator an der Konfiguration der Instanz vornimmt, wird in der Kategorie admin erfasst. Akteur ist der Administrator, Ziel ist das geänderte Objekt — ein Benutzer, eine Rolle, eine Einstellung, ein Kartentyp — mit seinem Namen zum damaligen Zeitpunkt, und die Details führen auf, was sich geändert hat, als alte und neue Werte, beschränkt auf die tatsächlich geänderten Felder. Für jeden Eintrag gelten zwei Regeln:
- Geheimnisse werden maskiert. Ein SMTP-Passwort, ein SSO-Client-Secret, ein KI-Anbieterschlüssel, ein ServiceNow-Zugangsdatum oder jeder andere geheime Wert wird als
***geschrieben: Der Eintrag zeigt, dass er sich geändert hat, aber nie, was er war oder geworden ist. - Weder Lizenztext noch Zugangsdaten werden gespeichert. Eine Erweiterungslizenz wird identifiziert, nicht kopiert, und ein Passwort, das ein Administrator für einen Benutzer setzt, wird als geändert erfasst, nie mit seinem Wert.
Eine Speicherung, die nichts ändert, wird nicht erfasst, ebenso wenig wie ein Benutzer, der in seinem Profil den eigenen Namen oder die eigene Sprache ändert. Umfangreiche Konfiguration — die Felder, Übersetzungen oder das Layout eines Kartentyps, die Filter eines Portals — wird nach ihrer Größe zusammengefasst statt kopiert; ist die Größe gleich geblieben, kommt ein kurzer Fingerabdruck des Inhalts hinzu, sodass der Eintrag dennoch zeigt, dass sich etwas geändert hat. Die rollenbezogenen Berechtigungsüberschreibungen eines Kartentyps sind die Ausnahme: Jede geänderte Zelle wird mit altem und neuem Wert aufgeführt, wobei ein leerer Wert bedeutet, dass die eigene Berechtigung der Rolle gilt.
| Bereich | Aktionen | Was erfasst wird |
|---|---|---|
| Benutzer & Rollen | admin.user.created, .updated, .deleted, .bulk_updated, .bulk_deleted, .unlocked; admin.user.invitation.resent, .deleted; admin.role.created, .updated, .archived, .restored; admin.stakeholder_role.created, .updated, .deleted, .archived, .restored |
Konten, die erstellt, bearbeitet, aktiviert oder deaktiviert, gelöscht (einzeln oder in Masse) und entsperrt werden, mit den geänderten Feldern — Rolle, E-Mail, Name, Aktivstatus; erneut gesendete oder widerrufene Einladungen; Anwendungsrollen und Stakeholder-Rollen je Typ, mit den erteilten oder entzogenen Berechtigungen |
| Einstellungen | admin.settings.updated |
Ein Eintrag pro gespeicherter Einstellung — E-Mail, Authentifizierung und SSO, Registrierung, KI, MCP, Sprachen, Modulschalter, Branding, Logo und Favicon, Aufbewahrungsfristen. Das Ziel ist die Einstellung; die Details sind ihr alter und neuer Wert, mit maskierten Geheimnissen |
| Metamodell | admin.metamodel.type.* (including .references_generated), admin.metamodel.relation_type.*, admin.metamodel.resource_type.*, admin.metamodel.category.* (including .reordered), admin.principle.* (including .imported), admin.regulation.* |
Kartentypen, Beziehungstypen und Ressourcentypen, die erstellt, geändert, gelöscht oder wiederhergestellt werden, mit den geänderten Eigenschaften; für einen Typ generierte Kartenreferenzen; EA-Prinzipien, einschließlich der aus dem Katalog importierten; Compliance-Regulierungen; Kartentyp-Kategorien (Architekturebenen), die erstellt, umbenannt, umgefärbt, neu angeordnet oder gelöscht werden |
| Tags & Berechnungen | admin.tag_group.*, admin.tag.*, admin.calculation.* |
Tag-Gruppen und Tags; berechnete Felder, die erstellt, geändert, gelöscht, aktiviert oder deaktiviert werden, mit alter und neuer Formel, sowie eine Ausführung einer Berechnung über alle Karten (.recalculated) |
| Erweiterungen | admin.extension.install.uploaded, .applied, .discarded; admin.extension.store.claimed, .refreshed, .installed; admin.extension.enabled, .disabled, .uninstalled; admin.extension.license.updated, .removed |
Hochgeladene, installierte oder verworfene Pakete; Lizenzen und Downloads aus dem Erweiterungs-Store; aktivierte, deaktivierte und deinstallierte Erweiterungen; ersetzte oder entfernte Lizenz — mit der Erweiterung und ihrer Version, nie mit dem Lizenztext |
| Workspace-Transfer & Migration | admin.workspace.import.uploaded, .applied, .completed, .discarded; admin.migration.uploaded, .field_mappings.updated, .applied, .deleted |
Ein hochgeladenes Workspace-Paket, dessen Import gestartet, abgeschlossen oder verworfen wird; eine hochgeladene Plattformmigration, deren Feldzuordnungen bearbeitet werden, die angewendet oder gelöscht wird |
| Integrationen | admin.servicenow.connection.*, admin.servicenow.mapping.*, admin.servicenow.sync.pulled, .pushed, .applied |
ServiceNow-Verbindungen, mit maskierten Zugangsdaten, und Zuordnungen; jeder Abruf, jede Übertragung und jedes Anwenden von Staging-Datensätzen |
| Öffentliche Freigabe | admin.web_portal.created, .updated, .deleted; admin.diagram.published, .unpublished |
Web-Portale und veröffentlichte Diagramme — alles, was Daten ohne Konto erreichbar macht |
| Umfragen | admin.survey.sent, admin.survey.closed |
Eine Umfrage, die an ihre Empfänger gesendet oder geschlossen wird |
| Betreiberzugang | admin.ops.rescue_access.granted, .revoked |
Über die Betriebs-API gewährter oder widerrufener Notfallzugang, erfasst neben den bestehenden ops.*-Ereignissen |
Datenexporte¶
Jedes Mal, wenn Daten die Instanz in großem Umfang verlassen, hält ein access-Eintrag fest, wer sie mitgenommen hat, wie viel und in welcher Form. Der Eintrag wird geschrieben, bevor die Datei gesendet wird, sodass auch ein Export, dessen Download nie abgeschlossen wurde, aufgezeichnet ist.
| Aktion | Aufgezeichnet, wenn | Details |
|---|---|---|
access.export.cards |
Karten über den CSV- oder JSON-Export der API (/cards/export/csv, /cards/export/json) exportiert werden, wie es Skripte, Integrationen und KI-Assistenten tun |
format (csv oder json), type (der oder die Kartentypen) und rows (die Anzahl der Karten). Das Ziel ist der Kartentyp, wenn der Export genau einen umfasste |
access.export.workspace |
ein vollständiges Workspace-Paket heruntergeladen wird — über Workspace-Transfer oder von einer Steuerungsebene über die Betriebs-API, die keinen Akteur und requested_by: ops aufzeichnet |
include_archived und size_bytes |
access.export.migration |
der Workspace unter Admin → Einstellungen → Migration für eine andere EA-Plattform exportiert wird (siehe Plattformmigration) | Die Zielplattform, include_archived und size_bytes |
access.audit_log.exported |
jemand das Sicherheitsprotokoll als CSV exportiert | rows |
Was nicht aufgezeichnet wird¶
- Token-Erneuerung. Die Web-App erneuert ihre Sitzung zeitgesteuert, sodass jede offene Registerkarte Einträge erzeugen würde, von denen keiner etwas bedeutet.
- Anfragen, die wegen eines abgelaufenen oder ungültigen Sitzungstokens abgewiesen werden. Sie entstehen jedes Mal, wenn eine Sitzung regulär endet.
- Abrufe von OData-Feeds. Excel und Power BI fragen den OData-Feed einer gespeicherten Ansicht zeitgesteuert ab, sodass jede Aktualisierung einen Eintrag erzeugen würde.
- Im Browser erstellte Tabellen und Präsentationen. Die Excel- und PowerPoint-Downloads des Inventars und der Berichte entstehen aus Daten, die die Seite bereits geladen hat; sie sind Lesezugriffe, keine Exporte vom Server.
- Reiner Lesezugriff — eine Karte öffnen, einen Bericht ausführen, das Inventar durchsuchen.
Aufbewahrung¶
Einträge werden standardmäßig 365 Tage lang aufbewahrt. Ändern Sie das unter Admin → Einstellungen → Allgemein → Datenverwaltung → Aufbewahrung des Sicherheitsprotokolls: eine beliebige Anzahl von Tagen bis 3650 oder 0, um Einträge unbegrenzt zu behalten. Ein Job löscht einmal pro Nacht die Einträge, die älter als dieser Zeitraum sind, und liest die Einstellung jedes Mal neu, sodass eine Änderung ohne Neustart wirksam wird.
Dieser Aufbewahrungsjob ist das Einzige, was jemals einen Eintrag löscht. Es gibt weder in der Oberfläche noch in der API eine Aktion zum Bearbeiten oder Löschen, für keine Rolle.
Das Protokoll ist bewusst nicht Teil des Workspace-Transfers: Es ist die Sicherheitshistorie dieser Instanz, kein Inhalt des Workspaces, und das Klonen einer Instanz kopiert es nicht.
Der JSON-Audit-Stream¶
Jeder Eintrag wird vom Backend außerdem als eine JSON-Zeile über den Logger turbo_ea.audit geschrieben, im selben Moment, in dem er gespeichert wird. Das Backend protokolliert auf die Standardausgabe, sodass der Stream überall dort ankommt, wo Ihre Container-Logs bereits gesammelt werden — docker compose logs backend, die Log-Erfassung von Kubernetes oder ein beliebiger SIEM-Shipper —, ohne Konfiguration in Turbo EA:
docker compose logs -f backend | grep turbo_ea.audit
Die Zeile wird geschrieben, sobald der Eintrag erfasst wird. Schlägt die Transaktion der Anfrage danach fehl, existiert die Zeile ohne Datensatz: Die Tabelle ist die Aufzeichnung, der Stream der Live-Feed.
Jede Zeile enthält dieselben Felder wie der Eintrag:
| Feld | Inhalt |
|---|---|
audit_id, created_at |
Die ID des Eintrags und der Zeitpunkt, zu dem er geschrieben wurde |
category, action, outcome |
Was geschah und ob es gelang |
actor_user_id, actor_email |
Wer es getan hat |
subject_email |
Das betroffene Konto |
target_type, target_id, target_label |
Worauf es sich bezog |
ip, user_agent |
Der Client |
origin |
web, api, mcp, ext, ops oder system |
impersonator_user_id, impersonated_role |
Gesetzt, während eine Administratorin die App als andere Rolle betrachtet |
details |
Bis zu vier Schlüssel, Geheimnisse bereits maskiert: reason (ein Fehlercode), changes ({field: {old, new}}), items (semantische Änderungen, {kind, …} — z. B. field.added) und context (einfache Angaben) |
Wer den Stream in einen zentralen Log-Speicher überträgt, hält eine Kopie außerhalb der Instanz vor, außer Reichweite aller, die sie administrieren können — genau das braucht eine Prüfung auf Insider-Bedrohungen. Wie Sie ihn erfassen, steht unter Protokollierung und der Audit-Stream.
Client-IP-Adresse¶
Die Spalte IP zeichnet die Adresse des Clients auf, nicht die des Proxys vor dem Backend. Der mitgelieferte Edge-nginx setzt den Header X-Real-IP auf die Adresse, von der er die Verbindung erhalten hat, und das Backend liest diesen Header, weil das veröffentlichte Backend-Image TRUST_PROXY_HEADERS=true setzt. Ein Wert, der keine gültige IP-Adresse ist, wird verworfen statt aufgezeichnet.
- Lassen Sie
TRUST_PROXY_HEADERSeingeschaltet, solange jede Anfrage das Backend über den mitgelieferten nginx erreicht — der Standard-Stack, das Helm-Chart und die Vorlagen für verwaltete Container arbeiten alle so. - Schalten Sie es aus (
TRUST_PROXY_HEADERS=false), wenn Sie den Backend-Container direkt freigeben, ohne den mitgelieferten nginx davor: Ein Client könnte dann seinen eigenenX-Real-IPsenden und die aufgezeichnete Adresse selbst wählen. - Hinter einem Load Balancer, einem Ingress-Controller oder einem CDN erhält der mitgelieferte nginx jede Verbindung von diesem Zwischenglied und zeichnet daher von sich aus für jeden Benutzer die Adresse des Load Balancers auf. Setzen Sie
NGINX_TRUSTED_PROXIESam nginx-Container wie unten beschrieben.
Hinter einem Load Balancer¶
NGINX_TRUSTED_PROXIES listet die Adressen der Zwischenglieder vor dem mitgelieferten nginx auf, als IP-Adressen oder CIDR-Bereiche, getrennt durch Kommas oder Leerzeichen. nginx liest die Client-Adresse dann aus dem Header X-Forwarded-For, den diese Zwischenglieder hinzufügen — aber nur bei einer Verbindung, die von einer der aufgeführten Adressen kommt — und überspringt dabei jede aufgeführte Adresse, sodass eine Kette von Proxys auf die erste Adresse hinausläuft, die nicht zu Ihnen gehört. Diese Adresse ersetzt die der Verbindung, und der Header X-Real-IP, den das Backend liest, trägt sie unverändert weiter. Leer, die Voreinstellung, vertraut niemandem.
Den Wert finden Sie im Zugriffsprotokoll des Edge-nginx (docker compose logs nginx, kubectl logs deployment/turbo-ea-nginx oder die Protokollansicht der Plattform): Die Adresse am Anfang jeder Zeile ist das Zwischenglied, dem Sie vertrauen müssen, und das letzte Feld in Anführungszeichen ist der X-Forwarded-For-Header, den es gesendet hat.
| Bereitstellung | Wo setzen | Typischer Wert |
|---|---|---|
| Docker Compose, Browser erreichen nginx direkt | — | Leer lassen |
| Docker Compose hinter Ihrem eigenen Reverse Proxy | NGINX_TRUSTED_PROXIES in .env |
Die Adresse des Reverse Proxys, wie nginx sie sieht |
| Kubernetes hinter einem Ingress-Controller | Chart-Wert nginx.trustedProxies |
Das Pod-CIDR des Clusters, zum Beispiel 10.244.0.0/16 |
| AWS ECS Fargate | NginxTrustedProxies / Terraform nginx_trusted_proxies |
Die CIDR-Bereiche der Subnetze des Load Balancers |
| Azure Container Apps | nginxTrustedProxies / Terraform nginx_trusted_proxies |
Das Infrastruktur-Subnetz der Umgebung |
| Google Cloud Run | NGINX_TRUSTED_PROXIES im Manifest / Terraform nginx_trusted_proxies |
Die Adressen, die das Zugriffsprotokoll zeigt |
Halten Sie die Liste so eng wie die Zwischenglieder selbst. Jeder aufgeführten Adresse wird geglaubt, wenn sie den Client benennt; ein Bereich, aus dem sich Ihre Benutzer verbinden — etwa ganz 10.0.0.0/8 bei einer internen Bereitstellung —, ließe jeden von ihnen eine andere Adresse ins Protokoll schreiben. Ohne Einstellung zeigt die Spalte den Load Balancer: nicht hilfreich, aber nie gefälscht.
Die Ratenbegrenzung der Anmeldung zählt Versuche pro Client-Adresse aus demselben Header; hinter einem Load Balancer verhindert diese Einstellung also auch, dass die Fehlversuche einer Person alle anderen ausbremsen. Das gilt für Anmeldungen, die das Backend über den Edge-nginx erreichen; der MCP-Server meldet sich direkt beim Backend an, seine eigenen Anmeldeaufrufe teilen sich daher weiterhin die Adresse des MCP-Containers. Der Schlüssel pro Client vertraut diesem Header genauso wie das Audit-Protokoll: Er setzt voraus, dass Anmeldungen das Backend nur über den Edge-nginx erreichen, was die mitgelieferte Compose-Datei und das Helm-Chart sicherstellen, indem sie das Backend nicht freigeben. Ein Aufrufer, der das Backend direkt erreichen könnte, könnte sich mit einem selbst gesetzten Header sein eigenes Kontingent wählen; lassen Sie das Backend daher unerreichbar oder schalten Sie TRUST_PROXY_HEADERS aus.