Skip to content

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

  1. Autenticare l'operatore con un token di setup generato a ogni avvio.
  2. Raccogliere la configurazione minima necessaria per installare soctalk-system.
  3. Scrivere /etc/soctalk/values.yaml, /etc/soctalk/llm.key e un env-file di onboarding del tenant.
  4. Uscire e passare il controllo a soctalk-firstboot.service, che esegue helm install e 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.

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

bash
ssh ops@<vm-ip>
sudo cat /var/log/soctalk-setup-token

Il 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

  1. Autenticazione: incolla il token di setup.
  2. 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

Setup wizard, inserimento del token

Fase 2, Configurazione

Setup wizard, modulo di configurazione, compilato

Identità

CampoTipoNote
Nome MSSP / organizzazionetesto, ≤120 caratteridiventa install.msspName nei valori del chart
HostnameFQDN opzionale, ≤253 caratterivuoto → predefinito a soctalk.local; il chart rifiuta gli indirizzi IP su spec.rules[0].host
Email adminemaildiventa il mssp_admin di bootstrap (l'init del chart V1 crea questo ruolo, non platform_admin)
Password adminpassword, ≥12 caratteriscritta 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

CampoTipoNote
Providerselect (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 keypasswordscritta 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:

text
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

PercorsoModoContenuto
/etc/soctalk/values.yaml0640Valori del chart renderizzati (install.*, ingress.*, postgres.*)
/etc/soctalk/llm.key0600API key LLM, singola riga
/etc/soctalk/onboard.env0600Env-file di onboarding del tenant demo
/var/lib/soctalk-wizard.done0644Sentinella, impedisce che il wizard si riavvii ai boot successivi

Unità systemd

text
[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.target

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

  1. soctalk-firstboot.service rileva che values.yaml esiste e si avvia.
  2. systemctl start k3s (k3s era installato ma non avviato da Packer, così il wizard aveva :8443 libera).
  3. Crea il namespace soctalk-system + il Secret LLM.
  4. helm upgrade --install soctalk-system /opt/soctalk/charts/soctalk-system --values /etc/soctalk/values.yaml --wait --timeout 15m.
  5. Applica una patch alla NetworkPolicy kube-system → soctalk-system così Traefik può raggiungere i Service di soctalk-system.
  6. Interroga /api/auth/me attraverso Traefik (trucco dell'header Host) per un massimo di 10 minuti. Sia 200 che 401 significano "Traefik sta instradando"; il loop accetta entrambi.
  7. Effettua il login come admin di bootstrap, chiama POST /api/mssp/tenants/onboard.
  8. 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:

bash
sudo rm /var/lib/soctalk-firstboot.done /var/lib/soctalk-wizard.done /etc/soctalk/values.yaml
sudo systemctl restart soctalk-setup-wizard

Questa 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.

Rilasciato sotto la Licenza Apache 2.0.