Direkt zum Inhalt
ColliePWA

08/Documentation

Sicherheit eines persistenten Agenten

Was ein persistenter Agent darf und was nicht, die Vertrauensregeln für Socket und Token, wie Collie Texte eines persistenten Agenten verarbeitet und was das Prüfprotokoll speichert

Experimentell. Das Übertragungsprotokoll, das SDK und diese Seite können sich in einer späteren Minor-Version ändern, oder die Funktion wird entfernt. Persistente Agenten beschreibt, was über den Verbleib entscheidet.

Ein Durable Agent ist Code, den Sie ausführen oder bereitstellen, und Collie behandelt seine Ausgaben als nicht vertrauenswürdigen Text. Diese Seite beschreibt, worauf ein Durable Agent zugreifen kann, was andere von ihm fernhält, wie Collie seinen Text verarbeitet und was das Audit-Protokoll festhält. Sicherheit behandelt Collie als Ganzes.

Was ein Durable Agent tun und nicht tun kann

Ein persistenter Agent fragt an, und ein gekoppeltes Gerät entscheidet. Ein persistenter Agent empfängt Ihre Antworten, Ihre Eingaben und die Anfragen aus dem Netzwerk. Collie gewährt ihm keinen Zugriff auf Ihre Terminals.

ein persistenter Agent darfein persistenter Agent darf nicht
Eine Frage stellen: Ja oder Nein, eine Auswahl, eine Textzeile oder ein kurzes FormularDie eigene Frage über Collie beantworten
Starter auflisten und bis zu vier eigene Schaltflächen in der Leiste platzierenEingaben in Ihre Terminals tippen oder einen Bildschirm anzeigen
Text, Code und https://-Links in eine Konversation einfügenRoh-HTML, ein Bild oder einen Link anzeigen, der keine Webadresse ist
Den Text der eigenen Push-Benachrichtigung innerhalb der Obergrenzen wählenMehr Push-Benachrichtigungen senden, als die Sperre erlaubt

Nur das Tippen einer Person beantwortet eine Frage. Die Antwortroute gilt für ein gekoppeltes Gerät hinter der Schreibschranke; kein Teil der Bridge ruft sie für einen persistenten Agenten, einen Hook oder eine Modellausgabe auf. Auf dem Telefon erfordert Immer erlauben ein zweites Antippen. Ein persistenter Agent, der dies anbietet, besitzt die Berechtigung, die die meiste Sorgfalt erfordert; denn eine einzige Antwort eines schädlichen Werkzeugs würde jeden späteren Aufruf ohne Nachfrage durchlassen.

Der persistente Agent setzt durch, was eine genehmigte Aktion bewirkt, nicht Collie. Eine Schaltfläche des persistenten Agenten wird mit den Rechten des persistenten Agenten ausgeführt; Collie übermittelt lediglich das Antippen.

Ein persistenter Agent kann Ihren Sperrbildschirm nicht überfluten. Collie entscheidet jede Frage einmal, zugeordnet nach dem persistenten Agenten und dem Werkzeugaufruf, und sendet sie höchstens einmal per Push. Er erlaubt 3 Push-Benachrichtigungen pro Konversation und Minute, 10 pro Host und Minute sowie 30 pro Host und Stunde. Eine 31. Push-Benachrichtigung wird zu einer Sammelbenachrichtigung zusammengefasst; der Host sendet danach für eine Stunde keine weiteren mehr. Eine Karte wird immer angezeigt.

Achtung. Derselbe Benutzer kann eine Frage über einen Socket beantworten. Ein Socket schließt andere Benutzer aus, nicht jedoch Prozesse Ihres eigenen Benutzers, einschließlich der vom Agenten ausgeführten Werkzeuge. Die Nachfahrenprüfung ist der eigene Schutz des persistenten Agenten; Collie kann nicht feststellen, ob ein persistenter Agent diese ausführt.

Mit der Prüfung verweigert ein persistenter Agent answer, send, abort, action, rename, close, reopen und starter für sich selbst, für jeden von ihm gestarteten Prozess und für Aufrufer, die er nicht davon unterscheiden kann. Die Verweigerung erfolgt mit 403 caller-refused; Lesezugriffe bleiben offen. Die Prüfung erfordert Bun unter Linux, wo das SDK den Aufrufer eines Sockets liest. Die Tabelle zeigt, was an welchem Ausführungsort des persistenten Agenten durchgesetzt wird:

