Skip to content

Assistant de configuration

Configurateur de premier démarrage basé sur le navigateur, livré avec l'image de VM de démonstration. Il ne fait pas partie d'une installation de production, les utilisateurs en production rédigent eux-mêmes values.yaml à la main et exécutent helm install.

Le rôle de l'assistant est de :

  1. Authentifier l'opérateur au moyen d'un jeton de configuration propre à chaque démarrage.
  2. Collecter la configuration minimale nécessaire pour installer soctalk-system.
  3. Écrire /etc/soctalk/values.yaml, /etc/soctalk/llm.key et un fichier d'environnement d'intégration de tenant.
  4. Se terminer et passer la main à soctalk-firstboot.service, qui exécute helm install et intègre un tenant de démonstration.

Le code source se trouve dans setup-wizard/ (Go, ~600 lignes).

Comment y accéder

Port :8443 sur la VM. TLS uniquement ; l'assistant génère au premier démarrage un certificat ECDSA P-256 auto-signé couvrant les adresses IP locales de la VM, localhost et soctalk.local. Le port d'écoute est :8443 (et non :443) afin de ne pas entrer en conflit avec le Traefik intégré à k3s.

text
https://<vm-ip>:8443/

Jeton de configuration

L'assistant génère un jeton de configuration de 256 bits au premier démarrage et l'écrit dans /var/log/soctalk-setup-token (mode 0600, propriété de root). Récupérez-le avec :

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

Le jeton est renouvelé à chaque redémarrage de l'assistant. Il n'existe aucune API pour récupérer un jeton perdu sans redémarrer l'unité ; la redémarrer le renouvelle et le réaffiche.

Formulaire en deux étapes

  1. Authentifier: collez le jeton de configuration.
  2. Configurer: remplissez les champs ci-dessous.

La page de saisie du jeton soumet à POST /auth ; la page de configuration soumet à POST /submit. Les deux utilisent des cookies CSRF liés par HMAC (SameSite=Strict, HttpOnly, Secure).

Étape 1, Authentifier

Assistant de configuration, saisie du jeton

Étape 2, Configurer

Assistant de configuration, formulaire de configuration, rempli

Identité

ChampTypeNotes
Nom du MSSP / de l'organisationtexte, ≤120 caractèresdevient install.msspName dans les valeurs du chart
Nom d'hôteFQDN facultatif, ≤253 caractèresvide → prend par défaut soctalk.local ; le chart rejette les adresses IP sur spec.rules[0].host
E-mail de l'administrateure-maildevient le mssp_admin d'amorçage (l'init du chart V1 crée ce rôle, et non platform_admin)
Mot de passe de l'administrateurmot de passe, ≥12 caractèresécrit dans le fichier de valeurs sous install.bootstrapAdmin.password. L'init du chart crée l'utilisateur avec must_change=false, la première connexion est donc immédiate

LLM

ChampTypeNotes
Fournisseurliste déroulante (anthropic, openai)Affiché uniquement dans cette version. L'assistant collecte la valeur mais ne l'écrit pas dans les valeurs du chart ; la valeur par défaut du chart (openai-compatible) s'applique. Pour fixer un fournisseur spécifique, modifiez /etc/soctalk/values.yaml afin de définir defaults.llm.provider avant l'exécution de soctalk-firstboot.service, ou faites un helm upgrade après l'installation. Le câblage à travers l'assistant est prévu pour une version future
Clé APImot de passeécrite dans /etc/soctalk/llm.key (mode 0600), PAS dans le fichier de valeurs. L'installateur en crée un Secret Kubernetes (soctalk-system-llm-api-key) avec les champs de données anthropic-api-key et openai-api-key, afin que le runtime du chart puisse utiliser le fournisseur indiqué par les valeurs

Intégration du tenant de démonstration

L'assistant écrit également /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 lit ce fichier une fois que helm install a réussi, se connecte via POST /api/auth/login et appelle POST /api/mssp/tenants/onboard avec {slug: demo, profile: poc, display_name: <name>}. L'intégration du tenant est asynchrone : l'API renvoie immédiatement 202 ; le contrôleur de provisionnement démarre la pile Wazuh en arrière-plan. L'installateur de premier démarrage n'attend pas que le tenant atteigne l'état active avant de se terminer.

Ce que l'assistant écrit

CheminModeContenu
/etc/soctalk/values.yaml0640Valeurs de chart rendues (install.*, ingress.*, postgres.*)
/etc/soctalk/llm.key0600Clé API LLM, ligne unique
/etc/soctalk/onboard.env0600Fichier d'environnement d'intégration du tenant de démonstration
/var/lib/soctalk-wizard.done0644Sentinelle, empêche l'assistant de se redéclencher aux démarrages suivants

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

Elle s'accroche à cloud-init.target (et non multi-user.target) pour éviter un cycle d'ordonnancement via After=cloud-final.service. Les données utilisateur de cloud-init sont autorisées à déposer directement /etc/soctalk/values.yaml: si c'est le cas, l'assistant ne démarre jamais et soctalk-firstboot.service passe directement à helm install.

Durcissement

L'unité utilise le durcissement standard de systemd : ProtectSystem=strict, ProtectHome=true, PrivateTmp=true, NoNewPrivileges=true, RestrictNamespaces=true, MemoryDenyWriteExecute=true. Les écritures sont confinées à /etc/soctalk, /var/lib et /var/log. L'assistant se lie au port privilégié :8443 via AmbientCapabilities=CAP_NET_BIND_SERVICE.

Après une soumission réussie, l'assistant écrit la sentinelle et se termine. Le ConditionPathExists=!sentinel de systemd l'empêche de redémarrer au boot.

Anti-abus

  • Contrôle du jeton sur chaque endpoint authentifié. Comparaison à temps constant.
  • CSRF via des cookies double-submit liés par HMAC sur chaque POST modifiant l'état.
  • Limitation de débit : 30 s minimum entre les tentatives d'authentification par IP source ; 10 échecs en une heure bloquent l'IP pendant une heure. (Codex a signalé qu'il s'agit d'un vecteur DoS trivial derrière un NAT, les opérateurs derrière un NAT partagé peuvent voir une configuration légitime bloquée. Redémarrez l'unité pour réinitialiser.)
  • TLS auto-signé uniquement. L'assistant ne sert jamais de HTTP en clair. Les clients acceptent le certificat auto-signé une seule fois ; les utilisateurs en production ne devraient jamais atteindre l'assistant.

Ce qui se passe après la soumission

L'assistant renvoie {poll: "/status", status: "accepted"} et se termine après un délai de grâce de 3 secondes (afin que le poller du client puisse récupérer la réponse de succès). Ensuite :

  1. soctalk-firstboot.service remarque que values.yaml existe et démarre.
  2. systemctl start k3s (k3s a été installé mais non démarré par Packer, si bien que l'assistant disposait du port :8443 libre).
  3. Crée l'espace de noms soctalk-system + le Secret LLM.
  4. helm upgrade --install soctalk-system /opt/soctalk/charts/soctalk-system --values /etc/soctalk/values.yaml --wait --timeout 15m.
  5. Applique un correctif à la NetworkPolicy kube-system → soctalk-system pour que Traefik puisse atteindre les Services de soctalk-system.
  6. Interroge /api/auth/me à travers Traefik (astuce de l'en-tête Host) pendant jusqu'à 10 minutes. Un 200 ou un 401 signifient tous deux « Traefik achemine » ; la boucle accepte l'un comme l'autre.
  7. Se connecte en tant qu'administrateur d'amorçage, appelle POST /api/mssp/tenants/onboard.
  8. Écrit /var/lib/soctalk-firstboot.done.

Suivez /var/log/soctalk-firstboot.log (ou journalctl -u soctalk-firstboot -f) pour observer le déroulement.

Réinitialiser / relancer

Pour relancer l'assistant après une installation réussie :

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

C'est une opération destructive, la release helm existante possède toujours l'espace de noms soctalk-system. Pour une réinitialisation propre, faites d'abord helm uninstall soctalk-system -n soctalk-system.

Publié sous la licence Apache 2.0.