Den Zugang eines Clients zu pausieren und ihn endgültig zu entfernen sehen nach derselben Aufgabe aus, bis man versucht, eines von beidem rückgängig zu machen. Ein Zertifikat zu widerrufen schreibt einen Eintrag, den der Server als endgültig behandelt, und ihn rückgängig zu machen heißt, die Datenbank des Ausstellers von Hand zu bearbeiten. Den laufenden Tunnel zu verwerfen ist ein Verwaltungsbefehl, der am Vertrauen nichts ändert. Wählen Sie den Hebel, indem Sie fragen, ob der Schlüssel noch vertrauenswürdig ist, nicht indem Sie fragen, wie dringend die Anfrage wirkt.

Der Glaube: widerrufen und ausgesetzt sind dasselbe

Ein Subunternehmer wird für eine Woche pausiert, und der Reflex ist der Widerruf, weil Widerruf nach Abschalten klingt. Es sieht ordentlich aus, es dauert zehn Sekunden, und es bleibt eine Datenbankbearbeitung als einziger Weg zurück. Der Reflex ist verständlich, und er ist näher am Verbrennen eines Passes als am Schließen einer Tür. Ein pausiertes Gerät und ein kompromittierter Schlüssel brauchen unterschiedliche Behandlung, und nur eines von beidem ist billig umzukehren.

Der Unterschied betrifft das Zertifikat und nicht die Person. Ein Schlüssel, der noch in den richtigen Händen ist, lässt sich pausieren und fortsetzen, ohne Vertrauen zu verlieren. Ein Schlüssel, der kopiert worden sein könnte, sollte nie wiederhergestellt werden, weil die Wiederherstellung behauptet, dass die Kopie nicht existiert.

Schreiben Sie die Antwort auf, bevor Sie eines der beiden Systeme anfassen. Wenn Sie nicht sagen können, ob der Schlüssel offengelegt ist, ist die konservative Antwort der Austausch.

Verwerfen Sie die laufende Sitzung über die Verwaltungsschnittstelle

OpenVPN bietet eine Verwaltungsschnittstelle, die Sitzungen auflisten und eine davon über den Common Name beenden kann. Aktivieren Sie sie auf localhost, halten Sie sie von der öffentlichen Schnittstelle fern, und senden Sie den Kill-Befehl, wenn eine Sitzung sofort verschwinden muss. Der Befehl schließt nur diesen Tunnel, und jeder andere Client arbeitet weiter.

Das ist eine Reaktion auf ein aktives Problem, keine Aussetzungspolitik. Dasselbe Profil kann sich in einer Minute wieder verbinden, weil sich an seinem Zertifikat nichts geändert hat. Verwenden Sie es, wenn die Sitzung gehen muss und die dauerhafte Entscheidung noch getroffen wird.

Bestätigen Sie, dass die Sitzung verbunden war, bevor Sie sie beenden, damit Sie nicht einen Client jagen, der nie verbunden war. Der Statusbefehl unten zeigt, was gerade verbunden ist.

printf 'status 2\nquit\n' | nc 127.0.0.1 7506
printf 'kill kiosk-14\nquit\n' | nc 127.0.0.1 7506

Wenn der Kill meldet, dass es keinen solchen Client gibt, ist der Common Name im Zertifikat nicht die Zeichenkette, die Sie getippt haben. Lesen Sie die Statusausgabe statt des Namens der Profildatei.

Was die CRL tatsächlich steuert

Der Server zieht kein Widerrufsflag heran, das auf dem Zertifikat gespeichert ist. Er liest die Zertifikatssperrliste, die in crl-verify benannt ist, bei jeder neuen Verbindung und weist ein Zertifikat ab, dessen Seriennummer in dieser Liste steht. Daraus folgen zwei Konsequenzen, und beide sind betrieblich wichtig. Die Datei muss für das Konto lesbar sein, auf das der Server seine Rechte abgibt, und ein bereits verbundener Client läuft weiter, bis er sich neu verbindet.

Die zweite Konsequenz überrascht Leute während eines Vorfalls. Der Widerruf eines Zertifikats schließt nicht den Tunnel, der es gerade benutzt. Koppeln Sie den Widerruf mit einem Verwaltungs-Kill, wenn die Sitzung sofort enden muss, und behandeln Sie beide Aktionen als getrennte Schritte im Runbook.

Prüfen Sie die Liste, um zu sehen, was der Server tatsächlich durchsetzt, statt dem Zeitstempel der zuletzt kopierten Datei zu vertrauen. Entscheidend ist die Anzahl der Seriennummern.

openssl crl -in /etc/openvpn/server/crl.pem -noout -text | sed -n '1,14p'
ls -l /etc/openvpn/server/crl.pem

Eine Liste ohne Einträge und eine Liste mit den richtigen Einträgen sehen in einem Verzeichnislisting gleich aus, deshalb lohnt es sich, die Anzahl der Seriennummern auszugeben. Die Rechtezeile ist genauso wichtig, weil eine Datei, die der Daemon nicht lesen kann, einen Fehler erzeugt, der wie ein abgewiesener Client aussieht.

Einen Eintrag wiederherstellen, vorsichtig

Ein Zertifikat wiederherzustellen heißt, einen Eintrag in der Ausstellungsdatenbank umzukehren und eine neue Liste zu veröffentlichen. easy-rsa 3 führt diese Datenbank als index.txt im PKI-Verzeichnis, während ältere Layouts eine andere Anordnung nutzten. Eine Zeile beginnt mit einem Statusbuchstaben und einem Ablaufdatum. Eine widerrufene Zeile fügt einen Zeitstempel für den Widerruf ein, bevor sie mit der Seriennummer, dem Dateinamen des Zertifikats und dem Distinguished Name fortfährt. Eine Zeile zurückzusetzen heißt, diesen Zeitstempel zu löschen und den Buchstaben umzudrehen, während alles andere unangetastet bleibt.

Sichern Sie die Datei zuerst, und setzen Sie die Änderung als Skript um, statt in einen Texteditor zu tippen. Ein Tippfehler, der die Anzahl der Felder in einer Zeile ändert, bricht die Ausstellung für jedes danach hinzugefügte Zertifikat. Das ist der Grund, die Änderung zu automatisieren und die Datei vor dem Anfassen zu kopieren.

Ein zweiter Widerruf desselben Namens schlägt oft ebenfalls fehl, weil der erste Lauf dieses Zertifikat und seinen Schlüssel aus den Verzeichnissen verschoben hat, in denen das Werkzeug sie erwartet. Das Werkzeug findet dann nicht, was es widerrufen soll, und die Fehlermeldung sagt nicht immer klar, warum.

cp /etc/easy-rsa/pki/index.txt /root/index.txt.$(date +%F-%H%M)
grep -c '^R' /etc/easy-rsa/pki/index.txt
easyrsa gen-crl

Veröffentlichen Sie die neue Liste, korrigieren Sie ihren Besitzer, und bringen Sie den Server dazu, sie zu lesen. Ein Neuladen genügt auf den meisten Installationen, aber die Bestätigung muss von einer frischen Verbindung kommen, da die bestehende Sitzung nie etwas nachgeprüft hat.

Prüfen Sie, welchen Hebel der Fall verdient

Stellen Sie die eine Frage, die das ganze Runbook entscheidet: liegt der private Schlüssel noch ausschließlich dort, wo er hingehört. Wenn ja, deckt der Sitzungs-Kill plus eine dokumentierte Pause den Fall ab und hinterlässt keinen dauerhaften Eintrag. Wenn nicht, ist die einzige sichere Antwort ein neuer Schlüssel, während das alte Zertifikat widerrufen bleibt.

Überprüfen Sie das Ergebnis dann mit einem Verbindungsversuch statt mit einem Konfigurationsunterschied. Der Unterschied sagt Ihnen, was Sie beabsichtigt haben, und die Verbindung sagt Ihnen, was der Server durchsetzt.

openssl crl -in /etc/openvpn/server/crl.pem -noout -text | grep -c 'Serial Number'
printf 'status 2\nquit\n' | nc 127.0.0.1 7506

Wenn ein wiederhergestellter Client sich verbindet und in der Statusausgabe erscheint, hat die Bearbeitung des Eintrags funktioniert. Wenn ein widerrufener Client abgewiesen wird und das Log die CRL nennt, hat der Widerruf funktioniert. Alles dazwischen ist ein Rechte- oder Neuladeproblem, und es lohnt sich, das zu beheben, bevor die nächste Anfrage kommt.

Ähnliche Artikel