auth: fehlgeschlagene Anmeldungen mit Einstieg (livewire/fortify/two-factor); unbekannte Adressen als Tageszähler statt Verlaufseintrag, Kachel im Systemstatus, Löschfrist 90 Tage
Auf Live kamen seit dem 05.10. rund 250 Versuche am Tag aus über 50 Quellen, alle mit unbekannter Adresse — verteiltes Durchprobieren fremder Zugangsdaten, das im Verlauf die relevanten Einträge verdeckte. Neue Tabelle failed_login_tallies (Tag × Einstieg × IP-Hash), model:prune täglich 04:05. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
bc5e151823
commit
0aaee12eb5
9 changed files with 303 additions and 21 deletions
47
app/Models/FailedLoginTally.php
Normal file
47
app/Models/FailedLoginTally.php
Normal file
|
|
@ -0,0 +1,47 @@
|
|||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use Database\Factories\FailedLoginTallyFactory;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\MassPrunable;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
/**
|
||||
* Tageszähler für Anmeldeversuche mit unbekannter Adresse, je Einstieg
|
||||
* (`livewire`, `fortify`, …) und Quelle (gekürzter IP-HMAC). Ersetzt die
|
||||
* Einzeleinträge im Aktivitäts-Verlauf (Monitoring-Plan, Nachtrag 1.7).
|
||||
*/
|
||||
class FailedLoginTally extends Model
|
||||
{
|
||||
/** @use HasFactory<FailedLoginTallyFactory> */
|
||||
use HasFactory;
|
||||
|
||||
use MassPrunable;
|
||||
|
||||
public $timestamps = false;
|
||||
|
||||
protected $fillable = ['day', 'entry', 'ip_hash', 'attempts', 'first_at', 'last_at'];
|
||||
|
||||
/**
|
||||
* @return array<string, string>
|
||||
*/
|
||||
protected function casts(): array
|
||||
{
|
||||
return [
|
||||
'day' => 'date',
|
||||
'attempts' => 'integer',
|
||||
'first_at' => 'datetime',
|
||||
'last_at' => 'datetime',
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Builder<static>
|
||||
*/
|
||||
public function prunable(): Builder
|
||||
{
|
||||
return static::query()->whereDate('day', '<', now()->subDays((int) config('monitoring.failed_logins.retention_days', 90))->toDateString());
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue