Zum Inhalt springen
BlogBerechnenVerteidigung gegen einen Login-API-Brute-Force-Angriff

Verteidigung gegen einen Login-API-Brute-Force-Angriff

Ein rotes Blocksymbol mit dem folgenden Text: "Verteidigung gegen einen Login-API-Brute-Force-Angriff: Weil man sich nicht wehren kann"

Seien wir ehrlich: Wenn Sie es eilig haben, einen großen Veröffentlichungstermin einzuhalten, machen Sie Abstriche. Ihre Testabdeckung wird lückenhaft, Ihr Code ist nicht mehr so trocken und Ihre Ausnahmebehandlung landet auf dem Tech Debt Graveyard - ich meine, im Backlog. Das haben wir alle schon erlebt.

Aber wenn es an der Zeit ist, Abstriche zu machen, sollten Sie nicht auf die Implementierung der "maximal fehlgeschlagenen Anmeldeversuche"-Sicherheit verzichten. Wenn Ihre Anmelde-API keine angemessenen Sicherheitsvorkehrungen enthält, ist es heutzutage relativ einfach, sich mit roher Gewalt Zugang zu einem Benutzerkonto zu verschaffen.

In diesem Beitrag zeigen wir Ihnen, wie ein Angreifer eine Anmelde-API mit roher Gewalt aushebeln kann. Anschließend werden wir Gegenmaßnahmen erörtern, die Sie zum Schutz Ihrer Systeme ergreifen können.

Ein Beispiel für eine Anmelde-API

Zur Veranschaulichung haben wir einen sehr einfachen API-Server mit Node.js und Express erstellt. Er wartet auf POST-Anfragen an einen einzigen Endpunkt, /login. Es wird erwartet, dass der Anfragekörper eine username und eine password. Wenn die Anmeldeinformationen erfolgreich übermittelt wurden, gibt die API Folgendes zurück 200 OK. Andernfalls gibt sie 401 UNAUTHORIZED.

Hier ist der Code für unseren einfachen Express-Server:

const express = require('express');
const users = require('./users.json');

const app = express();
const PORT = 3000;

// Middleware to parse JSON bodies
app.use(express.json());

app.post('/login', (req, res) => {
    const { username, password } = req.body;

    // Check if the username exists and the password matches
    if (users[username] && users[username] === password) {
        return res.status(200).send('OK');
    } else {
        return res.status(401).send('UNAUTHORIZED');
    }
});

// Start the server
app.listen(PORT, () => {
    console.log(`Server is listening on port ${PORT}`);
});

Für diese einfache Demo speichern wir die Liste der Benutzernamen und Passwörter in einer Datei namens users.json.

Wir haben unseren Server auf einer Linode eingerichtet, die auf Port 3000. Lassen Sie uns eine Anfrage ausprobieren:

~$ curl -i \        -X POST \        --header "Content-type:application/json" \        --data '{"username":"user08","password":"testpassword"}' \         172.233.153.34:3000/login

HTTP/1.1 401 UnauthorizedX-Powered-By: ExpressContent-Type: text/html; charset=utf-8Content-Length: 12ETag: W/"c-MvHJP5yPj49I/9tX+wGrvHWbTRk"Date: Sat, 25 May 2024 19:17:34 GMTConnection: keep-aliveKeep-Alive: timeout=5
UNAUTHORIZED

Unsere Login-API ist eingerichtet und läuft!

Wenn wir unsere API mit roher Gewalt aushebeln wollten, könnten wir ein Skript wie das folgende schreiben:

#!/bin/sh

API_ENDPOINT="http://172.233.153.34:3000/login"

USERNAME="user5"

echo "Attempting to login at $API_ENDPOINT as \"$USERNAME\""

for i in {1..8}
do
  PASS="password${i}"
  RESULT=$(curl --silent -X POST --header "Content-type:application/json" --data "{\"username\":\"$USERNAME\",\"password\":\"$PASS\"}" $API_ENDPOINT)
  echo "\"$PASS\": $RESULT"

  if [[ $RESULT == 'OK' ]]; then
    echo "!!! Password for \"$USERNAME\" found: \"$PASS\""
    break
  else
    sleep 1
  fi
done

Wenn wir unser rudimentäres Brute-Force-Skript ausführen, sieht es wie folgt aus:

$ source bruteforce.sh
Attempting to login at http://172.233.153.34:3000/login as "user5"
"password1": UNAUTHORIZED
"password2": UNAUTHORIZED
"password3": UNAUTHORIZED
"password4": UNAUTHORIZED
"password5": OK
!!! Password for user5 found: "password5"

Kann ein Angreifer ein Passwort wirklich erraten?

Wir haben also gesehen, wie einfach es ist, ein Skript zu schreiben, das zumindest einige Passwörter für einen bestimmten Benutzernamen durchgehen kann. Sie werden vielleicht sagen: "Ok, das ist ein interessantes, erfundenes Beispiel. Aber kann ein Angreifer wirklich ein Passwort erraten?"

Hier ist eine Liste mit den 10.000 häufigsten Passwörtern. Das ist ein ziemlich guter Anfang für jeden Angreifer. Denken Sie darüber nach - ist Ihnen schon einmal jemand begegnet, der "password123" oder "qwerty" verwendet? Das könnten sogar Sie sein!

Wenn ein Angreifer einige Benutzernamen für Ihr System kennt und ein Skript ausführt, das diese gängigen Kennwörter in einer Schleife durchläuft, könnte er einen Treffer landen.

Mit jedem zulässigen Versuch einer Kombination aus Benutzernamen und Passwort steigt die Wahrscheinlichkeit, dass ein Konto geknackt wird.

Dies ist ein klassischer Fall von fehlerhafter Authentifizierung, die auf Platz 2 der OWASP Top 10 API-Sicherheitsrisiken steht. Wenn Ihre Anwendung nicht ordnungsgemäß gegen automatisierte Angriffe geschützt ist, ist Ärger vorprogrammiert. Ohne Sicherheitsvorkehrungen sind die Konten Ihrer Benutzer einem erheblichen Risiko ausgesetzt.

Passwörter sind oft das schwächste Glied in der Sicherheit eines Systems:

  • Benutzer verwenden ihre Passwörter auf mehreren Websites.
  • Die Benutzer wählen leicht zu merkende (und leicht zu erratende) Passwörter.
  • Die Benutzer aktualisieren ihre Passwörter selten.

All diese Faktoren machen Brute-Force-Angriffe beängstigend effektiv.

Kehren wir also zu unserer Frage zurück: Kann ein Angreifer wirklich ein Passwort erraten? Auf jeden Fall. Und wenn Sie nicht die richtigen Vorsichtsmaßnahmen ergreifen, könnte es schneller passieren, als Sie denken.

Wie kann ich meine API schützen?

Es gibt mehrere Möglichkeiten, sich gegen einen Brute-Force-Angriff auf Ihre Anmelde-API zu schützen.

Legen Sie eine Anzahl von maximal fehlgeschlagenen Anmeldeversuchen fest

Legen Sie eine Grenze für die Anzahl der fehlgeschlagenen Anmeldeversuche fest, die Sie für jeden Benutzer zulassen. Führen Sie eine fortlaufende Zählung der fehlgeschlagenen Anmeldeversuche für einen Benutzer durch. Wenn Sie diesen Grenzwert erreichen, sperren Sie das Konto vorübergehend oder blockieren Sie nachfolgende Anfragen von der IP-Adresse des Absenders. Dadurch wird es für einen Angreifer viel schwieriger, sich mit roher Gewalt Zugang zu verschaffen.

Verwenden Sie eine Web Application Firewall (WAF)

Eine WAF kann zum Schutz Ihrer API beitragen, indem sie bösartige Aktivitäten erkennt und blockiert.

  • Bot-Aktivitäten: Eine gute WAF kann zwischen legitimen Benutzern und Bots unterscheiden und automatisierte Brute-Force-Angriffe abwehren.
  • Verdächtige Login-Anfragen von hinter Tor: Viele Angreifer nutzen das Tor-Netzwerk, um ihre Identität zu verbergen. Das Blockieren oder Ablehnen von Anfragen von Tor-Knotenpunkten kann das Risiko von Angriffen verringern.

Haltdos, eine WAF, die auf Linode Marketplace verfügbar ist, bietet diese und weitere Schutzfunktionen. Durch die Integration solcher Tools können Sie die Abwehrkräfte Ihrer API erheblich stärken.

Implementierung der Ratenbegrenzung

Begrenzen Sie die Anzahl der API-Anfragen von einer einzelnen IP-Adresse innerhalb eines bestimmten Zeitraums. Dies verlangsamt Brute-Force-Angriffe und macht sie weniger durchführbar. Eine Ratenbegrenzung ist eine gute Praxis für alle Ihre APIs und Endpunkte, nicht nur für Ihre Anmelde-API.

Aktivieren Sie die Multi-Faktor-Authentifizierung (MFA)

Wenn Sie eine zusätzliche Sicherheitsebene wie MFA hinzufügen, können Sie Brute-Force-Angriffe vereiteln, selbst wenn der Angreifer das Passwort richtig errät. Um den gesamten Authentifizierungsprozess erfolgreich zu durchlaufen, muss der Benutzer etwas wissen (das Passwort) und etwas besitzen (ein Telefon oder einen Hardware-Token).

Überwachung und Analyse von Anmeldeversuchen

Richten Sie eine Lösung zur Überwachung von API-Anfragen ein, um die Anmeldeversuche im Auge zu behalten. Suchen Sie nach Mustern, die auf einen Angriff hindeuten könnten. Dies kann Ihnen helfen, schnell auf verdächtige Aktivitäten zu reagieren.

Die Umsetzung dieser Maßnahmen kann dazu beitragen, Ihre API vor Brute-Force-Angriffen zu schützen und die Konten Ihrer Benutzer zu sichern.

Fazit

Der Schutz Ihrer Anmelde-API vor Brute-Force-Angriffen ist von entscheidender Bedeutung. Das Erraten eines Passworts ist nicht so schwierig, wie Sie vielleicht denken, und das Automatisieren des Erratens ist ein Kinderspiel. Ist Ihr System verwundbar? Wir haben verschiedene Maßnahmen zur Absicherung Ihrer Systeme beschrieben. Diese Schritte werden Ihre Sicherheitslage erheblich verbessern.

In der Hektik der Entwicklung Ihrer Anwendungen und APIs verzeihen wir Ihnen, wenn Sie hier und da Abstriche machen. Jeder macht das. Aber lassen Sie Ihre Anmelde-API nicht ungeschützt! Warten Sie nicht, bis ein Angriff erfolgt - ergreifen Sie jetzt Maßnahmen, um Ihr System und Ihre Benutzer zu schützen. Eine detailliertere Anleitung zur Protokollierung und Systemüberwachung finden Sie in den Linode-Dokumenten. Wenn Sie planen, Apache für Ihre Anwendungen zu verwenden, können Sie diese Anleitung zur Konfiguration von mod_evasive lesen, damit Ihr Server DoS/DDoS-Angriffe überlebt.

Seien Sie vorsichtig!

Kommentare

Kommentar abgeben

Ihre E-Mail Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit *gekennzeichnet