Ausführungsort des persistenten Agentenwas die Nachfahrenprüfung durchsetzt
Bun unter LinuxWird standardmäßig ausgeführt. Das SDK liest den Aufrufer jeder Verbindung und verweigert Aktionen des persistenten Agenten, seiner Nachfahren oder nicht zuordenbarer Aufrufer mit 403 caller-refused.
Bun auf anderen Systemen, beispielsweise macOSKann nicht ausgeführt werden. openCollie bricht beim Start mit einem Fehler ab, außer der persistente Agent übergibt callerCheck: "off". Mit off kann jeder Prozess Ihres Benutzers antworten.
NodeKann nicht ausgeführt werden. Der persistente Agent startet und gibt eine Warnzeile aus. Jeder Prozess Ihres Benutzers kann antworten.

Isolieren Sie die Werkzeuge des Agenten in einer Sandbox ohne Zugriff auf den Socket, behandeln Sie die Karte als Hinweis statt als Schranke, oder führen Sie den persistenten Agenten unter Bun aus. callerCheck: "off" ist die eigene Entscheidung des persistenten Agenten, ohne die Prüfung zu laufen.

Der Socket-Transport

Ein privater Socket schließt jeden anderen Benutzer aus; seine einzige Schranke ist der Pfad.

ls -ld /run/user/1000 /run/user/1000/desk /run/user/1000/desk/app.sock

Der Socket überträgt kein Token und keinen Authorization-Header. Collie verbindet sich nur, wenn der gesamte Pfad privat ist, und führt vor jedem Verbindungsaufbau diese Prüfung von / abwärts mit lstat durch, folgt also keinen Links:

Teilwas Collie voraussetztWas der Grund besagt
Jeder Teil des Pfads, einschließlich des SocketsKein Symlink, selbst wenn er auf ein gültiges Ziel zeigtsocket-not-private: <path> is a symlink
Der eigene Ordner des SocketsEin echter Ordner, der Ihnen gehört, mit dem genauen Modus 0700the socket's folder <path> has mode 0755, not 0700, belongs to user <a>, not to <b> oder <path> is not a directory
Jeder übergeordnete OrdnerEin echter Ordner, in den Gruppe und Andere nicht schreiben dürfen. Ein Ordner mit gesetztem Sticky-Bit, wie etwa /tmp, ist dort zulässig, jedoch niemals als eigener Ordner des Sockets. Dessen Eigentümer wird nicht geprüft, da ein Dienst mit privatem /tmp die Ordner von root als Benutzer 65534 anzeigt.<path> has mode 0775, so group or others can write to it
Der SocketEin Socket, der Ihnen gehört, ohne Berechtigungen für Gruppe oder Anderethe path is not a socket, the socket belongs to user <a>, not to <b>, the socket has mode 0666, not 0600
Eine Plattform ohne Benutzer-IDsSchlägt sicher fehl: Collie wählt niemalsthis platform shows no file owner
WindowsNur der HTTPS-Transport ist verfügbar: collie durable attach --socket verweigert die Verbindung vor dem Schreibvorganga private socket needs Unix user ids; on Windows use --url <https://...> --token-env VAR

Ein fehlerhafter Pfad ist sofort unerreichbar, ohne Übergangszeit. collie doctor nennt dieselbe Prüfung in der Zeile durable-socket und liefert die Behebung. Ein leerer Pfad liefert no socket at <path>, was keine Datenschutzverletzung darstellt.

Ein mit dem SDK erstellter Durable Agent legt den Ordner des Sockets mit dem Modus 0700 an, falls er fehlt. Er verweigert den Start in einem Ordner, der mit einem abweichenden Modus existiert. Er setzt den Socket auf Modus 0600 und entfernt eine verwaiste Socket-Datei vor dem Verbindungsaufbau.

Der Socket-Transport ist für Linux und macOS gedacht. Windows bietet keinen Socket-Transport; verwenden Sie dort den Token-Transport.

Der Token-Transport

Eine URL und ein Token erreichen einen Durable Agent auf einem anderen Host, und das Token dient als einzige Schranke.

openssl rand -hex 32
RegelWert
Token32 bis 4096 Bytes nach dem Trimmen, druckbares ASCII ohne Leerzeichen
URLhttps://, oder http://127.0.0.1:<port> oder http://localhost:<port> für einen Durable Agent auf dieser Maschine. Maximal 2048 Bytes. Kein Benutzername, Passwort, Query-Teil oder Fragment
ZertifikatWird wie von jedem Client geprüft. Collie besitzt keinen Schalter, um dies zu überspringen
WeiterleitungenCollie folgt keinen Weiterleitungen, damit das Token niemals einen anderen Host erreicht

