0003 — I nodi cTrader CLI sono HTTP + JWT, senza SSH/shell
Contesto
I contenitori di backtest/esecuzione si eseguono su host remoti. L'approccio ovvio — SSH e esegui docker — dà all'app principale un'esecuzione di codice remoto arbitraria e credenziali di lunga durata su ogni nodo. Questo è un raggio di esplosione grande per un sistema che esegue cBot non attendibili dell'utente.
Decisione
Ogni host remoto esegue un agente HTTP standalone CtraderCliNode con niente SSH e niente shell. L'app principale chiama l'agente su HTTP; ogni richiesta porta un JWT HS256 di breve durata (5 minuti, iss=app-main / aud=app-node) firmato con il segreto di quel nodo. L'agente:
- esegue solo immagini corrispondenti a
AllowedImagePrefix(con un confine di percorso in modo cheghcr.io/spotwarenon possa corrispondere aghcr.io/spotware-evil/...); - esegue docker tramite
ArgumentList— mai una stringa di shell; - è stateless, trovando i contenitori per etichetta
app.instance; - si auto-registra e invia heartbeat a
POST /api/nodes/register; l'app principale fa upsert delCtraderCliNodeper nome, quindi un nodo sopravvive ai cambiamenti IP.
Conseguenze
- Un token di richiesta trapelato scade in pochi minuti; non c'è alcuna credenziale di shell permanente da rubare.
- La capacità dell'agente è limitata a "esegui un'immagine consentita" — non può essere trasformata in una shell remota generale.
- L'identità del nodo è basata sul nome, quindi il re-provisioning di un nodo con un nuovo IP non orfanizza la sua cronologia.