08/Documentation
Sicurezza di un agente durevole
Cosa può e non può fare un agente durevole, le regole di attendibilità del socket e del token, come Collie elabora il testo di un agente durevole e cosa conserva il log di audit
Sperimentale. Il protocollo di rete, l'SDK e questa pagina potrebbero cambiare, oppure la funzionalità potrebbe essere rimossa, in una versione minor successiva. Agenti durevoli illustra i criteri in base ai quali viene deciso il mantenimento.
Un durable agent è codice eseguito o distribuito dall'utente, e Collie tratta il suo testo come non attendibile. Questa pagina descrive gli elementi accessibili a un durable agent, le protezioni per impedirne l'accesso ad altri, il trattamento del testo da parte di Collie e i dati conservati nell'audit log. Sicurezza descrive Collie nel suo insieme.
Cosa può e non può fare un durable agent
Un agente permanente formula domande e un dispositivo associato decide. Un agente permanente riceve ciò che viene risposto e inviato, oltre alle richieste sulla rete. Collie non gli concede alcun accesso ai terminali.
| un agente permanente può | un agente permanente non può |
|---|---|
| Porre una domanda: un sì o un no, una scelta, una riga di testo o un breve modulo | Rispondere alla propria domanda tramite Collie |
| Elencare gli avviatori e inserire fino a quattro pulsanti personalizzati nella barra | Digitare nei terminali o mostrare una schermata |
Inserire testo, codice e collegamenti https:// in una conversazione | Mostrare HTML non elaborato, un'immagine o un collegamento che non sia un indirizzo web |
| Scegliere il testo delle proprie notifiche push, entro i limiti consentiti | Inviare più notifiche push di quante consentite dal limite di protezione |
Solo il tocco di una persona risponde a una domanda. La route di risposta è attiva per un dispositivo associato protetto dal gate di scrittura, e nulla nel bridge la richiama per un agente permanente, un hook o l'output di un modello. Sul telefono, Consenti sempre richiede un secondo tocco. Un agente permanente che offre questa opzione dispone dell'autorizzazione più delicata, poiché una singola risposta proveniente da uno strumento ostile consentirebbe ogni chiamata successiva senza alcuna domanda.
L'agente permanente, e non Collie, stabilisce cosa viene eseguito da un'azione approvata. Un pulsante dell'agente permanente viene eseguito con i privilegi dell'agente permanente stesso, e Collie si limita a inviare l'evento del tocco.
Un agente permanente non può intasare la schermata di blocco. Collie decide ogni domanda una sola volta, indicizzata in base all'agente permanente e alla chiamata dello strumento, e invia al massimo una notifica push. Consente 3 notifiche push al minuto per conversazione, 10 al minuto per host e 30 all'ora per host. La notifica che corrisponderebbe alla trentunesima diventa una singola notifica riepilogativa, e l'host non ne invia altre fino a un'ora dopo. Viene sempre mostrata una scheda.
Attenzione. Lo stesso utente può rispondere a una domanda su un socket. Un socket esclude gli altri utenti, non i processi appartenenti al proprio utente, inclusi gli strumenti eseguiti dall'agente. Il controllo dei discendenti è la misura di protezione propria dell'agente permanente, e Collie non è in grado di determinare se un agente permanente la stia eseguendo.
Con il controllo attivo, un agente permanente rifiuta answer, send, abort, action, rename, close, reopen e starter da se stesso, da qualsiasi processo avviato da esso e da un chiamante non distinguibile da essi. Il rifiuto restituisce 403 caller-refused, e le letture rimangono aperte. Il controllo richiede Bun su Linux, dove l'SDK rileva il chiamante di un socket. La tabella indica cosa viene applicato in base a dove viene eseguito l'agente permanente:
| dove viene eseguito l'agente permanente | cosa viene applicato dal controllo dei discendenti |
|---|---|
| Bun su Linux | Viene eseguito per impostazione predefinita. L'SDK rileva il chiamante di ciascuna connessione e rifiuta un'azione proveniente dall'agente permanente, dai suoi discendenti o da un chiamante non identificabile, con 403 caller-refused |
| Bun altrove, ad esempio macOS | Non può essere eseguito. openCollie si arresta all'avvio con un errore, a meno che l'agente permanente non trasmetta callerCheck: "off". Con off, qualsiasi processo del proprio utente può rispondere |
| Node | Non può essere eseguito. L'agente permanente si avvia e genera una singola riga di avviso. Qualsiasi processo del proprio utente può rispondere |
Eseguire gli strumenti dell'agente in una sandbox che non può raggiungere il socket, considerare la scheda come una notifica anziché un gate, oppure eseguire l'agente permanente su Bun. callerCheck: "off" rappresenta la scelta deliberata dell'agente permanente di operare senza il controllo.
Il trasporto via socket
Un socket privato esclude qualsiasi altro utente, e il suo unico controllo di accesso è il percorso.
ls -ld /run/user/1000 /run/user/1000/desk /run/user/1000/desk/app.sockIl socket non trasmette alcun token e nessuna intestazione Authorization. Collie si connette solo quando l'intero percorso è privato, ed esegue questo attraversamento prima di ogni connessione, a partire da / verso il basso, con lstat, evitando così di seguire collegamenti simbolici:
| parte | cosa richiede Collie | ciò che indica il motivo |
|---|---|---|
| Ogni parte del percorso, socket incluso | Non un collegamento simbolico, nemmeno se punta a una destinazione valida | socket-not-private: <path> is a symlink |
| La cartella stessa del socket | Una cartella reale, di proprietà dell'utente, con permessi esattamente 0700 | the socket's folder <path> has mode 0755, not 0700, oppure belongs to user <a>, not to <b>, oppure <path> is not a directory |
| Ogni cartella superiore | Una cartella reale in cui gruppo e altri non possono scrivere. Una cartella con lo sticky bit, come /tmp, è consentita a questo livello, mai come cartella stessa del socket. Il proprietario non viene verificato, poiché un servizio con /tmp privato mostra le cartelle di root come utente 65534 | <path> has mode 0775, so group or others can write to it |
| Il socket | Un socket, di proprietà dell'utente, senza permessi per gruppo o altri | the path is not a socket, the socket belongs to user <a>, not to <b>, the socket has mode 0666, not 0600 |
| Una piattaforma senza ID utente | Fallisce in modalità di chiusura sicura: Collie non effettua mai la chiamata | this platform shows no file owner |
| Windows | È disponibile solo il trasporto HTTPS: collie durable attach --socket rifiuta prima di scrivere | a private socket needs Unix user ids; on Windows use --url <https://...> --token-env VAR |
Un percorso che fallisce è subito irraggiungibile, senza alcuna tolleranza. collie doctor indica lo stesso controllo nella riga durable-socket e fornisce la correzione. Un percorso in cui non è presente nulla restituisce no socket at <path>, che non è una violazione della privacy.
Un durable agent creato con l'SDK crea la cartella del socket con permessi 0700 quando non esiste. Rifiuta l'avvio in una cartella esistente con permessi diversi. Imposta il socket sui permessi 0600 e rimuove un file socket inattivo prima di mettersi in ascolto.
Il trasporto via socket è destinato a Linux e macOS. Windows non dispone del trasporto via socket, pertanto si utilizza il trasporto basato su token.
Il trasporto basato su token
Un URL e un token raggiungono un durable agent su un altro host, e il token funge da unico controllo di accesso.
openssl rand -hex 32| regola | valore |
|---|---|
| Token | Da 32 a 4096 byte dopo la rimozione degli spazi, caratteri ASCII stampabili senza spazi |
| URL | https://, oppure http://127.0.0.1:<port> o http://localhost:<port> per un durable agent su questa macchina. Al massimo 2048 byte. Nessun nome utente, password, query o frammento |
| Certificato | Verificato come da qualsiasi client. Collie non dispone di un'opzione per ignorarlo |
| Reindirizzamenti | Collie non ne segue alcuno, quindi il token non raggiunge mai un altro host |
Chiunque possieda il token agisce come il proprio telefono. Può leggere ogni conversazione, rispondere a ogni domanda, inviare testo, interrompere un turno, rinominare o chiudere ed eseguire uno starter. Una connessione TLS da Internet non ha un chiamante da verificare, quindi il controllo dei processi discendenti qui non esiste. Un durable agent raggiunto in questo modo dovrebbe consentire solo Allow e Deny, mai un'autorizzazione permanente.
L'host vede il testo. La sessione TLS termina sull'host, quindi questo vede ogni richiesta, compreso il token nell'intestazione, e le conversazioni restano archiviate nella sua memoria.
Collie conserva il token in chiaro in due posizioni. sources.json lo memorizza per una voce, e un backup o una sincronizzazione della cartella di configurazione lo include. Collie mantiene quel file con permessi 0600, ne restringe uno più aperto all'avvio con una riga nel log, e collie doctor mostra una riga sources rossa per un file leggibile da gruppo o altri. La variante solo durable agent lo conserva in .env o config.toml, e il file che lo contiene deve avere permessi 0600. Collie non stampa mai il token. collie durable list riporta (token set), collie doctor riporta set, <n> bytes, e nessun errore o riga di log ne mostra il valore. attach lo legge dalla variabile indicata da --token-env, evitando la riga di comando.
Il token non scade. Per ruotarlo, fornire al durable agent il nuovo token prima di riavviare Collie, altrimenti il telefono segnalerà che il durable agent lo ha rifiutato. Un durable agent può accettare un secondo token durante una rotazione: l'esempio Cloudflare impostato accetta COLLIE_TOKEN e, finché è configurato, COLLIE_TOKEN_NEXT (ADR 0103). I passaggi sono descritti in Token.
Si tratta di una chiamata in uscita effettuata da Collie verso l'URL configurato, che viene rifiutata non allegando nulla. Ogni richiesta include Authorization: Bearer <token>, la versione del protocollo, l'ETag dell'ultima lettura e, per un tap, il corpo di quanto risposto o inviato. Una lettura è un GET privo di corpo.
Ogni operazione di polling su HTTPS costituisce una richiesta che l'host potrebbe tariffare, e anche una risposta "non modificato" viene conteggiata. Senza telefoni aperti, il polling di inattività viene eseguito ogni 10 s, quindi Collie effettua 8.640 richieste al giorno, e una ogni 2 s quando un telefono è attivo. Un durable agent non attivo o che rifiuta il token viene interrogato al massimo una volta ogni 10 s, e anche queste richieste vengono tariffate. Usare un piano a pagamento per un durable agent interrogato da Collie per l'intera giornata.
Cosa fa Collie al testo di un durable agent
Collie ripulisce ogni stringa proveniente da un durable agent prima che chiunque altro la legga, e la visualizza come testo.
Un durable agent dovrebbe inviare stringhe che rispettano i limiti massimi. Collie non dà per scontato che sia così. Ogni stringa passa attraverso tre passaggi:
- I caratteri di controllo vengono rimossi. Collie rimuove i caratteri di controllo C0, DEL e C1. I campi multilinea mantengono l'a capo e la tabulazione: il testo di un elemento, l'output e il riepilogo della chiamata a uno strumento, e la motivazione di una domanda.
- I caratteri invisibili e di direzione vengono rimossi. Collie rimuove i marcatori di direzione U+200E, U+200F e U+061C, gli override e gli isolatori da U+202A a U+202E e da U+2066 a U+2069, i caratteri a larghezza zero da U+200B a U+200D, il separatore di parole U+2060, il byte order mark U+FEFF e i caratteri tag da U+E0000 a U+E007F, che possono contenere un'intera frase invisibile.
- La stringa viene tagliata. Collie taglia la stringa al limite massimo di byte in corrispondenza di un carattere intero e la fa terminare con
….
Una domanda il cui titolo o la cui motivazione siano stati modificati durante la pulizia presenta il contrassegno "Testo abbreviato" sulla propria scheda. Un'opzione o un pulsante belt rimasti senza parole vengono scartati, in modo che un pulsante non sia mai vuoto. Un campo rimasto vuoto prende come nome il proprio id.
| testo | soglia |
|---|---|
| Il titolo di un workspace, di una scheda, di una conversazione o di una domanda | 256 byte |
| Un'opzione, un campo o l'etichetta di uno starter | 128 byte |
| L'etichetta di un pulsante belt | 16 caratteri |
| La motivazione di una domanda | 2048 byte |
| L'output della chiamata a uno strumento | 16384 byte |
| Il testo di un messaggio o di una risposta | 65536 byte |
Il testo di un elemento markdown o code | 32768 byte |
| Testo inviato a un durable agent | Da 1 a 32768 byte, rifiutato prima dell'invio |
| Una risposta da un durable agent | 16 KiB per hello, 4 MiB per uno snapshot |
Gli id non vengono mai ripuliti o tagliati. Un id è composto da 1 a 128 byte senza caratteri di controllo, spazi o caratteri tra /, ? e #, pena lo scarto dell'oggetto che lo contiene.
Collie mostra il testo come testo. Un elemento markdown mostra intestazioni, elenchi, enfasi, frammenti di codice e collegamenti, e l'HTML non elaborato non viene mai renderizzato: un tag viene mostrato con i suoi caratteri effettivi. Un collegamento all'interno di un elemento markdown apre solo un indirizzo web. Un elemento link richiede un indirizzo https:// con un host, senza nome utente o password, senza spazi, caratteri di controllo o invisibili e con un massimo di 2048 caratteri. In caso contrario, Collie scarta l'elemento e scrive una riga nel proprio log per ogni conversazione. Le immagini e i file non sono elementi.
Cosa viene registrato nei log
Collie registra ogni scrittura effettuata da un telefono verso un durable agent in <state-dir>/audit.log, modalità 0600.
Ogni riga riporta il nome del durable agent come session, il dispositivo associato e l'evento:
| evento | quando | cosa conserva la riga |
|---|---|---|
answer | Un tocco ha risposto a una domanda | L'ID richiesta, la domanda e la sua revisione, l'ID opzione, o il tipo di risposta (optionIds, text o values), e l'esito. Mai le parole digitate |
send | Invio o indirizzamento di testo | L'ID richiesta, il turno o la domanda a cui fa riferimento, steer, l'esito e il testo sotto forma di anteprima di 120 caratteri |
abort | Interruzione di un turno | L'ID richiesta, il turno o la domanda a cui fa riferimento e l'esito |
action | Tocco di un pulsante della barra | L'ID richiesta, l'ID azione, il turno e l'esito |
starter.start | Tocco di uno starter | L'ID starter, l'ID richiesta e l'esito |
durable.reopen | Riapertura di una conversazione chiusa | L'ID conversazione |
space.rename | Ridenominazione di un'area di lavoro | L'ID spazio e il nuovo nome |
La chiusura e la ridenominazione di una conversazione o di una scheda utilizzano gli eventi consueti, pane.close, pane.rename e tab.rename. COLLIE_AUDIT_CONTENT=none oscura ogni stringa nei dettagli ad eccezione di alcuni campi specifici come l'ID richiesta, pertanto anche l'anteprima di un send viene rimossa. Il log mostra ciò che è accaduto a posteriori. Non blocca alcuna operazione.
Collie conserva inoltre una ricevuta per ogni risposta, invio, interruzione, tocco di un pulsante e starter, senza il testo digitato. Dove Collie conserva i dati di un durable agent indica per quanto tempo.
Modifica questa pagina su GitHub