Jeder, der das Token besitzt, agiert als Ihr Telefon. Diese Person kann jede Unterhaltung lesen, jede Frage beantworten, Text senden, einen Durchlauf anhalten, umbenennen oder schließen und einen Starter ausführen. Eine TLS-Verbindung aus dem Internet hat keinen überprüfbaren Aufrufer; die Nachfahrenprüfung existiert hier daher nicht. Ein auf diesem Weg erreichter Durable Agent sollte nur Erlauben und Verweigern anbieten, niemals ein dauerhaftes Erlauben.

Der Host sieht den Text. TLS endet am Host, daher sieht er jede Anfrage einschließlich des Tokens in der Kopfzeile, und die Unterhaltungen verbleiben in seinem Speicher.

Collie speichert das Token an zwei Stellen im Klartext. sources.json enthält es für einen Eintrag, und eine Datensicherung oder ein Abgleich des Konfigurationsordners überträgt es. Collie hält diese Datei auf Modus 0600, schränkt weiter gefasste Rechte beim Start mit einem Logeintrag ein, und collie doctor zeigt eine rote Zeile sources für Dateien an, die für Gruppe oder Andere lesbar sind. Die reine Durable-Variante speichert es in .env oder config.toml, und eine Datei mit dem Token muss den Modus 0600 aufweisen. Collie gibt das Token niemals aus. collie durable list gibt (token set) aus, collie doctor gibt set, <n> bytes aus, und kein Fehler oder Logeintrag enthält den Wert. attach liest es aus der durch --token-env benannten Variable, sodass es in keiner Befehlszeile erscheint.

Das Token läuft nicht ab. Um es zu erneuern, übergeben Sie dem Durable Agent das neue Token vor dem Neustart von Collie, andernfalls meldet das Telefon die Ablehnung durch den Durable Agent. Ein Durable Agent kann während eines Erneuerungsvorgangs ein zweites Token akzeptieren: Das geparkte Cloudflare-Beispiel akzeptiert COLLIE_TOKEN und, solange gesetzt, COLLIE_TOKEN_NEXT (ADR 0103). Die Schritte stehen in Tokens.

Dies ist ein ausgehender Aufruf, den Collie an die von Ihnen konfigurierte URL sendet. Er wird abgelehnt, indem nichts angehängt wird. Jede Anfrage überträgt Authorization: Bearer <token>, die Protokollversion, das ETag des letzten Lesevorgangs und bei einer Eingabe den Textkörper Ihrer Antwort oder Sendung. Ein Lesevorgang ist ein GET ohne Textkörper.

Jede Abfrage über https ist eine Anfrage, die Ihr Host abrechnen kann, und auch eine Antwort des Typs "keine Änderung" zählt. Ist kein Telefon geöffnet, läuft die Leerlaufabfrage alle 10 s, sodass Collie 8.640 Anfragen pro Tag sendet, und alle 2 s, solange ein Telefon zuschaut. Ein Durable Agent, der offline ist oder das Token ablehnt, wird höchstens alle 10 s abgefragt; auch diese Anfragen werden abgerechnet. Nutzen Sie einen kostenpflichtigen Tarif für einen Durable Agent, den Collie den ganzen Tag abfragt.

Wie Collie den Text eines langlebigen Agenten verarbeitet

Collie bereinigt jede Zeichenkette eines langlebigen Agenten, bevor etwas anderes sie liest, und stellt sie als Text dar.

Ein langlebiger Agent sollte Zeichenketten innerhalb der Obergrenzen senden. Collie verlässt sich nicht darauf. Jede Zeichenkette durchläuft drei Schritte:

  1. Steuerzeichen werden entfernt. Collie entfernt C0-Steuerzeichen, DEL und C1-Steuerzeichen. Felder mit mehreren Zeilen behalten Zeilenumbruch und Tabulator: der Text eines Eintrags, die Ausgabe und Zusammenfassung eines Werkzeugaufrufs sowie die Begründung einer Frage.
  2. Unsichtbare Zeichen und Richtungszeichen werden entfernt. Collie entfernt die Richtungszeichen U+200E, U+200F und U+061C, die Überschreibungen und Isolate U+202A bis U+202E und U+2066 bis U+2069, die Nullbreiten-Zeichen U+200B bis U+200D, den Wortverbinder U+2060, die Bytereihenfolge-Markierung U+FEFF und die Tag-Zeichen U+E0000 bis U+E007F, die einen ganzen unsichtbaren Satz enthalten können.
  3. Die Zeichenkette wird gekürzt. Collie kürzt die Zeichenkette an einem vollständigen Zeichen auf ihre Byte-Obergrenze und schließt sie mit … ab.

