Gateway
Associazione del Node
L'associazione dei Node prevede due livelli, entrambi memorizzati nel record del dispositivo associato nel database di stato SQLite del Gateway:
- Associazione del dispositivo (ruolo
node) controlla l'handshakeconnect. Consultare Approvazione automatica dei dispositivi tramite CIDR attendibili più avanti e Associazione dei canali. - Approvazione delle funzionalità del Node (
node.pair.*) controlla quali funzionalità/comandi dichiarati può esporre un Node connesso. Il Gateway è la fonte autorevole; le interfacce utente (app macOS, interfaccia di controllo) sono frontend che approvano o rifiutano le richieste in sospeso.
Il precedente archivio autonomo per l'associazione dei Node (nodes/paired.json con un token
per Node, ritirato dal percorso di connessione nel gennaio 2026) non esiste più: all'avvio, i Gateway
integrano una sola volta le eventuali righe rimanenti nei record dei dispositivi e archiviano i
file legacy con il suffisso .migrated. Il supporto del bridge TCP legacy è stato
rimosso.
Funzionamento dell'approvazione delle funzionalità
- Un Node si connette al WS del Gateway (l'associazione del dispositivo controlla questo passaggio).
- Il Gateway confronta l'insieme dichiarato di funzionalità/comandi con quello
approvato; gli insiemi nuovi o ampliati memorizzano una richiesta in sospeso nel
record del dispositivo ed emettono
node.pair.requested. - La richiesta viene approvata o rifiutata (tramite CLI o interfaccia utente).
- Fino all'approvazione, i comandi del Node restano filtrati; l'approvazione espone l'insieme dichiarato, nel rispetto dei normali criteri per i comandi.
Le richieste in sospeso scadono automaticamente 5 minuti dopo l'ultimo tentativo del Node: un Node che continua attivamente a riconnettersi mantiene attiva la sua unica richiesta in sospeso, anziché generare una nuova richiesta (e una nuova richiesta di approvazione) a ogni tentativo.
Flusso di lavoro CLI (adatto agli ambienti headless)
openclaw nodes pendingopenclaw nodes approve <requestId>openclaw nodes reject <requestId>openclaw nodes statusopenclaw nodes remove --node <id|name|ip>openclaw nodes rename --node <id|name|ip> --name "Living Room iPad"nodes status mostra i Node associati/connessi e le relative funzionalità.
Superficie API (protocollo del Gateway)
Eventi:
node.pair.requested- emesso quando viene creata una nuova richiesta in sospeso.node.pair.resolved- emesso quando una richiesta viene approvata, rifiutata o scade.
Metodi:
node.pair.list- elenca i Node in sospeso e associati (operator.pairing).node.pair.approve- approva una richiesta in sospeso.node.pair.reject- rifiuta una richiesta in sospeso.node.pair.remove- rimuove un Node associato. Ciò revoca il ruolonodedel dispositivo nell'archivio dei dispositivi associati, elimina contestualmente la superficie approvata del Node e invalida/disconnette le sessioni del ruolo Node di tale dispositivo. Un dispositivo con ruoli misti (ad esempio, uno che possiede ancheoperator) conserva la propria riga e perde soltanto il ruolonode; la riga di un dispositivo esclusivamente Node viene eliminata. Autorizzazione:operator.pairingpuò rimuovere le righe dei Node non operatori; un chiamante con token del dispositivo che revoca il proprio ruolo Node su un dispositivo con ruoli misti necessita inoltre dioperator.admin.node.rename- rinomina il nome visualizzato di un Node associato destinato all'operatore.
Rimossi nella versione 2026.7: node.pair.request e node.pair.verify. Le richieste in sospeso
vengono create dal Gateway stesso durante le connessioni dei Node e il
token autonomo per Node che gestivano non esiste più; l'autenticazione del Node usa il
token di associazione del dispositivo.
Note:
- Le riconnessioni con una superficie invariata riutilizzano la richiesta in sospeso; le richieste ripetute aggiornano i metadati del Node memorizzati e l'ultima istantanea dichiarata dei comandi inclusi nell'elenco consentito, per consentirne la visibilità all'operatore.
- I livelli di ambito dell'operatore e i controlli eseguiti al momento dell'approvazione sono riepilogati in Ambiti dell'operatore.
node.pair.approveusa i comandi dichiarati della richiesta in sospeso per applicare ambiti di approvazione aggiuntivi:- richiesta senza comandi:
operator.pairing - richiesta di comandi ordinari:
operator.pairing+operator.write - richiesta sensibile per l'amministrazione contenente
system.run,system.run.prepare,system.which,browser.proxy,fs.listDirosystem.execApprovals.get/set:operator.pairing+operator.admin
- richiesta senza comandi:
Controllo dei comandi del Node (2026.3.31+)
Quando un Node si connette per la prima volta, l'associazione viene richiesta automaticamente. Finché tale richiesta non viene approvata, tutti i comandi in sospeso provenienti da quel Node vengono filtrati e non saranno eseguiti. Dopo l'approvazione dell'associazione, i comandi dichiarati dal Node diventano disponibili, nel rispetto dei normali criteri per i comandi.
Ciò significa che:
- I Node che in precedenza si affidavano alla sola associazione del dispositivo per esporre i comandi devono ora completare anche l'associazione del Node.
- I comandi accodati prima dell'approvazione dell'associazione vengono eliminati, non differiti.
Limiti di attendibilità degli eventi dei Node (2026.3.31+)
I riepiloghi originati dai Node e i relativi eventi di sessione sono limitati alla superficie attendibile prevista. Potrebbe essere necessario adeguare i flussi basati sulle notifiche o attivati dai Node che in precedenza si affidavano a un accesso più ampio agli strumenti dell'host o della sessione. Questa misura di sicurezza impedisce agli eventi dei Node di ottenere l'accesso agli strumenti a livello di host oltre quanto consentito dal limite di attendibilità del Node.
Gli aggiornamenti persistenti della presenza del Node seguono lo stesso limite di identità: l'evento
node.presence.alive viene accettato soltanto dalle sessioni autenticate dei dispositivi Node
e aggiorna i metadati dell'associazione soltanto quando l'identità del dispositivo/Node è
già associata. Un valore client.id autodichiarato non è sufficiente per scrivere
lo stato dell'ultimo rilevamento.
Approvazione automatica dei dispositivi verificata tramite SSH (impostazione predefinita)
L'associazione iniziale del dispositivo role: node da un indirizzo privato/CGNAT viene
approvata automaticamente quando il Gateway può dimostrare la proprietà della macchina tramite SSH: si
riconnette all'host che richiede l'associazione (BatchMode, StrictHostKeyChecking=yes),
esegue lì openclaw node identity --json e approva soltanto quando l'ID del dispositivo
remoto e la chiave pubblica corrispondono esattamente alla richiesta in sospeso. La corrispondenza della chiave è
ciò che rende sicuro il processo: la sola raggiungibilità non determina mai l'approvazione, quindi gli utenti che condividono lo stesso NAT,
gli altri utenti di un host condiviso e lo spoofing LAN ricadono tutti nella normale
richiesta di conferma.
Abilitata per impostazione predefinita. Requisiti per l'attivazione:
- L'utente del processo Gateway (o
sshVerify.user) può collegarsi tramite SSH all'host del Node senza interazione (chiavi/agente; funziona anche Tailscale SSH) e la chiave dell'host è già attendibile. openclawviene risolto sulPATHremoto persh -lcnon interattivo.- L'IP di connessione è un indirizzo diretto (senza proxy e non loopback) privato, ULA,
link-local o CGNAT, oppure corrisponde a
sshVerify.cidrsquando impostato. - Stessa soglia di idoneità dell'approvazione tramite CIDR attendibili: solo associazioni iniziali dei Node senza ambiti; aggiornamenti, browser, interfaccia di controllo e WebChat richiedono sempre conferma.
Mentre è in corso una verifica, al client Node viene indicato di continuare a riprovare
(wait_then_retry) anziché sospendersi in attesa dell'approvazione manuale; se la verifica
non riesce, il tentativo successivo ricade nel normale flusso di richiesta. Le destinazioni per cui la verifica non riesce
sono soggette a un breve periodo di attesa (5 minuti dopo una mancata corrispondenza della chiave).
I dispositivi approvati registrano approvedVia: "ssh-verified" e la loro prima superficie di
funzionalità dichiarata viene approvata nello stesso passaggio: la corrispondenza della chiave dimostra già
che il Node viene eseguito con l'account dell'operatore su una macchina di sua proprietà, ovvero la
stessa affermazione attestata dall'approvazione manuale delle funzionalità. I successivi ampliamenti della superficie
richiedono comunque conferma.
Per rafforzare la sicurezza o disabilitare:
{ gateway: { nodes: { pairing: { // Disabilita completamente: sshVerify: false, // ...oppure definisce l'ambito/regola la verifica: // sshVerify: { user: "me", identity: "~/.ssh/probe", timeoutMs: 7000, cidrs: ["10.0.0.0/8"] }, }, }, },}Approvazione automatica (app macOS)
L'app macOS può tentare un'approvazione silenziosa delle richieste relative alle funzionalità dei Node quando:
- la richiesta è contrassegnata come
silent(il Gateway contrassegna come silenziosa la prima superficie di funzionalità quando l'associazione del dispositivo è stata approvata senza interazione) e - l'app può verificare una connessione SSH all'host del Gateway usando lo stesso utente.
Se l'approvazione silenziosa non riesce, viene usata la normale richiesta Approve/Reject.
Approvazione automatica dei dispositivi tramite CIDR attendibili
L'associazione dei dispositivi WS per role: node resta manuale per impostazione predefinita. Per le reti private dei Node
in cui il Gateway considera già attendibile il percorso di rete, gli operatori possono abilitarla
specificando CIDR o IP esatti:
{ gateway: { nodes: { pairing: { autoApproveCidrs: ["192.168.1.0/24"], }, }, },}Limite di sicurezza:
- Disabilitata quando
gateway.nodes.pairing.autoApproveCidrsnon è impostato. - Non esiste una modalità generale di approvazione automatica per LAN o reti private; l'approvazione automatica verificata tramite SSH (descritta sopra) richiede una corrispondenza crittografica della chiave del dispositivo, mai la sola vicinanza di rete.
- È idonea soltanto una nuova richiesta di associazione del dispositivo
role: nodesenza ambiti richiesti. - I client operatore, browser, interfaccia di controllo e WebChat restano manuali.
- Gli aggiornamenti di ruolo, ambito, metadati e chiave pubblica restano manuali.
- I percorsi delle intestazioni del proxy attendibile in loopback sullo stesso host non sono idonei, perché tale percorso può essere falsificato dai chiamanti locali.
Pulizia delle associazioni silenziose sostituite
Le approvazioni non interattive registrano la propria provenienza nella riga del dispositivo associato:
le approvazioni tramite criteri locali sullo stesso host come silent, le approvazioni dei Node tramite CIDR attendibili come
trusted-cidr e le approvazioni dei Node verificate tramite SSH come ssh-verified. I client la cui directory di stato è effimera (home temporanee,
container, sandbox per esecuzione) generano una nuova coppia di chiavi del dispositivo a ogni esecuzione e ogni
esecuzione ripete silenziosamente l'associazione come dispositivo completamente nuovo: senza pulizia, l'elenco dei dispositivi associati
aumenta di una riga obsoleta a ogni esecuzione.
Quando il Gateway approva silenziosamente l'associazione di un dispositivo locale, ritira
i record precedenti approvati tramite silent che appartengono allo stesso cluster di client
(con clientId, clientMode e nome visualizzato corrispondenti) e non sono attualmente
connessi. I client locali vengono eseguiti sull'host del Gateway stesso, quindi la chiave del cluster
non può corrispondere a una macchina diversa. I token delle righe ritirate vengono invalidati immediatamente;
ogni voce legacy corrispondente dell'associazione dei Node viene eliminata e viene trasmesso un evento di
rimozione node.pair.resolved.
Limiti:
- Sono idonei, sia come origine sia come destinazione, solo i record la cui approvazione
più recente è avvenuta localmente sullo stesso host (
silent). Gli abbinamenti verificati tramite CIDR attendibile e SSH attraversano host in cui i metadati di visualizzazione non costituiscono un'identità della macchina, pertanto non vengono mai rimossi automaticamente: per questi, utilizzare la pulizia nella UI di controllo oopenclaw nodes remove. - Gli abbinamenti approvati dal proprietario e quelli tramite QR/codice di configurazione (bootstrap) non vengono mai rimossi automaticamente. I record approvati prima che esistesse la provenienza restano protetti, anche dopo una successiva riapprovazione silenziosa dello stesso ID dispositivo.
- I dispositivi attualmente connessi vengono ignorati, quindi le sessioni locali simultanee con directory di stato separate mantengono i propri token finché sono attive. Vengono ignorati anche i record approvati nell'ultimo minuto, così gli handshake di abbinamento simultanei non possono revocarsi a vicenda prima che le rispettive connessioni vengano registrate.
- Per definizione, i client interessati sono locali, quindi si abbinano nuovamente in modo silenzioso alla connessione successiva.
Approvazione automatica degli aggiornamenti dei metadati
Quando un dispositivo già abbinato si riconnette presentando solo modifiche
a metadati non sensibili (ad esempio il nome visualizzato o indicazioni sulla
piattaforma client), OpenClaw considera l'evento un metadata-upgrade.
L'approvazione automatica silenziosa ha un ambito ristretto: si applica solo
alle riconnessioni locali attendibili non provenienti da browser che hanno già
dimostrato il possesso di credenziali locali o condivise, incluse le riconnessioni
di app native sullo stesso host dopo modifiche ai metadati della versione del
sistema operativo. I client browser/UI di controllo e i client remoti continuano
a utilizzare il flusso esplicito di riapprovazione. Gli ampliamenti dell'ambito
(da lettura a scrittura/amministrazione) e le modifiche alla chiave pubblica
non sono idonei all'approvazione automatica degli aggiornamenti dei metadati;
rimangono richieste esplicite di riapprovazione.
Strumenti per l'abbinamento tramite QR
/pair qr restituisce il payload di abbinamento come contenuto multimediale
strutturato, affinché i client mobili e browser possano scansionarlo direttamente.
L'eliminazione di un dispositivo rimuove anche eventuali richieste di abbinamento
in sospeso obsolete per tale ID dispositivo, così nodes pending non mostra
righe orfane dopo una revoca.
Località e intestazioni inoltrate
L'abbinamento del Gateway considera una connessione come loopback solo quando
sia il socket non elaborato sia qualsiasi evidenza del proxy a monte concordano.
Se una richiesta arriva tramite loopback ma contiene evidenze nelle intestazioni
Forwarded, in qualsiasi X-Forwarded-* o in X-Real-IP, tali
evidenze di intestazioni inoltrate invalidano l'asserzione di località loopback
e il percorso di abbinamento richiede un'approvazione esplicita anziché trattare
silenziosamente la richiesta come una connessione dallo stesso host. Consultare
Autenticazione tramite proxy attendibile per la
regola equivalente relativa all'autenticazione dell'operatore.
Archiviazione (locale, privata)
Lo stato dell'abbinamento risiede nei record dei dispositivi abbinati nel database
di stato SQLite condiviso, all'interno della directory di stato del Gateway
(per impostazione predefinita ~/.openclaw):
~/.openclaw/state/openclaw.sqlite(dispositivi abbinati con autenticazione del dispositivo, superfici Node approvate, richieste di superfici in sospeso, richieste di abbinamento di dispositivi in sospeso e token di bootstrap)
Se si sovrascrive OPENCLAW_STATE_DIR, il database viene spostato insieme a essa.
I Gateway aggiornati da versioni con archivi JSON li importano all'avvio e
lasciano gli archivi devices/*.json.migrated e nodes/*.json.migrated.
Note sulla sicurezza:
- I token dei dispositivi sono segreti; il database di stato deve essere trattato come sensibile.
- La rotazione del token di un dispositivo utilizza
openclaw devices rotate/device.token.rotate.
Comportamento del trasporto
- Il trasporto è senza stato; non memorizza l'appartenenza.
- Se il Gateway non è in linea o l'abbinamento è disabilitato, i Node non possono essere abbinati.
- In modalità remota, l'abbinamento avviene nell'archivio del Gateway remoto.