Security Hardening: Proaktive Kontosperren, Fail2Ban-Integration, SecurityLogger, Alerting und API-Schutz
This commit is contained in:
@@ -31,6 +31,8 @@ final class WebhookDispatcher
|
||||
'monitor.down',
|
||||
'monitor.recovered',
|
||||
'release.published',
|
||||
'security.lockout',
|
||||
'security.attack',
|
||||
];
|
||||
|
||||
private const TIMEOUT_SECONDS = 4;
|
||||
@@ -67,6 +69,41 @@ final class WebhookDispatcher
|
||||
'Nach Zustand' => $payload['to_state'] ?? 'down',
|
||||
]
|
||||
);
|
||||
} elseif ($event === 'security.lockout') {
|
||||
RocketChatNotifier::sendAlert(
|
||||
$db,
|
||||
'Benutzerkonto vorübergehend gesperrt',
|
||||
sprintf(
|
||||
'Das Konto "%s" wurde nach wiederholten Fehlversuchen von IP %s für %d Minute(n) gesperrt.',
|
||||
$payload['username'] ?? 'unbekannt',
|
||||
$payload['ip'] ?? 'unbekannt',
|
||||
(int)($payload['duration_minutes'] ?? 15)
|
||||
),
|
||||
'alarm',
|
||||
[
|
||||
'Benutzer' => $payload['username'] ?? 'unbekannt',
|
||||
'IP-Adresse' => $payload['ip'] ?? 'unbekannt',
|
||||
'Sperrdauer' => ($payload['duration_minutes'] ?? 15) . ' Min',
|
||||
'Zeitpunkt' => gmdate('Y-m-d H:i:s') . ' UTC',
|
||||
]
|
||||
);
|
||||
} elseif ($event === 'security.attack') {
|
||||
RocketChatNotifier::sendAlert(
|
||||
$db,
|
||||
'Sicherheitsalarm: Brute-Force-Angriff erkannt',
|
||||
sprintf(
|
||||
'Verdächtige Aktivität von IP %s: %s',
|
||||
$payload['ip'] ?? 'unbekannt',
|
||||
$payload['details'] ?? 'Wiederholte Fehlversuche'
|
||||
),
|
||||
'alarm',
|
||||
[
|
||||
'IP-Adresse' => $payload['ip'] ?? 'unbekannt',
|
||||
'Ziel / Pfad' => $payload['target'] ?? 'Login / API',
|
||||
'Typ' => $payload['type'] ?? 'Brute-Force',
|
||||
'Zeitpunkt' => gmdate('Y-m-d H:i:s') . ' UTC',
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
if (self::$dispatchedThisRequest >= self::MAX_TARGETS) {
|
||||
|
||||
Reference in New Issue
Block a user