Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Auth hardening #45

Open
Ryuno-Ki opened this issue Oct 2, 2024 · 1 comment
Open

Auth hardening #45

Ryuno-Ki opened this issue Oct 2, 2024 · 1 comment

Comments

@Ryuno-Ki
Copy link
Member

Ryuno-Ki commented Oct 2, 2024

@stevenobird Lauf Doku wird das Login nach einigen fehlgeschlagenen Versuchen erst einmal gebremst. Kennst du die genaue Anzahl?
Wo wäre der Code dafür?

Die Überlegung ist es, den Betreibern eine E-Mail zu senden, weil es ein möglicher Angriff sein könnte.

@Ryuno-Ki Ryuno-Ki added the question Further information is requested label Oct 2, 2024
@Ryuno-Ki Ryuno-Ki added this to the Authentifizierung milestone Oct 2, 2024
@stevenobird
Copy link
Contributor

stevenobird commented Oct 3, 2024

Login Throttle wird in der App hier im FortifyServiceProvider gehandhabt.
Hier siehst du auch, wie genau die Request-Versuche unterschieden werden: user_name|ip_addresse - standardmäßig sind dies 5 Versuche pro Minute pro E-Mail Adresse von einer IP.

Das Ganze könnten wir also nach unseren Belieben anpassen - im $request Objekt hat man neben den HTTP-Request Parametern meine ich auch Zugriff auf die Client Header und noch andere Infos.
Da könnte man sich also austoben, wie z.B. mit mehreren Limitern pro Route.

Eine E-Mail könnte man senden, indem man

  • einen globalen Exception Handler registriert, der die Anzahl der Exceptions sammelt und anhand bestimmter Muster eine Mail sendet oder
  • an den Limit:: call einen Aufruf von responseCallback anhängen. Dieser Callback wird dann immer ausgelöst, wenn für diesen expliziten Limiter das Limit überschritten wurde.

Der globale Handler ist in der bootstrap/app.php, hier kann man im withExceptions call wie hier in der Doku angegeben per Type-hinting für einzelne oder gruppierte Exceptions jeweils Reports machen. Für die Reports gibt es die verschiedensten Handler in Monolog. Standardmäßig landen diese "Reports" im storage/logs Ordner in der laravel.log (siehe config/logging.php), man kann sich aber auch mit etwas mehr Arbeit eigene Handler für bestimmte Channels bauen.

Der Code für den responseCallback wird hier aufgerufen und hier zurückgegeben - also effektiv wird hier die Exception generiert. Allerdings müssten wir hier wie in der Doku angegeben noch eine Response zurückgeben:

RateLimiter::for('login', function (Request $request) {
    $throttleKey = Str::transliterate(Str::lower($request->input(Fortify::username())).'|'.$request->ip());

    // $headers enthält 'X-RateLimit-Limit' und 'X-RateLimit-Remaining'
    // und je nach Client auch 'Retry-After' und 'X-RateLimit-Reset' Header
    return Limit::perMinute(5)->by($throttleKey)->response(function (Request $request, array $headers) {
        Mail::to('[email protected]')->send(new RateLimitReport($request, $headers));
        return response('Custom response...', 429, $request->headers);
   };
});

Zu Rate Limiting allgemein findet man hier in der Doku noch einiges Wissenswertes.

@Ryuno-Ki Ryuno-Ki removed the question Further information is requested label Oct 4, 2024
@Ryuno-Ki Ryuno-Ki moved this to Backlog in Eventguru Oct 4, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
Status: Backlog
Development

No branches or pull requests

2 participants