# Tests VM — eBPF sur kernel réel (Rocky Linux 9) ## Pourquoi une VM ? Les tests Docker ne peuvent capturer que L3/L4 et TLS (via le hook TC). Les données L7 HTTP (method, path, status_code, header_order_signature) nécessitent : | Fonctionnalité eBPF | Docker | VM | |---|---|---| | Hook TC (XDP) — L3/L4 + TLS | ✅ | ✅ | | Uprobe SSL_read — L7 HTTP | ✅ attache | ✅ attache | | Tracepoint accept4 — corrélation IP | ❌ pas de tracefs | ✅ | | Kprobe accept4 — corrélation IP | ❌ pas de perf PMU | ✅ | Dans une VM, le kernel complet est disponible → **accept4 fonctionne** → la corrélation IP est parfaite → les données L7 arrivent dans ClickHouse. ## Prérequis (installation unique) ```bash # 1. Installer Vagrant + libvirt + KVM sudo apt-get install -y vagrant libvirt-daemon-system libvirt-clients \ qemu-kvm ruby-libvirt bridge-utils # 2. Plugin vagrant-libvirt vagrant plugin install vagrant-libvirt # 3. Ajouter ton user aux groupes (nécessite une reconnexion) sudo usermod -aG libvirt,kvm $USER # → Se déconnecter et se reconnecter # 4. Vérifier que KVM fonctionne virsh list --all ``` ## Utilisation ```bash # Depuis la racine du projet : # Créer la VM (première fois, ~5-10 min — télécharge Rocky Linux 9) make vm-up # Lancer le test nginx complet (L3/L4 + TLS + L7 HTTP) make test-vm-nginx # Après modification des sources Go/C make vm-rebuild-ja4ebpf # synchronise + recompile dans la VM make test-vm-nginx # relancer les tests # Connexion SSH interactive make vm-ssh # Détruire la VM (libère l'espace disque) make vm-down ``` ## Ce que teste `test-vm-nginx` 1. **Build** — recompile ja4ebpf (BPF CO-RE + Go) depuis les sources 2. **ClickHouse** — démarre dans Docker (dans la VM) 3. **nginx** — démarre avec TLS + HTTP/2 4. **ja4ebpf** — démarre avec uprobes + accept4 tracepoints 5. **Trafic** — HTTP/1.0, HTTP/1.1, HTTPS/1.1, HTTPS/2.0 6. **Vérification DB** : - `ip_meta_ttl`, `tcp_meta_mss`, `tcp_meta_window_size` ✅ - `ja4`, `tls_sni` ✅ - **`method`, `path`, `status_code`** ✅ (uniquement en VM) - **`header_order_signature`** ✅ (uniquement en VM) ## Différence avec les tests Docker | Check | Docker | VM | |---|---|---| | L3/L4 (TTL, MSS, window) | ✅ | ✅ | | TLS fingerprint (JA4, SNI) | ✅ | ✅ | | L7 méthode HTTP | ❌ | ✅ | | L7 path HTTP | ❌ | ✅ | | status_code | ❌ | ✅ | | header_order_signature | ❌ | ✅ | ## Architecture de la VM ``` VM Rocky Linux 9 (KVM) ├── nginx + libssl.so.3 ← serveur web cible ├── ja4ebpf ← agent eBPF (natif, pas Docker) │ ├── TC hook (eth0) ← capture L3/L4 + TLS ClientHello │ ├── Uprobe SSL_read ← capture HTTP déchiffré │ └── Tracepoint accept4 ← corrélation fd→IP (disponible !) └── ClickHouse (Docker) ← base de données ``` ## Dépannage **vagrant up échoue : "Call to virConnectOpen failed"** ```bash sudo systemctl start libvirtd sudo usermod -aG libvirt $USER # puis se reconnecter ``` **Erreur "default pool not found"** ```bash sudo virsh pool-define-as default dir --target /var/lib/libvirt/images sudo virsh pool-build default sudo virsh pool-start default sudo virsh pool-autostart default ``` **ja4ebpf : "uprobe SSL_read" ne s'attache pas** ```bash # Vérifier le chemin libssl dans la VM vagrant ssh -- 'ls -la /usr/lib64/libssl*' # Si différent de /usr/lib64/libssl.so.3, modifier /tmp/ja4ebpf.yml ```