Setup wizard
Configuratore di primo avvio basato su browser fornito con l'immagine VM demo. Non fa parte di un'installazione di produzione: gli utenti di produzione scrivono a mano values.yaml ed eseguono helm install autonomamente.
Il compito del wizard è:
- Autenticare l'operatore con un token di setup generato a ogni avvio.
- Raccogliere la configurazione minima necessaria per installare
soctalk-system. - Scrivere
/etc/soctalk/values.yaml,/etc/soctalk/llm.keye un env-file di onboarding del tenant. - Uscire e passare il controllo a
soctalk-firstboot.service, che eseguehelm installe fa l'onboarding di un tenant demo.
Il codice sorgente si trova in setup-wizard/ (Go, ~600 righe).
Come raggiungerlo
Porta :8443 sulla VM. Solo TLS; al primo avvio il wizard genera un certificato ECDSA P-256 autofirmato che copre gli IP locali della VM, localhost e soctalk.local. La porta di bind è :8443 (non :443) per non entrare in conflitto con il Traefik incluso in k3s.
https://<vm-ip>:8443/Token di setup
Al primo avvio il wizard genera un token di setup a 256 bit e lo scrive in /var/log/soctalk-setup-token (modo 0600, di proprietà di root). Recuperalo con:
ssh ops@<vm-ip>
sudo cat /var/log/soctalk-setup-tokenIl token viene ruotato a ogni riavvio del wizard. Non esiste alcuna API per recuperare un token perso senza riavviare l'unità; riavviarla lo ruota e lo ristampa.
Modulo a due fasi
- Autenticazione — incolla il token di setup.
- Configurazione — compila i campi seguenti.
La pagina di inserimento del token invia i dati a POST /auth; la pagina di configurazione invia i dati a POST /submit. Entrambe usano cookie CSRF vincolati tramite HMAC (SameSite=Strict, HttpOnly, Secure).
Fase 1 — Autenticazione

Fase 2 — Configurazione

