Zum Inhalt springen

Sicherheitsmodell

Was das Portal von PaaSbox für deine Cluster verwahrt, wie jeder Teil die anderen prüft, und was ein Angreifer mit einer geleakten Datenbank, einem geleakten Schlüssel oder einem laufenden Portal unter seiner Kontrolle tun könnte. Die Gründe hinter dem Entwurf stehen unter So funktioniert es; diese Seite listet die Fakten.

So funktioniert PaaSbox ClustersSo, wie es gebaut ist und am 2026-10-10 im Labor Ende-zu-Ende lief; PaaSbox Clusters ist noch nicht buchbar. Das PaaSbox-Portal ruft mit deinem Token die Hetzner-API auf und legt den Cluster in deinem eigenen Hetzner-Projekt an: einen Server, ein privates Netz und eine Firewall. Auf dem Server lauscht pbx-agent, ein Programm und kein KI-Modell, auf keinem Port: Etwa alle 30 Sekunden ruft er das Portal über ausgehendes HTTPS auf, meldet den Zustand des Nodes und bekommt den Sollzustand und höchstens eine Operation. Das Portal öffnet nie eine Verbindung zu deinem Server. Snapshots des Cluster-Zustands gehen vom Node direkt in einen S3-Bucket, der dir gehört, und laufen nie über das Portal.PaaSbox-PortalHub · Provisionerdein Token, verschlüsseltDein Hetzner-ProjektDein Serverpbx-agentk3s · Garden Linuxlauscht auf keinem Portprivates NetzFirewallHetzner-API,dein TokenHTTPS, ausgehendalle 30 sDein S3-BucketSnapshots, direktvom NodeDer Agent öffnet jede Verbindung: ausgehendes HTTPS,etwa alle 30 s. Das Portal verbindet sich niemit dem Server.Das Portal ruft mit deinem Token die Hetzner-API auf,um anzulegen und zu löschen, was zum Cluster gehört.Snapshots gehen vom Node direkt in deinen Bucket,nie über das Portal.
VerbindungGeöffnet vonWas sie trägt
pbx-agent → das Portal, HTTPS, etwa alle 30 Sekundenpbx-agent; er lauscht auf keinem PortDen Zustand des Nodes; zurück den Sollzustand und höchstens eine Operation
Das Portal → die Hetzner-APIDer Provisioner, der einzige Teil, der dein Hetzner-Token benutztRessourcen des Clusters in deinem Projekt anlegen und löschen
k3s auf dem Node → dein Bucketk3sSnapshots; sie laufen nie über das Portal
Du oder dein Agent → die Kubernetes-API, Port 6443DuNur aus den Adressbereichen, die du gewählt hast
Alle → Ports 80 und 443AlleDein Ingress

Das Portal verbindet sich nie mit deinem Server. Sonst öffnet die Firewall nichts.

VerwahrtWie
Dein Hetzner-Token, das dein ganzes Projekt öffnet, lesend und schreibendVerschlüsselt
Das k3s-Server-Token, in jeder Version, die ein behaltener Snapshot noch brauchtVerschlüsselt
Das k3s-Agent-TokenVerschlüsselt
Das Hetzner-Token, das im Cluster benutzt wird (ein eigenes oder eine Kopie des ersten)Verschlüsselt
Die S3-Schlüssel deines Snapshot-Buckets, wenn du sie nicht selbst hältstVerschlüsselt
Die geheimen Optionen von Add-ons, etwa DNS-TokensVerschlüsselt
Eine versiegelte Kubeconfig, bis sie abgeholt istVerschlüsselt, höchstens 5 Minuten; das Siegel kann das Portal nicht öffnen
Die Schlüssel von pbx-agentNur die öffentlichen
Registrierungs-TokensNur Hashes
Deine API-Schlüssel In ArbeitNur Hashes; ein Schlüssel wird einmal angezeigt, wenn er entsteht
Das Audit-Log der Aufrufe über API und MCP In ArbeitDie Argumente, ohne jedes Geheimnis

Die verschlüsselten Felder liegen verschlüsselt in der Datenbank des Portals, mit Schlüsseln, die außerhalb von ihr verwahrt werden. Die Geheimnisse, die das Portal an pbx-agent schickt, sind so versiegelt, dass nur der pbx-agent dieses Clusters sie öffnen kann.

