Aller au contenu
Conteneurs & Orchestration medium

Falco vs Tetragon : comparés sur le même cluster

12 min de lecture

La différence décisive entre Falco et Tetragon tient en un mot : sur le même événement, Falco alerte, Tetragon bloque. Pour le prouver, les deux ont été déployés sur un même cluster k3d et soumis au même scénario : un processus qui lit /etc/shadow dans un pod. Cette page montre les sorties réelles de chacun, traite l'objection légitime de Falco Talon (qui ajoute la réponse à Falco), ajoute Tracee comme troisième voie, et vous aide à choisir. Cluster de test : k3d (k3s v1.31), Tetragon v1.7.0, Falco 0.44 et Falco Talon v0.3.0 installés par Helm.

  • Voir Falco et Tetragon réagir au même scénario
  • Distinguer alerter et bloquer, preuve à l'appui
  • Comprendre pourquoi Falco + Talon n'égale pas Tetragon (prévention contre réaction)
  • Choisir rapidement selon votre besoin dominant
  • Savoir si les combiner a du sens
Votre besoin dominantL'outil
Empêcher une action interdite dans le noyau, avant qu'elle n'aboutisseTetragon
Détection mature, large écosystème de règles, standard CNCFFalco
Remédier après détection (supprimer, isoler, notifier un pod)Falco + Talon
Détection par signatures comportementales et forensicTracee
Corréler des événements à Kubernetes sans volet sécuritéInspektor Gadget

La suite montre pourquoi, sur le même cluster.

Sur le cluster, un pod nommé victime (une image nginx) exécute la commande interdite :

Fenêtre de terminal
kubectl exec victime -- cat /etc/shadow

Voyons comment chaque outil réagit exactement à cette même action.

Falco compare l'événement à ses règles et émet une alerte. Sortie réelle de ses journaux :

Warning Sensitive file opened for reading by non-trusted program
file=/etc/shadow process=cat command=cat /etc/shadow
container_name=victime container_image=docker.io/library/nginx
k8s_pod_name=victime k8s_ns_name=default

L'alerte est riche et immédiatement exploitable : le fichier, le processus, l'image du conteneur, le pod, l'espace de noms. Mais c'est une alerte : l'action a eu lieu, cat a bien lu /etc/shadow. Falco l'a vu et signalé, il ne l'a pas empêché.

Déployé sur le même cluster, Tetragon voit lui aussi l'exécution, avec le contexte du pod. Sortie réelle de tetra getevents :

process default/victime /usr/bin/cat /etc/shadow
exit default/victime /usr/bin/cat /etc/shadow 0

Jusque-là, c'est la même observation que Falco, sous une autre forme. La différence apparaît quand on demande à Tetragon d'agir.

On applique une TracingPolicy qui associe l'accès à /etc/shadow à l'action Sigkill :

apiVersion: cilium.io/v1alpha1
kind: TracingPolicy
metadata:
name: bloque-shadow
spec:
kprobes:
- call: "security_file_open"
syscall: false
args:
- index: 0
type: "file"
selectors:
- matchArgs:
- index: 0
operator: "Equal"
values:
- "/etc/shadow"
matchActions:
- action: Sigkill

On relance alors exactement la même commande. Résultat réel :

Fenêtre de terminal
kubectl exec victime -- cat /etc/shadow # code retour = 137 (137 = tué par SIGKILL)
kubectl exec victime -- cat /etc/hostname # code retour = 0 (autorisé)

Le processus est tué avant d'avoir lu le fichier (code 137 = SIGKILL), tandis qu'un accès légitime (/etc/hostname) passe sans encombre : la politique est ciblée. Tetragon confirme l'action dans son flux :

process default/victime /usr/bin/cat /etc/shadow
exit default/victime /usr/bin/cat /etc/shadow SIGKILL

Voilà la démonstration : sur le même événement, Falco a écrit une ligne d'alerte, Tetragon a empêché l'accès. C'est toute la différence entre détecter et appliquer.

Et Falco Talon, alors ? Prévention contre réaction

Section intitulée « Et Falco Talon, alors ? Prévention contre réaction »

Une objection légitime : Falco Talon permet à Falco d'agir, pas seulement d'alerter. Au premier abord, Falco + Talon ressemble alors à Tetragon. C'est ici que se joue la vraie distinction, et elle ne tient pas à « agir ou pas » mais à quand et l'action a lieu.

Falco Talon (projet falcosecurity, v0.3.0) est un moteur de réponse. Il reçoit les alertes de Falco, via Falcosidekick en HTTP sur le port 2803, et exécute des actionners au niveau de l'API Kubernetes : kubernetes:terminate (supprimer le pod), kubernetes:label (le marquer comme suspect), et d'autres. On lui fournit une règle qui relie une règle Falco à une action :

- action: Terminate Pod
actionner: kubernetes:terminate
- rule: Reagir sur lecture de fichier sensible
match:
rules:
- Read sensitive file untrusted
actions:
- action: Terminate Pod

Reprenons le même scénario sur le même cluster. On relit /etc/shadow dans le pod victime. Résultat réel, capturé :

# 1. la lecture REUSSIT : le secret a bien ete lu
kubectl exec victime -- cat /etc/shadow -> lecture reussie
# 2. quelques secondes plus tard, le pod a disparu
kubectl get pod victime -> Error from server (NotFound): pods "victime" not found

