0%

Signierte Tokens und geheime Schlüssel

Wo ein Schlüssel lebt

Deine Tokens sind signiert, und sie laufen ab. Jedes davon hängt von einem Schlüssel ab, und bisher wird dieser Schlüssel von new_key() auf der Stelle erzeugt und weggeworfen. Woher kommt der Schlüssel des Servers?

Zwei einfache Antworten sind beide falsch. Wenn new_key() bei jedem Start des Servers läuft, stirbt jedes Token bei jedem Neustart. Wenn der Schlüssel eine Konstante in reading_server.py ist, hast du wieder die festen Token-, nur mit einem längeren String: Jeder, der die Datei lesen kann, kann ein Token für jeden Benutzer signieren. Das ist Befund F7.

Der Schlüssel muss dem Server von außerhalb seines Codes gegeben werden, von dem, der den Dienst betreibt. Diese Person ist sein Betreiber ().

Was ein Programm beim Start bekommt

Du kennst schon drei Dinge, die ein Programm bei seinem Start bekommt. Es bekommt seine , die main mit argparse liest. Es bekommt die Standardeingabe zum Lesen und die Standardausgabe und die Standardfehlerausgabe zum Schreiben.

Es gibt ein viertes: seine Umgebung (environment). Die Umgebung ist eine Menge benannter Textwerte, die das Programm als Kopie von dem bekommt, was es gestartet hat. Einer dieser ist eine Umgebungsvariable (environment ). In einer Shell kannst du einem einzelnen Befehl eine Variable mitgeben, indem du sie davor schreibst:

READING_KEY=some-text python reading_server.py

Python in der Praxis hat die linke Seite einer Zeile wie proof_dir=... eine Shell-Variable genannt. So vor einen Befehl geschrieben, wird sie Teil der Umgebung genau dieses einen Befehls und von nichts sonst.

In Python kommt die Umgebung als os.environ an, das sich wie ein von Text zu Text verhält. Du kannst also an einem einfachen Dictionary mit derselben Form üben. Ein Programm liest eine Variable, die fehlen könnte, mit get:

Try it

Die vier Zeilen sind None, eine leere Zeile, 200 und die Meldung von . get gibt für einen Namen, der nicht da ist, None zurück, oder den Standardwert, den du angibst, hier leeren Text. Eckige Klammern lösen KeyError aus. Und "20" + "0" ist 200, nicht 20, weil jeder Wert in einer Umgebung Text ist. Eine Zahl oder ein Schlüssel, der auf diese Weise ankommt, muss zuerst umgewandelt werden.

Was gibt print(environ["PORT"] + "80") mit environ = {"PORT": "80"} aus?

environ hat kein READING_KEY. Was gibt print(len(environ.get("READING_KEY", ""))) aus?

Wo ein Schlüssel nicht sein darf

Ein Schlüssel ist geleakt, sobald er an einer Stelle liegt, an der ihn mehr Leute lesen können, als ihn haben sollten. Vier Stellen tauchen immer wieder auf:

  • Im . Jeder, der den Code lesen kann, hat den Schlüssel, und jede alte Kopie des Codes auch.

  • In einer Log-Zeile. Ein Log wird von mehr Leuten gelesen und an mehr Orten aufbewahrt, als ein Schlüssel erreichen sollte.

  • In einer Datei, die mit dem Projekt gespeichert wird. Die Datei reist überallhin mit, wohin das Projekt geht.

  • In einer Fehlermeldung. Eine Fehlermeldung landet auf einem Bildschirm oder in einem Log.

Du wirst Werkzeugen begegnen, deren ganzer Zweck es ist, Schlüssel von diesen Stellen fernzuhalten: .env-Dateien, die Einstellungen für einen Computer enthalten, .gitignore-Regeln, die eine solche Datei aus einem gemeinsamen Projekt heraushalten, Speicher für Geheimnisse und die geheimen Einstellungen von Build-Diensten. Dieser Kurs verwendet keins davon. Es reicht zu wissen, wofür sie da sind.

Wo darf ein Signierschlüssel leben?

Was die Umgebung ist und was nicht

Die Umgebung hält den Schlüssel vom Code getrennt. Derselbe Code kann auf deinem Computer mit einem Testschlüssel laufen und auf dem echten Dienst mit dem echten, und keiner der beiden Schlüssel steht in irgendeiner Datei des Projekts.

Sie ist kein Tresor. Andere Programme, die unter demselben Benutzer laufen, können die Umgebung eines Programms möglicherweise lesen, je nach und dessen Einstellungen. Ein Programm gibt seine Umgebung außerdem an jedes Programm weiter, das es startet, sofern es sich nicht anders entscheidet. Die Umgebung ist ein besseres Zuhause für einen Schlüssel als der Quellcode, und sie bleibt trotzdem ein Ort, mit dem man vorsichtig sein muss.

Wenn der Schlüssel fehlt

Eine Frage bleibt für die nächste Lektion, und sie verdient schon jetzt eine Antwort. Der Server startet, sucht seinen Schlüssel und findet nichts: Die Variable ist nicht gesetzt. Überleg, wie jede mögliche Reaktion von außen aussieht. Ein Server, der läuft, sieht für den, der ihn gestartet hat, gesund aus, egal welchen Schlüssel er verwendet.

Der Server startet und findet keinen Schlüssel. Welches Verhalten ist das sichere?

In der nächsten Lektion liest dein Server seinen Schlüssel aus der Umgebung und verweigert ohne einen den Start.