Sécurité

Falco

Runtime security CNCF pour Kubernetes et conteneurs. Détecte comportements suspects via syscalls et eBPF. Règles YAML, alertes Slack/HTTP/Syslog.

Falco est l'outil de référence pour la sécurité runtime dans Kubernetes et les environnements conteneurisés. Développé initialement par Sysdig et projet CNCF Graduated depuis 2020, il surveille en temps réel les appels système (syscalls) du kernel via un driver eBPF ou un module kernel, et déclenche des alertes lorsqu'un comportement correspond à une règle de sécurité. Falco ne prédit pas les attaques - il détecte ce qui se passe réellement au niveau du système.


Informations essentielles

Origine : Sysdig → CNCF  ·  Licence : Apache 2.0  ·  Architectures : x86_64, ARM64

Liens : Site officiel  ·  Documentation  ·  GitHub  ·  Releases

Support : CNCF Graduated depuis février 2024 (Incubating depuis janvier 2020). Les 2 dernières versions mineures sont maintenues.

Stack par défaut

ComposantValeur
Driver de collecteeBPF (recommandé) ou module kernel
Langage des règlesYAML (conditions + output)
Outputsstdout, syslog, HTTP webhook, gRPC
Intégrations alertesSlack, PagerDuty, Elasticsearch, Falcosidekick
Deployment K8sDaemonSet (falco) + DaemonSet (falco-exporter optionnel)

Concepts clés