Le journal de Talon confirme la chaîne complète, de l'événement à l'action :

event "Read sensitive file untrusted" file=/etc/shadow k8s_pod_name=victime
match rule="Reagir sur lecture de fichier sensible"
action "Terminate Pod" actionner=kubernetes:terminate status=success
output="the pod 'victime' in the namespace 'default' has been terminated"

Comparez maintenant avec Tetragon sur exactement le même scénario :

Sur cat /etc/shadowTetragonFalco + Falco Talon
La lecture du fichieréchoue (SIGKILL, code 137)réussit, le secret est lu
Le devenir du processus/podprocessus fautif tué à la sourcepod supprimé ensuite
Couche d'actionnoyau (eBPF), synchroneAPI Kubernetes, asynchrone
Natureprévention (avant l'action)réaction (après l'action)

La nuance est décisive, et elle porte sur le moment de l'intervention. Tetragon empêche : l'appel système est bloqué dans le noyau, la lecture n'a jamais lieu. Falco + Talon remédie : la lecture a eu lieu, le secret doit être considéré comme compromis, mais le pod est supprimé ou isolé en quelques secondes pour couper la suite de l'attaque. La conséquence pratique est nette : après un déclenchement de Falco, la rotation du secret concerné n'est pas optionnelle.

Aucune approche n'est meilleure dans l'absolu. Contre une exfiltration instantanée, seule la prévention protège vraiment. Pour de la remédiation orchestrée (isoler un pod du réseau, le labelliser, notifier, agir sur plusieurs ressources d'un coup), Talon fait ce que Tetragon ne fait pas nativement. Gardez en tête la maturité : l'application in-kernel de Tetragon est éprouvée, tandis que Talon reste un projet jeune (v0.3.0).

Cette expérience éclaire les positionnements. Chaque outil répond à « que se passe-t-il d'anormal ? », mais pas au même endroit du cycle.

Falco : la détection par règles. Falco confronte le flux à un ensemble de règles. C'est la référence historique, un projet CNCF mûr avec une immense bibliothèque de règles communautaires. Il alerte ; la réponse (couper, isoler) se branche en aval.

Tracee : la détection par signatures. Tracee applique des signatures qui reconnaissent des techniques d'attaque (un programme qui détecte qu'on l'analyse, un exécutable déposé puis lancé). Fort ancrage forensic, mais lui aussi détecte et alerte.

Tetragon : l'application dans le noyau. Tetragon observe et applique : la TracingPolicy ci-dessus tue le processus dans le noyau. C'est le seul des trois à empêcher plutôt qu'à seulement signaler.

CritèreFalcoTetragonTracee
ApprocheRèglesObservation + blocageSignatures
Peut bloquer une actionNon (réponse externe)Oui (in-kernel)Non
MoteurRègles en espace utilisateurFiltrage dans le noyauSignatures
Maturité / adoptionTrès élevée (CNCF)Élevée (Cilium)Élevée (Aqua)
Écosystème de règlesLe plus largePolitiques cibléesSignatures fournies
Point fortDétection éprouvéePréventionForensic
KubernetesDaemonSetDaemonSetDaemonSet

Deux points ressortent du lab. Le blocage d'abord : Tetragon agit dans le noyau, avant que l'action n'aboutisse ; Falco et Tracee alertent, et la réponse dépend d'un maillon supplémentaire. L'écosystème ensuite : la force de Falco n'est pas que technique, c'est son corpus de règles prêtes à l'emploi, précieux quand on ne veut pas tout écrire.

  • Empêcher une action (interdire l'accès à un secret, tuer un processus qui dérive) : Tetragon, seul à appliquer dans le noyau. Le blocage se valide d'abord en observation pour ne pas casser un service.
  • Détection robuste et adoptée, un maximum de règles déjà écrites, un standard reconnu : Falco.
  • Investigation et détections orientées techniques d'attaque avec contexte forensic : Tracee.

Le choix dépend de votre posture. Une équipe qui débute gagne à commencer par Falco (détecter, comprendre) avant d'introduire du blocage avec Tetragon.

Oui, et c'est fréquent : détecter largement avec Falco ou Tracee, bloquer dans le noyau les cas précis et à fort risque avec Tetragon, et remédier au niveau orchestration (isoler, notifier) avec Falco + Talon. Trois postures complémentaires : visibilité étendue, prévention ciblée, remédiation automatisée.

  • Falco alerte, Tetragon bloque : démontré sur le même cluster, le même cat /etc/shadow.
  • Falco : détection par règles, mature, standard CNCF, plus grand corpus communautaire.
  • Tetragon : seul à empêcher une action, dans le noyau, via une TracingPolicy (code 137, SIGKILL observé).
  • Falco + Talon remédie, Tetragon prévient : avec Talon, Falco agit, mais après coup (le secret est lu, puis le pod supprimé) ; Tetragon empêche l'action avant qu'elle n'aboutisse.
  • Tracee : détection par signatures et forensic.
  • Combiner détection large et blocage ciblé est cohérent, mais chaque couche a un coût.
  • Choisir selon le besoin dominant, pas empiler par défaut.

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracking. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn