Solltest du das chroot aufgeben oder iproute2 in die Jail kopieren?
Eine unvollständige Jail scheitert nach dem Start, nicht beim Booten. Entscheide dich zwischen gelockerter Härtung und dem Kopieren von Binärdateien samt Bibliotheken in das neue Root.
Der Dienst startet, ein Client verbindet sich, und auf der Serverseite taucht nie eine Route auf. Oder der Daemon startet nicht und nennt einen Befehl, den er nicht ausführen konnte. Beide Ausgänge folgen denselben drei Zeilen, die üblicherweise gemeinsam aus einem Härtungsleitfaden kopiert werden: auf ein unprivilegiertes Konto wechseln, die Gruppe fallen lassen und das Dateisystem-Root ändern. Nur eine der drei verbirgt Dateien, und nur eine von ihnen entzieht die Berechtigung zum Ändern der Routing-Tabelle. Sie zu trennen zeigt dir, welche Zeile du wirklich brauchst.
Was die Jail wegnimmt, das der Daemon noch braucht
Das Root wird nach dem Start geändert, deshalb behält der Daemon alles, was er bereits geöffnet hat, und verliert alles, was er später öffnen würde. Jeder Helfer, den die Verbindung danach ausführt, muss innerhalb des neuen Roots existieren, zusammen mit den Shared Libraries, die er lädt. Eine Jail, die aus einer Konfigurationsdatei und einem Zertifikat besteht, hat beides nicht.
Der Wechsel auf ein unprivilegiertes Konto ist eine separate Einschränkung. Ein Prozess, der Root aufgegeben hat, kann möglicherweise keine Routen ändern oder eine Schnittstelle hochfahren, selbst wenn die Binärdatei direkt daneben liegt, deshalb müssen die beiden Fehler getrennt diagnostiziert werden.
Drei Bedingungen entscheiden, welche Korrektur du brauchst
Die erste Bedingung ist, wie dein Build Routen installiert. Neuere OpenVPN Versionen konfigurieren Schnittstelle und Routing-Tabelle prozessintern, während ältere Pakete und eigene Setups auf externe Werkzeuge oder auf Up- und Down-Skripte setzen. Nennt das Log einen Befehl, ist ein externes Werkzeug im Spiel und die Jail versteckt es. Zeigt das Log stattdessen einen Berechtigungsfehler, ist das Konto das Problem.
Die zweite ist die Wartung. Eine Jail mit kopierten Binärdateien muss aktualisiert werden, sobald das Paket, das sie bereitstellt, aktualisiert wird, sonst hinterlässt das erste Upgrade einen kaputten Tunnel. Die dritte ist, ob eine bestimmte Kontrolle wirklich ein chroot verlangt; geht es in der Anforderung eigentlich um Privilegientrennung, kann der Kontowechsel allein genügen.
| Signal in the log | Other side of the boundary | Repair direction |
|---|---|---|
| Command not found after startup | Binary and its libraries absent inside the new root | Populate the jail, or drop the chroot line |
| Operation not permitted | Account lost the privilege to edit routes | Keep the account privileged, or pre-create routes elsewhere |
| No such device | Jail lacks the tun device node | Create the node inside, or open it before the root change |
Was eine funktionierende Jail enthalten muss
Eine Jail, die Befehle ausführt, braucht die Binärdatei, jede Bibliothek, gegen die sie linkt, und jeden Geräteknoten, den der Daemon spät öffnet. Kopiere die Teile und teste sie ohne VPN im Spiel:
ldd /usr/sbin/ip
chroot /etc/openvpn/jail /sbin/ip route show
chroot /etc/openvpn/jail /sbin/ip link set tun0 up
Der erste Befehl listet die Abhängigkeiten auf, und er ist derjenige, den Leute überspringen. Eine kopierte Binärdatei, die eine Bibliothek nicht findet, scheitert mit einer anderen Meldung als eine fehlende Binärdatei, und beides sieht von der Clientseite aus wie ein OpenVPN-Fehler. Den Befehl von Hand in der Jail auszuführen reproduziert den Fehler, ohne den Dienst neu zu starten.
Kopiere auch die Konfiguration, die Zertifikate und jede CRL in die Jail, denn eine Datei, die der Daemon nach dem Start erneut lesen will, wird nicht gefunden, sobald sich das Root geändert hat. Halte fest, was du kopiert hast, denn das nächste Upgrade des Netzwerkpakets ersetzt die Originale und lässt die Jail auf der alten Kopie zurück.
Stattdessen die Härtung verkleinern
Wenn die Jail nur existiert, weil ein Leitfaden es so sagt, ist es ein vertretbares Ergebnis, diese eine Zeile zu entfernen und die Kontoeinschränkungen zu behalten. Der Daemon behält seine Dateisystemsicht und verliert das Problem, und der Privilegienwechsel nimmt dem langlebigen Prozess weiterhin Root.
Schreibe auf, was bleibt, und warum. Eine Konfiguration, die stillschweigend eine Kontrolle ohne Notiz verloren hat, ist der Weg, auf dem Härtung driftet, und der nächste Audit fragt, warum die Zeile verschwunden ist.
Vor der Entscheidung die drei Zeilen einzeln durchprobieren
Kopiere die Konfiguration, deaktiviere alle drei Anweisungen und bestätige, dass sich ein Client verbindet und die erwarteten Routen erscheinen. Aktiviere dann nur die Kontenzeilen, danach allein das chroot. Der Schritt, an dem der Tunnel bricht, zeigt die Grenze, und du vermeidest, eine Jail neu zu bauen, die nie die Ursache war.
Sobald es wieder routet, starte eine Client-Sitzung mit höherer Ausführlichkeit und lies die Zeile, die den Befehl oder die fehlende Berechtigung nennt. Diese Zeile ist mehr wert als der Timeout, den der Client am Ende meldet.