Salta al contenuto
ColliePWA

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 moduloRispondere alla propria domanda tramite Collie
Elencare gli avviatori e inserire fino a quattro pulsanti personalizzati nella barraDigitare nei terminali o mostrare una schermata
Inserire testo, codice e collegamenti https:// in una conversazioneMostrare HTML non elaborato, un'immagine o un collegamento che non sia un indirizzo web
Scegliere il testo delle proprie notifiche push, entro i limiti consentitiInviare 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 permanentecosa viene applicato dal controllo dei discendenti
Bun su LinuxViene 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 macOSNon 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
NodeNon 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.sock

Il 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:

partecosa richiede Collieciò che indica il motivo
Ogni parte del percorso, socket inclusoNon un collegamento simbolico, nemmeno se punta a una destinazione validasocket-not-private: <path> is a symlink
La cartella stessa del socketUna cartella reale, di proprietà dell'utente, con permessi esattamente 0700the 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 superioreUna 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 socketUn socket, di proprietà dell'utente, senza permessi per gruppo o altrithe 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 utenteFallisce in modalità di chiusura sicura: Collie non effettua mai la chiamatathis platform shows no file owner
WindowsÈ disponibile solo il trasporto HTTPS: collie durable attach --socket rifiuta prima di scriverea 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
regolavalore
TokenDa 32 a 4096 byte dopo la rimozione degli spazi, caratteri ASCII stampabili senza spazi
URLhttps://, 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
CertificatoVerificato come da qualsiasi client. Collie non dispone di un'opzione per ignorarlo
ReindirizzamentiCollie 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:

  1. 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.
  2. 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.
  3. 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.

testosoglia
Il titolo di un workspace, di una scheda, di una conversazione o di una domanda256 byte
Un'opzione, un campo o l'etichetta di uno starter128 byte
L'etichetta di un pulsante belt16 caratteri
La motivazione di una domanda2048 byte
L'output della chiamata a uno strumento16384 byte
Il testo di un messaggio o di una risposta65536 byte
Il testo di un elemento markdown o code32768 byte
Testo inviato a un durable agentDa 1 a 32768 byte, rifiutato prima dell'invio
Una risposta da un durable agent16 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:

eventoquandocosa conserva la riga
answerUn tocco ha risposto a una domandaL'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
sendInvio o indirizzamento di testoL'ID richiesta, il turno o la domanda a cui fa riferimento, steer, l'esito e il testo sotto forma di anteprima di 120 caratteri
abortInterruzione di un turnoL'ID richiesta, il turno o la domanda a cui fa riferimento e l'esito
actionTocco di un pulsante della barraL'ID richiesta, l'ID azione, il turno e l'esito
starter.startTocco di uno starterL'ID starter, l'ID richiesta e l'esito
durable.reopenRiapertura di una conversazione chiusaL'ID conversazione
space.renameRidenominazione di un'area di lavoroL'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

The rest of the documentation