Wie Sallyport Ihre Schlüssel schützt
Wo ein Schlüssel liegt und wann er sich öffnet, wie Konten getrennt bleiben, was der Netzwerkschutz ablehnt und wie das Protokoll signiert wird.
Auf dieser Seite
- Der Schlüssel legt genau eine Strecke zurück: von Sallyport zum Dienst
- Jeder gespeicherte Datensatz hat seinen eigenen Schlüssel
- Konten sehen die Daten anderer Konten nie
- Ein Agent kann das Gateway nicht auf das Gateway richten
- Agenten melden sich mit eigenen Token an
- Eine Person entscheidet, wo Sie es wollen, und bei zwei Aktionen immer
- Jeder Aufruf wird vor seiner Ausführung festgehalten
- Was mit den Antworten Ihrer Aufrufe geschieht
- Neustarts und Abstürze verlieren oder wiederholen keinen Aufruf
Der Schlüssel legt genau eine Strecke zurück: von Sallyport zum Dienst
Ein einziger Prozess hält den Tresor und das Protokoll und führt den ausgehenden Aufruf selbst aus. Der Agent nennt die Aktion. Sallyport setzt den Schlüssel in die Anfrage und sendet sie. Der Agent bekommt den Schlüssel nie.
- Keine Route gibt einen Schlüssel zurück. Nicht an Inhaber, nicht an den Support, nicht über die API. Sie können einen Schlüssel ersetzen oder löschen; anzeigen kann ihn niemand.
- Ein Schlüssel geht nur an die Adressen, mit denen er gespeichert wurde. Eine neue Verbindung, eine neue Adresse oder ein neuer Token-Endpunkt für einen gespeicherten Schlüssel wird abgelehnt: Eine andere Adresse braucht einen neuen, erneut eingegebenen Schlüssel. Ein Katalogschlüssel erreicht auch die API-Hosts seines Dienstes.
- Ein Schlüssel öffnet sich nur für drei Dinge: einen freigegebenen Aufruf eines Agenten, die Prüfung, die Sie beim Speichern eines Schlüssels oder mit „Erneut prüfen“ starten, und das Lesen der Werkzeugliste eines MCP-Servers, den Sie verbunden haben. Jede Öffnung steht im Protokoll, bevor der Schlüssel benutzt wird.
- Im Speicher bleibt der Schlüssel Bytes und wird nach dem Aufruf gelöscht. Ein Go-String lässt sich nicht löschen, deshalb bricht ein Test den Build, sobald ein Schlüssel zu einem wird.
Jeder gespeicherte Datensatz hat seinen eigenen Schlüssel
Der Root-Schlüssel öffnet einen Schlüssel pro Konto. Aus dem Kontoschlüssel leitet HKDF-SHA256 einen Schlüssel pro Datenart ab: Dienstschlüssel, OAuth-Erneuerungen, Anfragen der Agenten, Webhook-Geheimnisse. Daraus entsteht ein Schlüssel pro Datensatz.
Jeder Datensatz wird mit ChaCha20-Poly1305 versiegelt und an Konto, Datenart, Datensatz und Version gebunden. Ändern Sie eines der vier, und der Datensatz lässt sich nicht mehr öffnen.
- Der Root-Schlüssel liegt nie in der Datenbank. Er ist eine Datei auf dem Host des Gateways. Zwei beliebige von drei Wiederherstellungsanteilen setzen ihn wieder zusammen.
- Der Root-Schlüssel wird jeden Tag getestet. Ein täglicher Job öffnet damit einen echten Kontoschlüssel, und ein Fehler erreicht die Betreiber sofort.
Konten sehen die Daten anderer Konten nie
Das Gateway verbindet sich mit der Datenbank über eine Rolle, der keine Tabelle gehört und die Row-Level-Security nicht umgehen kann. Jede Abfrage läuft in einer Transaktion, die das Konto und die sichtbaren Arbeitsbereiche nennt.
- Ein Test bricht den Build, wenn einer Tabelle oder einer Protokollpartition ihre Richtlinie fehlt.
- Ihr Verkehr läuft über Ihre eigenen Verbindungen. Sallyport hält einen HTTP-Transport pro Konto und Dienst-Host, deshalb nutzt die Anfrage eines anderen Kontos nie Ihre Verbindung.
Ein Agent kann das Gateway nicht auf das Gateway richten
Sallyport ruft nur öffentliche Internetdienste auf. Bevor eine Verbindung aufgeht, löst das Gateway den Namen auf und prüft jede Adresse gegen eine Sperrliste, die im Binary steckt. Die Konfiguration kann diese Liste nur erweitern.
- Abgelehnt, egal was eine Verbindung sagt: private Bereiche, Loopback, Link-Local und Cloud-Metadatenadressen, CGNAT, Multicast sowie alle Namen und Netze von Sallyport.
- Der Name wird neu aufgelöst, wenn der Aufruf läuft, auch bei einem Aufruf, der auf eine Person gewartet hat. Die Adresse wird im Moment des Sendens geprüft und festgelegt.
- Ihr Schlüssel folgt nie einer Weiterleitung. Ein 3xx geht als Ergebnis an den Agenten zurück. Will der Agent die neue Adresse, macht er einen neuen Aufruf, und alle Prüfungen laufen erneut.
Agenten melden sich mit eigenen Token an
Jeder Agent hat eigene Token, die beim Erstellen einmal angezeigt werden. Die Datenbank speichert nur einen HMAC-SHA-256 jedes Tokens mit einem Pepper, der außerhalb der Datenbank liegt. Eine Kopie der Datenbank enthält kein gültiges Token.
- Trennen Sie einen Agenten mit einem Klick. „Agent pausieren“ auf seiner Seite lehnt seinen nächsten Aufruf ab, mit welchem Token oder welcher Anmeldung er auch kommt. Ein unter „Token“ widerrufenes Token stoppt nur dieses eine Token. „Agent löschen“ ganz unten auf seiner Seite nimmt ihn endgültig außer Dienst.
- Ein MCP-Client, der sich per OAuth anmeldet, bekommt ein Sallyport-Token, nachdem eine Person den Client auf einem Zustimmungsbildschirm freigegeben hat. Der Client sieht nie einen Dienstschlüssel.
- Eine Plattform, die Agenten auf eigenen Maschinen betreibt, verbindet sich als Zugriff zum Verwalten von Agenten, nicht als Agent. Ihr eigener Token ruft nichts auf: MCP-Endpunkt und Proxy lehnen ihn ab. Einen einstündigen Token pro Maschine bekommt sie erst nach der Zustimmung einer Person. Jeder solche Agent startet ohne Zugriff, und nur eine Person gibt ihm welchen. Jeder Token handelt als eigener Agent der Maschine und endet mit der Verbindung.
- Die Werkzeugliste ist pro Agent verschieden und deshalb als privat markiert. Ein Client darf die Werkzeuge eines Agenten nicht zwischenspeichern und einem anderen zeigen.
Eine Person entscheidet, wo Sie es wollen, und bei zwei Aktionen immer
Standardmäßig läuft jeder Aufruf ohne Rückfrage. Schalten Sie „Bei jedem Aufruf fragen“ für einen Agenten und eine Verbindung ein, wenn Sie jeden Aufruf vorher sehen wollen.
- Die Karte zeigt die Anfrage, die Sallyport senden wird: Methode, Host und Pfad. Die eigenen Worte des Agenten stehen in einem eigenen Block, markiert als ungeprüft.
- „Freigeben“ gilt für genau eine Anfrage. Diese Freigabe ist an einen Digest dieser Anfrage gebunden, und vor dem Senden wird die gespeicherte Anfrage damit verglichen. Die Berechtigungs-Schaltfläche der Karte deckt mehr ab: denselben Agenten, dieselbe Verbindung, Klasse und denselben Pfad, für eine festgelegte Zeit und Zahl von Aufrufen.
- Ein DELETE kann sich nicht als GET ausgeben. Header und Parameter, die die Methode überschreiben, werden vor der Einstufung des Aufrufs und vor dem Digest entfernt.
- Ein Raten- oder Parallelitätslimit antwortet mit einem Zeitpunkt für den nächsten Versuch. Es erzeugt nie eine Karte, weil niemand etwas zu entscheiden hat.
Jeder Aufruf wird vor seiner Ausführung festgehalten
Die Absicht des Aufrufs und sein Protokolleintrag teilen sich eine Transaktion mit der Entscheidung zu senden. Die laufenden Nummern kommen aus einer Zählerzeile, die ein Rollback nicht überspringen kann. Die Nummerierung hat keine Lücken, also liest sich ein fehlender Eintrag als Löschung.
- Jeder Eintrag verpflichtet sich auf den vorherigen. Sein Hash umfasst das Schema, das Konto, die laufende Nummer, den vorherigen Hash und das Ereignis. Das Schema heißt spc-chain/2.
- Jeder Eintrag ist mit Ed25519 signiert. Die öffentlichen Schlüssel, der aktive und die ausgemusterten, stehen unter
https://mcp.sallyport.cloud/.well-known/sallyport-audit-keys.json, und ein ausgemusterter Schlüssel bleibt nach einem Schlüsselwechsel auf dieser Liste. - Das Gateway kann sein eigenes Protokoll nicht bearbeiten. Seine Datenbankrolle fügt Einträge hinzu und liest sie, hat aber kein Recht, einen zu ändern.
- Ereignisse werden als lesbares kanonisches JSON gespeichert, und die Kette wird über genau diese Bytes berechnet. Wer die Datei bekommt, liest dasselbe wie Sie.
- „Protokoll herunterladen“ auf dem Bildschirm „Aktivität“ speichert das ganze Protokoll als JSON Lines, jeden Eintrag mit seinem Hash und seiner Signatur. Es ist für eine Person, die jeden Arbeitsbereich prüft: einen Inhaber oder einen Administrator oder Auditor der ganzen Organisation ohne engere Rolle in einem Arbeitsbereich.
- Jeder Protokolleintrag gehört zum Arbeitsbereich dessen, worum es geht. Der Tab „Protokoll“ und ein Webhook zeigen einer Person die Einträge der Arbeitsbereiche, in denen sie Inhaber, Administrator oder Auditor ist, und die der Organisation selbst. Ein Administrator der Organisation, der im Arbeitsbereich eines Kunden nur Mitglied ist, liest dessen Einträge nicht.
Was mit den Antworten Ihrer Aufrufe geschieht
Eine Antwort, die passt, geht direkt an den Agenten. Eine längere wird gespeichert, damit der Agent den Rest in Stücken liest.
- Eine gespeicherte Antwort lesen der Agent, dessen Aufruf sie erzeugt hat, und die Personen Ihres Kontos, die das Protokoll lesen dürfen. Jeder Lesezugriff steht im Protokoll.
- Gespeicherte Antworten, die Antwort jedes Aufrufs und Anfrage-Bodys über 1 MiB werden nach 30 Tagen gelöscht. Ein großer Body wird mit einem eigenen Schlüssel versiegelt gespeichert.
- Aufrufverlauf, die Anfrage jedes Agenten und Protokoll bleiben standardmäßig 180 Tage erhalten. Ändern Sie das unter „Einstellungen“, „Organisation“, „Protokoll und Aufrufverlauf (Tage)“.
- Eine Browser-Benachrichtigung nennt den Agenten, die Art der Aktion und den Dienst, mit ersetzten IDs im Pfad. Sie enthält nie Argumentwerte, einen Body oder einen Schlüssel.
Neustarts und Abstürze verlieren oder wiederholen keinen Aufruf
- Ein Aufruf, der auf eine Person wartet, liegt in der Datenbank. Ein Deployment verliert ihn nicht, und der Agent macht mit derselben Aufruf-ID weiter.
- Stoppt der Prozess, nachdem eine Anfrage zum Dienst hinausging, wird der Aufruf mit unbekanntem Ausgang markiert. Sallyport wiederholt ihn nie von selbst, also geht eine Zahlung nie doppelt raus.