Verwahrt nie
Admin-Kubeconfigs oder ihre TokensSie entstehen auf dem Node und werden an den Schlüssel dessen versiegelt, der gefragt hat
/etc/rancher/k3s/k3s.yaml, die Admin-Datei auf dem ServerDas Portal liest sie nie
Die privaten Schlüssel von pbx-agentSie entstehen auf dem Node und verlassen ihn nie
Den Inhalt deiner SnapshotsSie gehen vom Node in deinen Bucket
Die Daten deiner Workloads oder ihre Secrets

Server-Token und S3-Schlüssel zusammen könnten einen Snapshot öffnen, und ein Snapshot enthält jedes Secret deines Clusters. Das ist der Preis einer Wiederherstellung, ohne dass du an der Tastatur sitzt. Hältst du die Schlüssel des Buckets selbst, sieht das Portal sie nie und kann deine Snapshots nicht lesen; eine Wiederherstellung funktioniert dann nur, solange die API des Clusters läuft, und eine Wiederherstellung auf einen neuen Server bräuchte deine Schlüssel. In Arbeit Selbst gehaltene Schlüssel sind auf einem echten Cluster noch nicht gelaufen. Siehe Backups einrichten.

MechanismusWas er tut
RegistrierungDie User Data eines neuen Servers enthalten ein Registrierungs-Token, einmal benutzbar, 30 Minuten gültig und an den Cluster und den Namen des Nodes gebunden. Das Portal prüft über die Hetzner-API, dass der Server das Label des Clusters und den Namen des Nodes trägt, und prüft den Hash des Images, das der Node tatsächlich gebootet hat, gegen das Release. Erst dann gibt es die Konfiguration des Nodes heraus.
Schlüssel, die auf dem Node entstehenBeim ersten Start erzeugt pbx-agent einen Signaturschlüssel und einen Verschlüsselungsschlüssel. Die privaten Hälften verlassen den Server nie. Das Portal wechselt sie alle 90 Tage.
Signierte AnfragenJede Anfrage nach der Registrierung ist über Methode, Pfad, einen Zeitstempel und einen Hash des Inhalts signiert. Das Portal lehnt eine Uhrabweichung über 60 Sekunden ab und eine Signatur, die es in den letzten 120 Sekunden schon gesehen hat.
Versiegelte GeheimnisseJedes Geheimnis, das das Portal schickt, ist für den Schlüssel des Nodes verschlüsselt. pbx-agent lehnt ein Dokument ab, in dem ein Geheimnis im Klartext ankommt.
Nichts Dauerhaftes in den User DataUser Data bleiben vom Server aus lesbar, solange er existiert. Sie enthalten nur die Download-Adresse und die Prüfsumme von pbx-agent, die Adresse des Portals, die ID des Clusters, den Namen des Nodes und das Registrierungs-Token, das nach Gebrauch oder Ablauf nutzlos ist. Das Node-Image sperrt Pods von der Metadaten-Adresse aus.
Signierte ReleasesEin Release ist mit einem Schlüssel signiert, den ich offline verwahre: nie auf dem Portal, nie in der CI. pbx-agent trägt zwei öffentliche Schlüssel fest eingebaut und lehnt ein Release ab, das keiner von beiden signiert hat. Er aktualisiert sich nur auf eine Version, die in einem solchen Release steht, und geht zur vorigen zurück, wenn die neue das Portal nicht innerhalb von 10 Minuten erreicht. In Arbeit Diese Rückkehr hat auf einem echten Server noch nicht ausgelöst.
Versiegelte KubeconfigsEine Kubeconfig entsteht auf dem Node und wird für einen Schlüssel verschlüsselt, den nur der Anfragende hält: einen Schlüssel, den dein Browser für diese eine Anfrage erzeugt, oder den eigenen Schlüssel eines Agenten. Das Portal reicht die versiegelte Kopie einmal weiter und kann sie nicht lesen.
Geheime Optionen von Add-onsLanden in Kubernetes-Secrets, die k3s im Ruhezustand verschlüsselt, nie in anderen Objekten.

In Arbeit Die REST-API und die MCP-Tools sind Code, noch nicht an einem echten Cluster gelaufen. Leitplanken für Agenten sagt, was jede Grenze verhindert und was nicht.

