InfraGuard

Anmeldung und Authentifizierung

Wie die Sitzungsanmeldung an der Konsole funktioniert, wie sich die Sitzung bei jeder Anfrage neu abgleicht und wie sich die externe Ingest-API authentifiziert.

Überblick — was dieser Mechanismus leistet

InfraGuard besitzt zwei Authentifizierungsebenen:

  1. Web-Konsole = Sitzungsanmeldung. Ein Betreiber meldet sich mit login_id + password an, und AuthController legt eine eigene Sitzung an. Jede Konsolenseite läuft danach durch die Middleware infr.auth (InfrAuth), die die Sitzung prüft und bei jeder Anfrage Stufe, Name und Sprache des Benutzers erneut aus der Datenbank liest, damit die Kopie in der Sitzung aktuell bleibt.
  2. Externe Ingest-API = zustandsloser API-Schlüssel als Bearer. Wenn eine externe Anwendung Vorfälle, Sicherungsmeldungen oder Sicherheitsscans meldet, authentifiziert sie sich über die Middleware infr.apikey mit einem API-Schlüssel-Token (Authorization: Bearer … oder X-Infr-Api-Key) — nicht mit einer Sitzung. Keine Sitzung, kein CSRF.

Wesentliche Eigenschaften:

Wann Sie das nutzen

Aufbau

Der Anmeldebildschirm (/login) besteht aus einer einzigen schlichten Karte.

Element Beschreibung
Marke · Slogan Logo Infra**Guard** + „Konsole für konvergenten Infrastrukturbetrieb, Abwehr und Resilienz“
Anmelde-ID Eingabefeld login_id. autocomplete=username, automatisch fokussiert
Passwort Eingabefeld password + Augensymbol zum Ein-/Ausblenden
Fehlerbanner Bei Fehlschlag: „Diese Zugangsdaten stimmen nicht mit unseren Aufzeichnungen überein.“
Verstecktes Feld next Rücksprungpfad nach der Anmeldung (muss mit / beginnen)
Absendeschaltfläche „Anmelden →“

Das Anmeldeformular trägt ein normales Blade-Token @csrf. Die Konsole ist durch Sitzung + CSRF geschützt und verlangt in der Oberfläche kein zusätzliches Bearer-Token.

Verwendung

Anmelden

  1. Rufen Sie /login auf (sind Sie bereits angemeldet, werden Sie zu / weitergeleitet).
  2. Geben Sie Ihre Login ID und Ihr Password ein.
    • Prüfung: login_id höchstens 60 Zeichen, password 4–120 Zeichen.
  3. Klicken Sie auf Anmelden. Der Server sucht das Konto in infr_user über login_id + is_close=0 und prüft das Passwort.
  4. Bei Erfolg wird die Sitzung neu erzeugt (session()->regenerate()) und Sie werden zu next (oder /) geschickt.

Eine erfolgreiche Anmeldung füllt diese Sitzungsschlüssel:

