Überblick — was dieser Mechanismus leistet
InfraGuard besitzt zwei Authentifizierungsebenen:
- Web-Konsole = Sitzungsanmeldung. Ein Betreiber meldet sich mit
login_id+passwordan, undAuthControllerlegt eine eigene Sitzung an. Jede Konsolenseite läuft danach durch die Middlewareinfr.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. - 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.apikeymit einem API-Schlüssel-Token (Authorization: Bearer …oderX-Infr-Api-Key) — nicht mit einer Sitzung. Keine Sitzung, kein CSRF.
Wesentliche Eigenschaften:
- Sitzungsabgleich — ändert eine Administratorin Stufe, Name oder Sprache eines Benutzers, wirkt das ab der nächsten Anfrage, ohne erneute Anmeldung.
- Durchsetzung auf URL-Ebene — Menüeinträge auszublenden genügt nicht. Routengruppen wie
/security,/backupund/adminerzwingen die Mindeststufe mit der Middlewareinfr.level:Ndirekt an der URL. - Destruktive Aktionen = erneute Stufenprüfung + Audit — Sperren, Wiederherstellen, Einstellungen ändern usw. sind durch eine Schreibstufen-Schranke, einen Eintrag in
infr_audit_logund eine Bestätigung in der Oberfläche geschützt.
Wann Sie das nutzen
- Sie melden sich zum ersten Mal an der Konsole an oder wurden plötzlich zu
/loginzurückgeworfen und möchten wissen, warum. - Sie binden eine externe Laravel-Anwendung an die Vorfall-Ingest-API oder an die Anbindung der Sicherungsrückmeldung an und müssen wissen, welcher Header sie authentifiziert.
- Eine Administratorin hat Stufe, Name oder Sprache geändert und Sie müssen erklären, warum keine erneute Anmeldung nötig ist.
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
- Rufen Sie
/loginauf (sind Sie bereits angemeldet, werden Sie zu/weitergeleitet). - Geben Sie Ihre
Login IDund IhrPasswordein.- Prüfung:
login_idhöchstens 60 Zeichen,password4–120 Zeichen.
- Prüfung:
- Klicken Sie auf Anmelden. Der Server sucht das Konto in
infr_userüberlogin_id+is_close=0und prüft das Passwort. - Bei Erfolg wird die Sitzung neu erzeugt (
session()->regenerate()) und Sie werden zunext(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
- Nutzen Sie den Eintrag Abmelden im Benutzermenü der Kopfleiste (oder
POST /logout). - Der Server verwirft
infr_user_id, macht die Sitzung ungültig, erzeugt das CSRF-Token neu und leitet zu/loginweiter.
Sitzungsdauer und Abgleich bei jeder Anfrage
Jede Konsolenseite läuft durch infr.auth (InfrAuth), das bei jeder Anfrage:
- den Benutzer über die Sitzungsangabe
infr_user_idneu lädt (heißer Pfad, minimale Spalten: id · login_id · name · email · user_level · role_id · team_id · lang · avatar · is_close). - Fehlt das Konto oder steht es auf
is_close=1(deaktiviert), verwirft es die Sitzung und leitet zu/loginweiter (oder gibt JSON 401 zurück). infr_user_level·infr_name·infr_langmit 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.- das Benutzermodell im Anfrage-Attribut
infr_userablegt und die Anzeigesprache überapp()->setLocale()setzt. 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:
- Der Server wandelt das empfangene Token in einen Hash um und vergleicht ihn in konstanter Zeit (mit einem zeitkonstanten Vergleich) mit
infr_api_key.key_hash(nur aktive Schlüssel). Der Schlüssel im Klartext wird nie gespeichert. - Ratenbegrenzung von 120 Anfragen pro Minute je Schlüssel. Wird sie überschritten, kommt
429 rate_limitedsamt HeaderRetry-Afterzurück. - Jeder Aufruf stempelt
last_used_at·last_used_ip·use_count.
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:
- Erneute Stufenprüfung — Schreibaktionen erfordern mindestens die Schreibstufe (2+), administrative Aktionen die Adminstufe (10); beides wird serverseitig erneut geprüft.
- Audit-Protokoll — die Werte vor und nach der Änderung sowie handelnde Person und IP werden in das Audit-Protokoll (
infr_audit_log) geschrieben. - 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.passworderscheint 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
/login·/logout— für jeden erreichbar (Gast).- Gesamte Konsole — erfordert eine gültige Sitzung (
infr.auth). Ohne sie werden Seitenanfragen zu/loginumgeleitet und AJAX-Anfragen erhalten401 unauthenticated.
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
- Zugriffsstufen —
user_level↔min_req, Abstufungen demo/staff/admin - Rollen und Teams — Rollenumfang und Team-Eigentümerschaft
- Verwaltung von Benutzern und Teams — Konten anlegen, Passwörter zurücksetzen, deaktivieren
- API-Schlüssel — Ingest-API-Schlüssel ausstellen und Integrationscode
- Lokalisierung — Anzeigesprache und Locale-Rückfall
- Audit-Protokoll — destruktive Aktionen nachverfolgen