GrenzeWas sie tut
Team-SchlüsselEin Team-Admin legt einen Schlüssel für ein Team an, mit einem Ablauf nach 30 Tagen, 90 Tagen, einem Jahr oder ohne, und kann ihn sofort widerrufen. Höchstens 25 aktive Schlüssel pro Team.
Scopesk3s:read, k3s:write, k3s:access, k3s:destructive. Jeder Aufruf braucht genau einen; ein Schlüssel hält nur, was sein Agent braucht.
Die Person hinter dem SchlüsselDer Schlüssel handelt als die Person, die ihn angelegt hat, und die muss noch aktives Mitglied des Teams sein. Ein Scope engt ein, was diese Person darf; er erweitert es nie.
Zerstörende AufrufeEinen Cluster anlegen, löschen, abkoppeln und wiederherstellen braucht k3s:destructive, einen Team-Admin als Besitzer des Schlüssels und den Namen des Clusters, eingetippt als Bestätigung.
KubeconfigsVersiegelt an den eigenen Schlüssel des Agenten; eine Kubeconfig, die über einen Schlüssel angefragt wurde, kann nur dieser Schlüssel abholen.
Ratenlimits120 Aufrufe pro Minute pro Schlüssel, davon 20, die etwas ändern.
Audit-LogJeder MCP-Aufruf und jeder REST-Aufruf, der etwas ändert oder eine Kubeconfig herausgibt, auch abgelehnte: wer, über welchen Schlüssel, was, mit welchen Argumenten (ohne Geheimnisse) und wie es ausging. Team-Admins lesen es im Portal.

Chiffretexte, öffentliche Schlüssel und die Hashes von Registrierungs-Tokens und API-Schlüsseln. Die Schlüssel, die die Chiffretexte entschlüsseln, liegen nicht in der Datenbank. Die Argumente im Audit-Log, die keine Geheimnisse tragen.

Ein Angreifer, der das laufende Portal kontrolliert, könnteWarum
Alles in deinem Hetzner-Projekt anlegen, ändern und löschen, nicht nur die Ressourcen des ClustersDas Portal hält dein Hetzner-Token. Darum gehören deine Cluster in ein eigenes Projekt.
pbx-agent um eine Admin-Kubeconfig bitten und damit als cluster-admin auf jedem Cluster handeln, den es verwaltetKubeconfigs ausstellen ist eine der Operationen von pbx-agent
Eine Wiederherstellung eines älteren Snapshots anstoßen, die den Zustand des Clusters zurücksetztWiederherstellen ist eine der Operationen von pbx-agent
Die Einstellungen ändern, die das Portal verwaltet: Add-ons und ihre Optionen aus dem Release des Clusters, den Snapshot-Zeitplan und, wenn das Portal die S3-Schlüssel hält, das Snapshot-Zielpbx-agent wendet den Sollzustand an, den das Portal schickt
Den Cluster abkoppeln oder löschenLöschen ist die Aufgabe des Provisioners
Deine Snapshots öffnenMit dem Server-Token und den S3-Schlüsseln beim Portal
Es könnte nichtWarum
Einen beliebigen Befehl auf deinem Server ausführenpbx-agent hat eine feste Liste von Operationen und keinen Kanal für Befehle
Ein Release, das ich nicht signiert habe, oder eine Version von pbx-agent, die in keinem solchen Release steht, auf einem laufenden Node installierenDer Release-Schlüssel liegt nicht auf dem Portal
/etc/rancher/k3s/k3s.yaml lesen, die Daten deiner Workloads, oder Snapshots in einem Bucket, dessen Schlüssel du selbst hältstDas Portal bekommt sie nie

Ein Server, der angelegt wird, während das Portal kompromittiert ist, ist eine andere Sache: Er lädt den pbx-agent, der in seinen User Data steht, geprüft gegen eine Prüfsumme, die das Portal dort einträgt.