ConceptDescription
RuleCondition + message d'alerte (ex: shell dans un conteneur)
MacroCondition réutilisable dans plusieurs règles
ListEnsemble de valeurs référençables (noms d'images, binaires…)
PluginExtension pour des sources d'événements supplémentaires (CloudTrail, K8s audit…)
falcoctlCLI pour gérer les règles et artefacts Falco

Prérequis

RessourceValeur
Kubernetes1.21+
Kernel Linux5.8+ (eBPF moderne) ou 4.15+ (module kernel)
Helm3.x
Droitscluster-admin (le DaemonSet a besoin de privilèges kernel)

Installation

Via Helm (recommandé)

helm repo add falcosecurity https://falcosecurity.github.io/charts
helm repo update

# Installation avec driver eBPF (recommandé sur kernels modernes)
helm install falco falcosecurity/falco \
  --namespace falco --create-namespace \
  --set driver.kind=ebpf \
  --set falcosidekick.enabled=true \
  --set falcosidekick.webui.enabled=true

# Attendre que les pods soient prêts
kubectl rollout status daemonset/falco -n falco

Avec module kernel (fallback pour kernels anciens)

helm install falco falcosecurity/falco \
  --namespace falco --create-namespace \
  --set driver.kind=module

Vérification de l'installation

# 1. Pods Falco (DaemonSet - 1 pod par nœud)
kubectl get pods -n falco -o wide
# Tous les pods doivent être Running (1/1)

# 2. Vérifier que le driver est chargé
kubectl logs -n falco -l app.kubernetes.io/name=falco --tail=20 | grep -E "driver|eBPF|module"
# "eBPF probe loaded" ou "kernel module loaded"

# 3. Vérifier les règles chargées
kubectl logs -n falco -l app.kubernetes.io/name=falco --tail=30 | grep "Loading rules"
# "Loading rules from file /etc/falco/falco_rules.yaml"

# 4. Test de détection - déclencher une alerte connue
kubectl run test-falco --image=ubuntu --restart=Never -- /bin/bash -c "sleep 10"
kubectl exec test-falco -- cat /etc/shadow 2>/dev/null || true
# Falco doit générer une alerte "Read sensitive file" dans les logs

# Voir les alertes
kubectl logs -n falco -l app.kubernetes.io/name=falco --tail=50 | grep WARNING

# 5. Nettoyage
kubectl delete pod test-falco

Pièges courants à l'installation

SymptômeCauseCorrection
Pod Falco en Init:CrashLoopBackOffDriver eBPF non supporté par le kernelPasser en --set driver.kind=module
failed to load moduleHeaders kernel absents sur le nœudInstaller linux-headers-$(uname -r) sur les nœuds
Aucune alerte généréeRègles désactivées ou niveau log trop hautVérifier kubectl logs pour Rules loaded: 0
Trop d'alertes (bruit)Règles par défaut trop largesAjouter des exceptions dans falco_rules.local.yaml

Règles personnalisées

Les règles par défaut couvrent les cas communs. Pour ajouter des règles spécifiques sans modifier les règles officielles :

# falco-custom-rules.yaml (ConfigMap ou values Helm)
customRules:
  custom_rules.yaml: |-
    # Alerte si curl ou wget est exécuté dans un conteneur
    - rule: Outbound Network Tool Launched
      desc: Detect outbound network tools launched in containers
      condition: >
        spawned_process and container
        and proc.name in (curl, wget, nc, ncat, netcat)
      output: >
        Outbound network tool launched in container
        (user=%user.name container=%container.name
         image=%container.image.repository proc=%proc.name)
      priority: WARNING
      tags: [network, container]

    # Liste blanche d'images autorisées à lancer des shells
    - list: allowed_shell_images
      items: [docker.io/alpine, myregistry.io/debug-tools]

    - macro: allowed_shell_spawner
      condition: container.image.repository in (allowed_shell_images)

    # Override de la règle built-in pour exclure les images de la liste
    - rule: Terminal shell in container
      desc: A shell was used as the entrypoint/exec in container
      condition: >
        spawned_process and container and shell_procs
        and proc.tty != 0 and not allowed_shell_spawner
      output: >
        Shell spawned in container (user=%user.name
        container=%container.name shell=%proc.name)
      priority: WARNING
      override:
        condition: append
# Appliquer les règles custom via Helm
helm upgrade falco falcosecurity/falco \
  --namespace falco \
  --reuse-values \
  -f falco-custom-rules.yaml

Outputs et intégrations

Falcosidekick (recommandé)

Falcosidekick est un forwarder d'alertes qui envoie les événements Falco vers des dizaines de destinations :

# Activer Falcosidekick avec Slack
helm upgrade falco falcosecurity/falco \
  --namespace falco \
  --reuse-values \
  --set falcosidekick.enabled=true \
  --set falcosidekick.config.slack.webhookurl="https://hooks.slack.com/services/..."

Webhook HTTP

# Dans falco.yaml ou via Helm values
program_output:
  enabled: true
  keep_alive: false
  program: "curl -d @- -X POST http://my-siem:8080/falco-alerts"

Mise à jour

helm repo update

helm upgrade falco falcosecurity/falco \
  --namespace falco \
  --reuse-values

kubectl rollout status daemonset/falco -n falco

Troubleshooting

# Logs du daemon Falco
kubectl logs -n falco -l app.kubernetes.io/name=falco --tail=100

# Tester une règle manuellement (debug)
kubectl exec -n falco <falco-pod> -- falco --dry-run \
  -r /etc/falco/falco_rules.yaml 2>&1 | head -20

# Voir les alertes en temps réel
kubectl logs -n falco -l app.kubernetes.io/name=falco -f | grep -E "WARNING|ERROR|CRITICAL"

# État du driver eBPF
kubectl exec -n falco <falco-pod> -- ls /sys/fs/bpf/

Driver eBPF non chargé

# Vérifier la version du kernel
uname -r   # Doit être 5.8+ pour l'eBPF moderne

# Forcer la recompilation du module
kubectl delete pod -n falco -l app.kubernetes.io/name=falco
# Les pods redémarrent et tentent de recharger le driver

Commandes utiles

# Lister les règles actives
kubectl exec -n falco <falco-pod> -- falco --list

# Valider un fichier de règles
falco --validate my-rules.yaml

# Voir les alertes en temps réel
kubectl logs -n falco -l app.kubernetes.io/name=falco -f

# Mettre à jour les règles avec falcoctl
falcoctl artifact install falco-rules

# Tester avec un événement synthétique
kubectl exec -n falco <falco-pod> -- falco --dry-run

Ressources

Newsletter · 2 000+ abonnés

Reste au courant de ce qui bouge en prod

RudeOps veille devops hebdo, droit au but.

Gratuit · Sans spam · Désinscription en un clic