Wie schützt man eine API?
API-Sicherheit heißt, dass ein Dienst nur Anfragen beantwortet, die von bekannten Absendern kommen, nur Erlaubtes tun und niemanden überlasten. Ohne diesen Schutz kann jede Person Daten lesen, ändern oder den Dienst mit Anfragen lahmlegen.
Die Ausleihdaten einer Bibliothek zeigen, warum: Sie verraten, wer welches Buch gelesen hat.
Am Ende dieser Lektion
Notiz
Ich kann eine API mit Schlüsseln, Tokens und Limits schützen.
Schlüsselwörter
| Begriff | Was er bedeutet |
|---|---|
| API-Schlüssel | eine lange geheime Zeichenfolge, die eine Anwendung ausweist |
| Token | ein Ausweis auf Zeit, den der Server nach der Anmeldung ausstellt |
| Ablaufzeit | der Zeitpunkt, ab dem ein Token nicht mehr gilt |
| Authentifizierung | die Frage: Wer sind Sie? |
| Autorisierung | die Frage: Was dürfen Sie? |
| Ratenbegrenzung | eine Obergrenze für Anfragen in einer Zeitspanne |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Ein API-Schlüssel nennt die Anwendung
Ein API-Schlüssel ist eine lange, zufällige Zeichenfolge. Die Anwendung schickt ihn in einem Header mit jeder Anfrage. So weiß der Server, wer fragt, und kann den Zugriff einer Anwendung sperren.
Speichern Sie Schlüssel nie im Klartext. Der Server legt nur den Hash ab, eine Prüfsumme, aus der sich der Schlüssel nicht zurückrechnen lässt.
Ein Beispiel: eine Anfrage mit Schlüssel
GET /ausleihen HTTP/1.1
Host: api.beispiel.de
X-API-Key: bibliothek-4711
# Der Server berechnet den Hash des Schlüssels und sucht ihn in seiner Liste.Den Hash eines Schlüssels berechnen
printf 'bibliothek-4711' | sha256sumHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
psql das Passwort geben
export PGPASSWORD=shopHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Die Tabelle buecher anlegen und füllen
psql -h db -U shop -c "drop table if exists buecher cascade; create table buecher (id serial primary key, titel text not null, fach text not null, jahr int not null, exemplare int not null default 1); insert into buecher (titel, fach, jahr, exemplare) values ('Algorithmen kompakt', 'Informatik', 2019, 3), ('Netze verstehen', 'Informatik', 2021, 2), ('Statistik fuer alle', 'Mathematik', 2018, 1), ('Schreiben im Studium', 'Sprache', 2020, 4); notify pgrst, 'reload schema'"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Mit einem Schlüssel fragen, den niemand prüft
curl -s -o /dev/null -w "%{http_code}\n" -H "X-API-Key: bibliothek-4711" "http://api:3000/buecher"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Ein Token ist ein Ausweis auf Zeit
Nach der Anmeldung stellt der Server ein Token aus. Die Anwendung schickt es mit jeder Anfrage im Header Authorization: Bearer .... Ein Token nennt die Person und eine Ablaufzeit.
Es gilt nur kurz, etwa eine Stunde. Wird es gestohlen, hilft es dem Dieb nur kurz. Der Server prüft bei jeder Anfrage die Unterschrift und die Ablaufzeit.
Den Inhalt eines Tokens kodieren
printf '{"nutzer":"anna","bis":1900000000}' | base64Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Ihn wieder lesen
echo eyJudXR6ZXIiOiJhbm5hIiwiYmlzIjoxOTAwMDAwMDAwfQ== | base64 -dHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Ein häufiger Fehler
Warnung
Viele glauben, ein Token sei geheim, weil es wie Zeichensalat aussieht. Base64 ist aber keine Verschlüsselung: Jede Person kann den Inhalt lesen, wie der Run gerade zeigte. Legen Sie nie ein Geheimnis in ein Token und schützen Sie es wie ein Passwort.
Ein Beispiel: wann ein Token noch gilt
| Ablaufzeit (bis) | Jetzt | Gilt es noch? |
|---|---|---|
| 1900000000 | 1899999000 | Ja, es sind noch 1000 Sekunden |
| 1900000000 | 1899999999 | Ja, noch eine Sekunde |
| 1900000000 | 1900000000 | Nein, die Zeit ist genau erreicht |
| 1900000000 | 1900003600 | Nein, seit einer Stunde abgelaufen |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Die Ablaufzeit prüfen
def token_gilt(bis, jetzt):
# Ein Token gilt, solange die Zeit noch nicht erreicht ist.
return jetzt < bis
print(token_gilt(1900000000, 1899999999))
print(token_gilt(1900000000, 1900000000))
# Probieren Sie eine eigene Zeit.
Ein Token-Bucket begrenzt die Anfragen
Ein Limit schützt den Dienst vor zu vielen Anfragen. Das Token-Bucket-Verfahren stellt sich einen Eimer mit Marken vor. Er fasst höchstens K Marken. Jede Anfrage nimmt eine heraus.
Jede Sekunde kommen R Marken dazu, aber nie mehr, als der Eimer fasst. Ist er leer, antwortet der Server mit 429. So sind kurze Spitzen erlaubt, und auf Dauer gilt die Rate R.
Ein Beispiel: Eimer mit 3 Marken
| Zeit (s) | Marken vor der Anfrage | Antwort | Marken danach |
|---|---|---|---|
| 0 | 3 | 200 | 2 |
| 0 | 2 | 200 | 1 |
| 0 | 1 | 200 | 0 |
| 0 | 0 | 429 | 0 |
| 1 | 1 (eine neue) | 200 | 0 |
| 1 | 0 | 429 | 0 |
| 3 | 2 (zwei neue) | 200 | 1 |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Fünf Anfragen hintereinander senden
for i in 1 2 3 4 5; do curl -s -o /dev/null -w "%{http_code} " "http://api:3000/buecher"; done; echoHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.