FallFolgeWas Schlimmeres verhindert
Ein Registrierungs-Token wird gestohlenEine fremde Maschine versucht, sich zu registrierenDas Token gilt einmal, 30 Minuten lang, für einen Node-Namen; ID und Labels des Servers werden über die Hetzner-API geprüft; das gebootete Image wird geprüft
Ein Pod liest die Metadaten-AdresseEr bekommt keine Antwort: Das Node-Image sperrt Pods davon ausAuch ohne Sperre fände er nur ein benutztes oder abgelaufenes Token
Eine Anfrage wird wiederholt oder abgefangenWiederverwendung einer Anfrage, Preisgabe eines GeheimnissesTLS, signierte Anfragen mit Zeitstempel, der Replay-Cache, versiegelte Geheimnisse
Ein API-Schlüssel wird geleakt In ArbeitWer ihn hat, handelt im Rahmen seiner Scopes, als sein BesitzerScopes, die Rolle des Besitzers im Team, eingetippte Namen und ein Team-Admin für zerstörende Aufrufe, Ratenlimits, das Audit-Log; widerrufe den Schlüssel auf der Seite der API-Schlüssel
Dein Konto wird übernommenDer Angreifer benutzt das Portal als duEingetippte Bestätigungen, Mails an die Admins des Teams, kurze Laufzeiten der Kubeconfigs
Missbrauch durch michOperationen, die ich anstoßeJede Operation zeigt, wer sie angefragt hat, Personal eingeschlossen; Wiederherstellungen und Kubeconfigs gehen per Mail an deine Admins
PaaSbox verschwindetDas Portal und seine DNS-Zone sind wegDer Cluster läuft weiter; du hast root, das Server-Token auf der Platte des Servers und die Snapshots in deinem Bucket; siehe Ohne PaaSbox weiterbetreiben
GrenzeWas sie tut
Kein BefehlskanalWie oben
Offline signierte ReleasesGetestet im Labor, dann auf meinen eigenen Clustern, dann auf dem Kanal early, bevor sie stable erreichen. Zwei Fehlschläge unter den ersten fünf Upgrades auf ein Release halten es an.
Mails an die Admins deines TeamsWann immer eine Wiederherstellung oder eine Kubeconfig angefragt wird, mit der Person, die gefragt hat, Personal als solches gekennzeichnet. Fehlgeschlagene Upgrades, ausgefallene Snapshots, ablaufende Zertifikate und ein Cluster, der sich 24 Stunden nicht gemeldet hat, gehen ebenfalls per Mail raus.
Ein Name in deinem ClusterJede Kubeconfig ist ein ServiceAccount, benannt nach der Person, für die sie ausgestellt wurde, im Namespace pbx-access; ihre Aufrufe erreichen die Kubernetes-API unter diesem Namen. Ein Audit-Log von Kubernetes über diese Aufrufe führt der Node nicht.
Wer gefragt hatJede Operation zeigt, wer sie angefragt hat, meine eingeschlossen, auf dem Reiter Operations des Clusters.
Eingetippte BestätigungenFür eine Wiederherstellung, ein Abkoppeln und ein Löschen.
Kurze LaufzeitenKubeconfigs leben höchstens 24 Stunden.
Was du tun kannstDie Cluster in einem eigenen Hetzner-Projekt halten, die Schlüssel des Buckets selbst halten, die Adressbereiche der API eingrenzen, jedem Agenten einen Schlüssel mit nur den Scopes geben, die er braucht, und den Bucket in einem Projekt oder bei einem Anbieter halten, den das Hetzner-Token nicht erreicht.

Ein weiterer Schutz ist eine Idee für eine spätere Version, weder gebaut noch eingeplant: deine Zustimmung, außerhalb des Portals, bevor eine Wiederherstellung oder eine Admin-Kubeconfig ausgestellt wird.

WasWie
pbx-agentLäuft als root, weil eine Wiederherstellung k3s anhalten und wieder starten muss, während die Kubernetes-API nicht erreichbar ist. Er lauscht auf nichts.
DiagnoseWird nur gesammelt, nachdem du es für diese eine Anfrage erlaubt hast; nie Secrets, Tokens oder Umgebungsdateien.
Secretsk3s verschlüsselt Secrets im Ruhezustand.
Das Root-DateisystemNur lesbar, Teil des Images, dessen Prüfsumme das signierte Release nennt.
Port 22Von der Firewall geschlossen; das Image hat kein root-Passwort. Root auf dem Server bekommen zeigt die Wege hinein.