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 :
- Authentifier l'opérateur au moyen d'un jeton de configuration propre à chaque démarrage.
- Collecter la configuration minimale nécessaire pour installer
soctalk-system. - Écrire
/etc/soctalk/values.yaml,/etc/soctalk/llm.keyet un fichier d'environnement d'intégration de tenant. - Se terminer et passer la main à
soctalk-firstboot.service, qui exécutehelm installet 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.
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 :
ssh ops@<vm-ip>
sudo cat /var/log/soctalk-setup-tokenLe 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
- Authentifier: collez le jeton de configuration.
- 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

Étape 2, Configurer

Identité
| Champ | Type | Notes |
|---|---|---|
| Nom du MSSP / de l'organisation | texte, ≤120 caractères | devient install.msspName dans les valeurs du chart |
| Nom d'hôte | FQDN facultatif, ≤253 caractères | vide → prend par défaut soctalk.local ; le chart rejette les adresses IP sur spec.rules[0].host |
| E-mail de l'administrateur | devient 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'administrateur | mot 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
| Champ | Type | Notes |
|---|---|---|
| Fournisseur | liste 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é API | mot 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 :
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
| Chemin | Mode | Contenu |
|---|---|---|
/etc/soctalk/values.yaml | 0640 | Valeurs de chart rendues (install.*, ingress.*, postgres.*) |
/etc/soctalk/llm.key | 0600 | Clé API LLM, ligne unique |
/etc/soctalk/onboard.env | 0600 | Fichier d'environnement d'intégration du tenant de démonstration |
/var/lib/soctalk-wizard.done | 0644 | Sentinelle, empêche l'assistant de se redéclencher aux démarrages suivants |
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.targetElle 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 :
soctalk-firstboot.serviceremarque quevalues.yamlexiste et démarre.systemctl start k3s(k3s a été installé mais non démarré par Packer, si bien que l'assistant disposait du port:8443libre).- Crée l'espace de noms
soctalk-system+ le Secret LLM. helm upgrade --install soctalk-system /opt/soctalk/charts/soctalk-system --values /etc/soctalk/values.yaml --wait --timeout 15m.- Applique un correctif à la NetworkPolicy
kube-system → soctalk-systempour que Traefik puisse atteindre les Services de soctalk-system. - 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. - Se connecte en tant qu'administrateur d'amorçage, appelle
POST /api/mssp/tenants/onboard. - É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 :
sudo rm /var/lib/soctalk-firstboot.done /var/lib/soctalk-wizard.done /etc/soctalk/values.yaml
sudo systemctl restart soctalk-setup-wizardC'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.