Sitzungsschlüssel Wert
infr_user_id infr_user.id (die maßgebliche Quelle für „ist authentifiziert")
infr_login_id Anmelde-ID
infr_user_level user_level (Ganzzahl) — RBAC-Stufe
infr_name Anzeigename
infr_lang Anzeigesprache (Standard ko)

Zusätzlich wird die Spalte last_log mit der aktuellen Zeit gestempelt.

Abmelden

Sitzungsdauer und Abgleich bei jeder Anfrage

Jede Konsolenseite läuft durch infr.auth (InfrAuth), das bei jeder Anfrage:

  1. den Benutzer über die Sitzungsangabe infr_user_id neu lädt (heißer Pfad, minimale Spalten: id · login_id · name · email · user_level · role_id · team_id · lang · avatar · is_close).
  2. Fehlt das Konto oder steht es auf is_close=1 (deaktiviert), verwirft es die Sitzung und leitet zu /login weiter (oder gibt JSON 401 zurück).
  3. infr_user_level · infr_name · infr_lang mit den Werten aus der Datenbank überschreibt — so wirkt eine von der Administratorin geänderte Stufe, ein Name oder eine Sprache ab der nächsten Anfrage ohne erneute Anmeldung.
  4. das Benutzermodell im Anfrage-Attribut infr_user ablegt und die Anzeigesprache über app()->setLocale() setzt.
  5. OpsPolicy::markPresence() aufruft, um die Anwesenheit festzuhalten (der Sparmodus der Betriebsrichtlinie entscheidet damit, ob „gerade jemand an der Konsole arbeitet“, und steuert so die Datenbankerfassung — siehe Betriebsrichtlinie).

Die Sitzungsdauer richtet sich nach SESSION_LIFETIME (Vorgabe 120 Minuten).

Die Konsolenanmeldung hat kein eigenes Kontrollkästchen „Angemeldet bleiben“. Die Sitzung hält die oben genannte Dauer; danach müssen Sie sich erneut anmelden.

Authentifizierung der externen Ingest-API (Bearer-Schlüssel)

Meldet eine externe Anwendung an /api/v1/*, authentifiziert sie sich mit einem API-Schlüssel (zustandslos — keine Sitzung, kein CSRF).

Verfahren Beispiel-Header
Bearer Authorization: Bearer YOUR_KEY
Eigener Header X-Infr-Api-Key: YOUR_KEY

Verhalten:

Wichtige Endpunkte:

# Erreichbarkeit / Schlüssel prüfen
curl -sS https://infraguard.example.com/api/v1/ping \
  -H "Authorization: Bearer YOUR_KEY"

# Vorfall automatisch anlegen (dedupliziert · source=pulse)
curl -sS -X POST https://infraguard.example.com/api/v1/incidents \
  -H "Authorization: Bearer YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"title":"NPE in checkout","fingerprint":"abc123","severity":"crit"}'

Schlüssel ausstellen, widerrufen und den Integrationscode kopieren Sie in Verwaltung ▸ API-Schlüssel (der Klartextschlüssel wird nur einmal bei der Ausstellung gezeigt).

Step-up — destruktive Aktionen absichern

Riskante Aktionen wie Sperren, Freigeben, Wiederherstellen oder Einstellungen ändern sind geschützt — nicht durch erneute Passworteingabe — sondern durch drei Verteidigungslinien:

  1. Erneute Stufenprüfung — Schreibaktionen erfordern mindestens die Schreibstufe (2+), administrative Aktionen die Adminstufe (10); beides wird serverseitig erneut geprüft.
  2. Audit-Protokoll — die Werte vor und nach der Änderung sowie handelnde Person und IP werden in das Audit-Protokoll (infr_audit_log) geschrieben.
  3. Bestätigung in der Oberfläche — ein Bestätigungsdialog (Step-up) sichert die Aktion in der Oberfläche ab.

Datenquellen

Objekt Zweck
infr_user Betreiberkonten. Spalten: login_id · password · user_level · name · email · lang · is_close · role_id · team_id · last_log · avatar
Sitzungsspeicher (Redis) Sitzungsschlüssel wie infr_user_id (REDIS_PREFIX infr_)
infr_api_key Der Hash (key_hash) der Ingest-API-Schlüssel · is_active · use_count · last_used_at/ip
infr_audit_log Prüfspur destruktiver bzw. sicherheitsrelevanter Aktionen

Die Spalte infr_user.password erscheint niemals in Protokollen, URLs oder Cookies. Der Klartext eines API-Schlüssels wird nur bei der Ausstellung gezeigt; die Datenbank behält allein den Hash.

Zugriff

Schranken auf URL-Ebene (werden nach der Anmeldung ausgewertet):

Bereich Middleware Mindeststufe
Allgemeine Konsole (Übersicht · Infrastruktur · Assets lesen) infr.auth Nur Anmeldung (1)
/security · /backup infr.level:2 2
/admin infr.level:10 10
/horizon · /pulse infr.admin 10
Bereich Entwicklung infr.dev 9

Stufenabstufung: demo=1 · staff=5 · admin=10. Die vollständige Richtlinie finden Sie unter Zugriffsstufen.

Fehlerbehebung und FAQ

Ich melde mich an, lande aber immer wieder auf /login. Das Sitzungscookie wird nicht gespeichert (Domain bzw. SESSION_DOMAIN passt nicht, oder ein reines HTTPS-Cookie wird über HTTP ausgeliefert), oder das Konto wurde auf is_close=1 (deaktiviert) gesetzt. Lassen Sie den Kontostatus von einer Administratorin prüfen.

Ich sehe „Diese Zugangsdaten stimmen nicht mit unseren Aufzeichnungen überein.“ Ein Tippfehler in login_id, ein falsches Passwort oder ein deaktiviertes Konto (is_close=1). Aus Sicherheitsgründen nennt die Meldung nicht, welcher Fall vorliegt.

Ein Konto kann sich nicht anmelden. Das Passwort ist möglicherweise falsch oder das Konto deaktiviert. Eine Administratorin setzt das Passwort unter Benutzer und Teams zurück.

Ich kann mich anmelden, aber /admin nicht öffnen. Ihre Stufe liegt unter 10. /admin wird von infr.level:10 bewacht, also gelangen nur Administratoren hinein. Ebenso erfordern /security und /backup Stufe 2 oder höher.

Ein AJAX-Aufruf liefert 401. Die Konsolensitzung ist abgelaufen. Laden Sie die Seite neu und melden Sie sich erneut an. JSON-Anfragen erhalten statt einer Weiterleitung {"error":"unauthenticated"} mit 401.

Eine Administratorin hat meine Stufe angehoben, es wirkt aber nicht. InfrAuth gleicht die Sitzung bei jeder Anfrage ab, es wirkt also ab dem nächsten Seitenwechsel — ohne erneute Anmeldung. Laden Sie neu, damit es sofort greift.

Menü bzw. Oberfläche erscheinen in einer unerwarteten Sprache. Die Anzeigesprache folgt infr_user.lang (Sitzungsschlüssel infr_lang) und wird bei jeder Anfrage abgeglichen. Ändern Sie sie unter Lokalisierung.

Die API liefert 401 invalid_api_key / 429 rate_limited. Ein inaktiver oder falsch geschriebener Schlüssel ergibt 401; mehr als 120 Anfragen pro Minute ergeben 429 (+ Retry-After). Prüfen Sie den Schlüsselstatus unter API-Schlüssel und drosseln Sie die Aufrufe.

Verwandte Themen

로그인 화면
로그인 화면