Dienstkonto-Anmeldungen als Routine statt CRITICAL (Pentest R182)
Das Gegenbuch meldet sich stuendlich an - protokolliert wurde das als Authentication/CRITICAL. Damit stand das vorhersagbarste Ereignis im System auf der hoechsten Stufe: Jeder legitime Lauf trainiert den Betreiber darauf, CRITICAL wegzuklicken, und der erste echte Vorfall erbt diesen Reflex. Dieselbe Alarm-Muedigkeits-Klasse wie R162, diesmal von uns selbst erzeugt. Nicht unterdrueckt, sondern eingestuft: Neues Kennzeichen isServiceAccount am Benutzer (Migration 20260822100000). Anmeldungen solcher Konten erscheinen weiterhin im Log - man soll sehen, dass das Gegenbuch arbeitet - aber als Routine (LOW) mit eigenem Label 'Dienstkonto ... angemeldet (planmaessig)'. Alle anderen Anmeldungen bleiben CRITICAL. Offen und dem Pentester so benannt: Der eigentliche Tripwire waere der AUSBLEIBENDE Heartbeat (Dienstkonto meldet sich N Intervalle nicht mehr) sowie Anmeldungen ausserhalb der Kadenz oder von fremder Quell-IP. Das braucht einen Zeitgeber und ist noch nicht gebaut. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,9 @@
|
|||||||
|
-- Dienstkonto-Kennzeichen (Pentest R182).
|
||||||
|
--
|
||||||
|
-- Das Gegenbuch meldet sich stuendlich an. Diese Anmeldung wurde bisher als
|
||||||
|
-- Authentication/CRITICAL protokolliert - also das vorhersagbarste Ereignis im
|
||||||
|
-- System auf der hoechsten Stufe. Damit trainiert die Routine den Betreiber
|
||||||
|
-- darauf, CRITICAL wegzuklicken, und der erste ECHTE Vorfall erbt diesen
|
||||||
|
-- Reflex. Mit dem Kennzeichen werden solche Anmeldungen als Routine gefuehrt.
|
||||||
|
ALTER TABLE `User`
|
||||||
|
ADD COLUMN IF NOT EXISTS `isServiceAccount` BOOLEAN NOT NULL DEFAULT false;
|
||||||
@@ -76,6 +76,11 @@ model User {
|
|||||||
firstName String
|
firstName String
|
||||||
lastName String
|
lastName String
|
||||||
isActive Boolean @default(true)
|
isActive Boolean @default(true)
|
||||||
|
/// Dienstkonto (z. B. das Gegenbuch). Meldet sich planmaessig und haeufig an.
|
||||||
|
/// Solche Anmeldungen werden im Audit-Log als Routine gefuehrt statt als
|
||||||
|
/// CRITICAL - sonst trainiert das vorhersagbarste Ereignis im System den
|
||||||
|
/// Betreiber darauf, die hoechste Stufe wegzuklicken (Pentest R182).
|
||||||
|
isServiceAccount Boolean @default(false)
|
||||||
tokenInvalidatedAt DateTime? // Zeitpunkt ab dem alle Tokens ungültig sind (für Zwangslogout bei Rechteänderung)
|
tokenInvalidatedAt DateTime? // Zeitpunkt ab dem alle Tokens ungültig sind (für Zwangslogout bei Rechteänderung)
|
||||||
|
|
||||||
// Passwort-Reset
|
// Passwort-Reset
|
||||||
|
|||||||
@@ -167,6 +167,21 @@ const ACTION_LABELS: Record<string, string> = {
|
|||||||
TOKEN_REFRESH: 'Sitzung verlängert',
|
TOKEN_REFRESH: 'Sitzung verlängert',
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ist das die planmaessige Anmeldung eines Dienstkontos? (Pentest R182)
|
||||||
|
*
|
||||||
|
* Vorhersagbare Ereignisse sind miserable Alarme und exzellente Grundlinien.
|
||||||
|
* Das Gegenbuch meldet sich stuendlich an – als CRITICAL gefuehrt trainiert
|
||||||
|
* genau diese Routine den Betreiber darauf, die hoechste Stufe wegzuklicken,
|
||||||
|
* und der erste ECHTE Vorfall erbt den Reflex. Der Eintrag bleibt (man soll
|
||||||
|
* sehen, dass das Gegenbuch arbeitet), aber als Routine.
|
||||||
|
*/
|
||||||
|
function istDienstkontoAnmeldung(responseBody: unknown, success: boolean): boolean {
|
||||||
|
if (!success || !responseBody || typeof responseBody !== 'object') return false;
|
||||||
|
const data = (responseBody as { data?: { user?: { isServiceAccount?: boolean } } }).data;
|
||||||
|
return data?.user?.isServiceAccount === true;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Unterscheidet die drei Ausgaenge von POST /auth/refresh (Pentest R166-03).
|
* Unterscheidet die drei Ausgaenge von POST /auth/refresh (Pentest R166-03).
|
||||||
*
|
*
|
||||||
@@ -219,6 +234,9 @@ function generateHumanLabel(
|
|||||||
// Auth
|
// Auth
|
||||||
if (path.includes('/auth/login') || path.includes('/auth/customer-login')) {
|
if (path.includes('/auth/login') || path.includes('/auth/customer-login')) {
|
||||||
const email = req.body?.email || '';
|
const email = req.body?.email || '';
|
||||||
|
if (action === 'LOGIN' && istDienstkontoAnmeldung(responseBody, true)) {
|
||||||
|
return `Dienstkonto ${email} angemeldet (planmäßig)`;
|
||||||
|
}
|
||||||
return action === 'LOGIN'
|
return action === 'LOGIN'
|
||||||
? `Benutzer ${email} hat sich angemeldet`
|
? `Benutzer ${email} hat sich angemeldet`
|
||||||
: `Anmeldung fehlgeschlagen für ${email}`;
|
: `Anmeldung fehlgeschlagen für ${email}`;
|
||||||
@@ -486,6 +504,8 @@ export function auditMiddleware(req: AuthRequest, res: Response, next: NextFunct
|
|||||||
// Andere Auth-Events behalten ihre Default-Sensitivität (Authentication → CRITICAL).
|
// Andere Auth-Events behalten ihre Default-Sensitivität (Authentication → CRITICAL).
|
||||||
sensitivity: action === 'TOKEN_REFRESH'
|
sensitivity: action === 'TOKEN_REFRESH'
|
||||||
? (refreshOutcome(responseBody, responseSuccess) === 'rejected' ? 'HIGH' : 'LOW')
|
? (refreshOutcome(responseBody, responseSuccess) === 'rejected' ? 'HIGH' : 'LOW')
|
||||||
|
: action === 'LOGIN' && istDienstkontoAnmeldung(responseBody, responseSuccess)
|
||||||
|
? 'LOW'
|
||||||
: undefined,
|
: undefined,
|
||||||
resourceType: mapping.type,
|
resourceType: mapping.type,
|
||||||
resourceId,
|
resourceId,
|
||||||
|
|||||||
@@ -333,6 +333,9 @@ export async function login(email: string, password: string) {
|
|||||||
permissions: Array.from(permissions),
|
permissions: Array.from(permissions),
|
||||||
customerId: user.customerId,
|
customerId: user.customerId,
|
||||||
isCustomerPortal: false,
|
isCustomerPortal: false,
|
||||||
|
// Wird von der Audit-Middleware gelesen, um planmaessige
|
||||||
|
// Dienstkonto-Anmeldungen als Routine einzustufen (R182).
|
||||||
|
isServiceAccount: user.isServiceAccount,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user