Eine Frage, deren Titel oder Begründung bei der Bereinigung geändert wurde, trägt den Hinweis „Text gekürzt“ auf ihrer Karte. Eine Option oder eine Leistenschaltfläche ohne verbleibende Wörter wird verworfen, damit eine Schaltfläche nie leer ist. Ein Feld ohne Inhalt wird nach seiner ID benannt.

TextObergrenze
Titel eines Arbeitsbereichs, eines Reiters, einer Unterhaltung oder einer Frage256 Byte
Eine Option, ein Feld oder eine Startbeschriftung128 Byte
Beschriftung einer Leistenschaltfläche16 Zeichen
Begründung einer Frage2048 Byte
Ausgabe eines Werkzeugaufrufs16384 Byte
Text einer Nachricht oder einer Antwort65536 Byte
Text eines markdown- oder code-Eintrags32768 Byte
Text, den Sie an einen langlebigen Agenten senden1 bis 32768 Byte, wird vor dem Absenden abgewiesen
Eine Antwort eines langlebigen Agenten16 KiB für hello, 4 MiB für einen Schnappschuss

IDs werden nie bereinigt oder gekürzt. Eine ID umfasst 1 bis 128 Byte ohne Steuerzeichen, ohne Leerraum und ohne /, ? oder #; andernfalls wird das zugehörige Objekt verworfen.

Collie stellt den Text als Text dar. Ein markdown-Element zeigt Überschriften, Listen, Hervorhebungen, Code-Spans und Links; rohes HTML wird nie gerendert: Ein Tag wird als seine eigenen Zeichen angezeigt. Ein Link in einem markdown-Element öffnet ausschließlich eine Webadresse. Ein link-Element erfordert eine https://-Adresse mit Host, ohne Benutzername oder Passwort, ohne Leerzeichen, Steuerzeichen oder unsichtbare Zeichen und mit maximal 2048 Zeichen. Andernfalls verwirft Collie das Element und schreibt für jede Konversation eine Zeile in sein Protokoll. Bilder und Dateien sind keine Elemente.

Was protokolliert wird

Collie schreibt jeden Schreibvorgang, den ein Smartphone an einem Durable Agent ausführt, in <state-dir>/audit.log, Modus 0600.

Jede Zeile enthält den Namen des Durable Agents als session, das gekoppelte Gerät und das Ereignis:

EreigniswennWas die Zeile enthält
answerEin Tippen hat eine Frage beantwortetDie Request-ID, die Frage und ihre Revision, die Options-ID oder die Art der Antwort (optionIds, text oder values) und das Ergebnis. Niemals die von Ihnen eingegebenen Wörter
sendSie haben Text gesendet oder gesteuertDie Request-ID, der benannte Turn oder die benannte Frage, steer, das Ergebnis und der Text als Vorschau von 120 Zeichen
abortSie haben einen Turn gestopptDie Request-ID, der benannte Turn oder die benannte Frage und das Ergebnis
actionSie haben eine Leistenschaltfläche angetipptDie Request-ID, die Aktions-ID, der Turn und das Ergebnis
starter.startSie haben einen Starter angetipptDie Starter-ID, die Request-ID und das Ergebnis
durable.reopenSie haben eine geschlossene Konversation wieder geöffnetDie Konversations-ID
space.renameSie haben einen Arbeitsbereich umbenanntDie Space-ID und der neue Name

Das Schließen und Umbenennen einer Konversation oder eines Tabs verwendet die üblichen Ereignisse pane.close, pane.rename und tab.rename. COLLIE_AUDIT_CONTENT=none schwärzt jede Zeichenkette im Detail mit Ausnahme weniger benannter Felder wie der Request-ID, sodass die Vorschau eines send ebenfalls entfernt wird. Das Protokoll zeigt nachträglich, was passiert ist. Es blockiert nichts.

Collie behält außerdem für jede Antwort, jedes Senden, jedes Stoppen, jedes Antippen von Schaltflächen und jeden Starter einen Beleg ohne eingegebenen Text. Wo Collie die Daten eines Durable Agents speichert gibt an, wie lange.

Diese Seite auf GitHub bearbeiten

The rest of the documentation