Identità
| Campo | Tipo | Note |
|---|---|---|
| Nome MSSP / organizzazione | testo, ≤120 caratteri | diventa install.msspName nei valori del chart |
| Hostname | FQDN opzionale, ≤253 caratteri | vuoto → predefinito a soctalk.local; il chart rifiuta gli indirizzi IP su spec.rules[0].host |
| Email admin | diventa il mssp_admin di bootstrap (l'init del chart V1 crea questo ruolo, non platform_admin) | |
| Password admin | password, ≥12 caratteri | scritta nel file dei valori come install.bootstrapAdmin.password. L'init del chart crea l'utente con must_change=false, quindi il primo accesso è immediato |
LLM
| Campo | Tipo | Note |
|---|---|---|
| Provider | select (anthropic, openai) | Solo visualizzazione in questa release. Il wizard raccoglie il valore ma non lo scrive nei valori del chart; si applica il valore predefinito del chart (openai-compatible). Per fissare un provider specifico, modifica /etc/soctalk/values.yaml impostando defaults.llm.provider prima che venga eseguito soctalk-firstboot.service, oppure esegui helm upgrade dopo l'installazione. Il collegamento attraverso il wizard è pianificato per una release futura |
| API key | password | scritta in /etc/soctalk/llm.key (modo 0600) — NON nel file dei valori. L'installer crea da essa un Secret Kubernetes (soctalk-system-llm-api-key) con entrambi i campi dati anthropic-api-key e openai-api-key, così il runtime del chart può usare qualunque provider indicato dai valori |
Onboarding del tenant demo
Il wizard scrive anche /etc/soctalk/onboard.env:
ADMIN_EMAIL='<email>'
ADMIN_PW='<password>'
INGRESS_HOST='<hostname or soctalk.local>'
TENANT_SLUG=demo
TENANT_NAME='<org name> — Demo'soctalk-firstboot.sh lo legge dopo che helm install è andato a buon fine, effettua il login tramite POST /api/auth/login e chiama POST /api/mssp/tenants/onboard con {slug: demo, profile: poc, display_name: <name>}. L'onboarding del tenant è asincrono: l'API restituisce immediatamente 202; il controller di provisioning avvia lo stack Wazuh in background. L'installer di primo avvio non attende che il tenant raggiunga lo stato active prima di uscire.
Cosa scrive il wizard
| Percorso | Modo | Contenuto |
|---|---|---|
/etc/soctalk/values.yaml | 0640 | Valori del chart renderizzati (install.*, ingress.*, postgres.*) |
/etc/soctalk/llm.key | 0600 | API key LLM, singola riga |
/etc/soctalk/onboard.env | 0600 | Env-file di onboarding del tenant demo |
/var/lib/soctalk-wizard.done | 0644 | Sentinella — impedisce che il wizard si riavvii ai boot successivi |
Unità systemd
[Unit]
After=cloud-init.target network-online.target
ConditionPathExists=!/var/lib/soctalk-firstboot.done
ConditionPathExists=!/var/lib/soctalk-wizard.done
ConditionPathExists=!/etc/soctalk/values.yaml
[Install]
WantedBy=cloud-init.targetSi aggancia a cloud-init.target (non a multi-user.target) per evitare un ciclo di ordinamento attraverso After=cloud-final.service. Al user-data di cloud-init è consentito depositare direttamente /etc/soctalk/values.yaml — se lo fa, il wizard non parte mai e soctalk-firstboot.service procede direttamente a helm install.
Hardening
L'unità usa l'hardening standard di systemd: ProtectSystem=strict, ProtectHome=true, PrivateTmp=true, NoNewPrivileges=true, RestrictNamespaces=true, MemoryDenyWriteExecute=true. Le scritture sono confinate a /etc/soctalk, /var/lib e /var/log. Il wizard si lega alla porta privilegiata :8443 tramite AmbientCapabilities=CAP_NET_BIND_SERVICE.
Dopo un invio riuscito, il wizard scrive la sentinella ed esce. Il ConditionPathExists=!sentinel di systemd ne impedisce il riavvio al boot.
Anti-abuso
- Gate del token su ogni endpoint autenticato. Confronto a tempo costante.
- CSRF tramite cookie double-submit vincolati con HMAC su ogni POST che modifica lo stato.
- Rate limit: minimo 30 s tra i tentativi di autenticazione per IP di origine; 10 fallimenti entro un'ora bloccano l'IP per un'ora. (Codex ha segnalato questo come un banale vettore di DoS dietro NAT — gli operatori dietro un NAT condiviso potrebbero vedere bloccato un setup legittimo. Riavvia l'unità per sbloccare.)
- Solo TLS autofirmato. Il wizard non serve mai HTTP in chiaro. I clienti accettano il certificato autofirmato una volta; gli utenti di produzione non dovrebbero mai raggiungere il wizard.
Cosa succede dopo l'invio
Il wizard restituisce {poll: "/status", status: "accepted"} ed esce dopo una finestra di grazia di 3 secondi (così il poller del cliente può recuperare la risposta di successo). Poi:
soctalk-firstboot.servicerileva chevalues.yamlesiste e si avvia.systemctl start k3s(k3s era installato ma non avviato da Packer, così il wizard aveva:8443libera).- Crea il namespace
soctalk-system+ il Secret LLM. helm upgrade --install soctalk-system /opt/soctalk/charts/soctalk-system --values /etc/soctalk/values.yaml --wait --timeout 15m.- Applica una patch alla NetworkPolicy
kube-system → soctalk-systemcosì Traefik può raggiungere i Service di soctalk-system. - Interroga
/api/auth/meattraverso Traefik (trucco dell'header Host) per un massimo di 10 minuti. Sia 200 che 401 significano "Traefik sta instradando"; il loop accetta entrambi. - Effettua il login come admin di bootstrap, chiama
POST /api/mssp/tenants/onboard. - Scrive
/var/lib/soctalk-firstboot.done.
Fai il tail di /var/log/soctalk-firstboot.log (o journalctl -u soctalk-firstboot -f) per osservare l'avanzamento.
Reset / riesecuzione
Per rieseguire il wizard dopo un'installazione riuscita:
sudo rm /var/lib/soctalk-firstboot.done /var/lib/soctalk-wizard.done /etc/soctalk/values.yaml
sudo systemctl restart soctalk-setup-wizardQuesta operazione è distruttiva — il release helm esistente possiede ancora il namespace soctalk-system. Per un reset pulito, esegui prima helm uninstall soctalk-system -n soctalk-system.
