L’Invariante
Un token, zero segreti condivisi. Il provisioning porta solo un token bootstrap monouso; la coppia Ed25519 nasce sul device al primo avvio e la privkey non viaggia mai sulla rete.
Il Contratto
| In ingresso | In uscita |
|---|---|
Token di claim bt_* monouso (env AXIOM_BOOTSTRAP_TOKEN) |
edge-credentials.json (0600): tenant_id, node_id, api_key, node_privkey |
AXIOM_SYNC_URL che punta al Control Plane |
un nodo edge sincronizzato e firmato |
La risoluzione dell’identità gira dentro il processo edge stesso — nessun installer separato: prima le variabili d’ambiente, poi le credenziali persistite, poi il claim bootstrap. Riavviare con credenziali esistenti preserva l’identità; rifare il claim con un nuovo bt_* ruota API key e coppia di chiavi del nodo (la vecchia muore all’istante).
Il Flusso
- Token — ops emette un token bootstrap
bt_*dalla console admin (POST /admin/tenants/:id/bootstrap-tokens), con TTL e monouso. - Primo avvio — l’edge legge
AXIOM_BOOTSTRAP_TOKEN+AXIOM_SYNC_URLe genera la coppia Ed25519 sul device. - Claim —
POST /api/v1/bootstrap/claimcontoken+node_pubkey(+hw_metaopzionale per audit) →{ tenant_id, node_id, api_key, scope: "sync" }. - Persistenza — le credenziali finiscono in
edge-credentials.json(0600); il token è speso e non riutilizzabile. - Sync — il nodo inizia a drenare l’outbox, batch firmati, heartbeat a ogni chiamata.
Esempio di Payload
// POST /api/v1/bootstrap/claim — inviato una sola volta, al primo avvio
{ "token": "bt_<48 hex>",
"node_pubkey": "<base64 SPKI DER>", // generata sul device
"hw_meta": { "hostname": "linea-3", "arch": "x86_64",
"mac_hash": "sha256…", "cpu_model": "…" } } // metadati audit self-reported
// → 200 { tenant_id, node_id, api_key, scope: "sync" }
I Fallimenti Noti
| Sintomo | Causa → fix |
|---|---|
Token non valido, scaduto o già utilizzato (403) |
Token consumato/scaduto (TTL) → emetti un nuovo bt_* dalla console admin |
EDGE_CAP_EXCEEDED |
Cap contrattuale sui nodi claimati → alza max_edges o dismetti un nodo |
| Il nodo non sincronizza | AXIOM_SYNC_URL/AXIOM_BOOTSTRAP_TOKEN mancanti e nessuna credenziale persistita — provisiona l’env o copia edge-credentials.json |
EDGE_SIGNATURE_REQUIRED dopo un re-claim |
La nuova pubkey è registrata — le chiamate non firmate sono ora fail-closed; riavvia l’edge perché raccolga la nuova identità |