feat: pipeline L7 HTTP complet + infrastructure tests VM
Correctifs pipeline L7 (uprobe SSL_read) :
- uprobe_ssl.c : ssl_set_fd ne retourne plus tôt quand fd_conn_map est
vide (accept4 non disponible en Docker). Sauvegarde ssl_ptr→{fd,0,0}
pour permettre le fallback /proc côté Go.
- main.go : consumeSSLEvents reécrit avec routeur magic-bytes complet :
* HTTP/2 preface → extraction SETTINGS + conversion correlation.HTTP2Settings
* HTTP/1.x requête → method, path, query, headers, header_order_sig
* HTTP/1.x réponse → status_code
* Fallback /proc/<tgid>/fd/<fd> quand src_ip=0 (accept4 absent)
- writer/clickhouse.go : export header_order_signature ajouté
Nouveaux packages :
- internal/parser/http1.go : parseur HTTP/1.x (IsHTTP1Request,
ParseHTTP1Request, IsHTTP1Response, ParseHTTP1Response)
- internal/parser/http1_test.go : 11 tests unitaires (28 total passent)
- internal/procutil/proc_lookup.go : résolution fd→IP via /proc avec cache
TTL 5s (FDCache). Supporte /proc/PID/net/tcp et tcp6, IPv4-mappé IPv6.
Infrastructure tests VM (tests/vm/) :
- Vagrantfile : VM Rocky Linux 9 KVM, 4 CPU / 4 GB RAM
- provision.sh : installation toolchain eBPF + Go + Docker + nginx
- run-tests-vm.sh : suite de test complète dans la VM (L3/L4+TLS+L7)
- README.md : guide d'installation et d'utilisation
- Makefile : cibles vm-up, vm-down, vm-ssh, test-vm-nginx, test-vm-all,
vm-rebuild-ja4ebpf
Corrections stack Docker :
- Dockerfiles nginx/apache/nginx-varnish/hitch-varnish : suppression des
références à shared/go/ja4common/ (répertoire supprimé)
- clickhouse-init.sh : restauré depuis git, seed anubis_ua_rules obsolète
supprimé (table REGEXP_TREE supprimée du schéma)
- traffic-gen : ajout HTTP/1.0 (http.client) et HTTP/2 (httpx)
- verify_db.py : script de vérification 35 checks (L3/L4/TLS/L7/corrélation)
- run-stack-tests.sh : phase 6 verify_db ajoutée
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
115
tests/vm/README.md
Normal file
115
tests/vm/README.md
Normal file
@ -0,0 +1,115 @@
|
||||
# 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
|
||||
```
|
||||
Reference in New Issue
Block a user