Aller au contenu
English
Conteneurs & Orchestration medium

Falco - Détection des menaces runtime dans Kubernetes

70 min de lecture

Falco est l'outil de référence pour détecter les comportements anormaux dans vos conteneurs Kubernetes en temps réel. Projet CNCF Graduated depuis février 2024, il surveille les appels système (syscalls) et les événements d'audit Kubernetes pour identifier les menaces : shell spawné dans un conteneur, lecture de fichiers sensibles, connexions réseau suspectes. Ce guide vous montre comment déployer Falco, comprendre ses règles de détection, et créer vos propres alertes personnalisées.

Falco est explicitement cité dans le programme CKS, au domaine Monitoring, Logging and Runtime Security. Savoir le déployer et personnaliser ses règles fait donc partie des attendus de l'examen, ce qui n'est pas le cas de tous les outils de ce module.

  • Cluster Kubernetes Linux fonctionnel
  • Nœuds compatibles avec le mode de capture choisi (Modern eBPF, kernel module…)
  • Helm v3 installé
  • kubectl configuré avec accès cluster-admin
  • Bases en sécurité Linux (syscalls, capabilities)

Falco détecte les comportements suspects au niveau du runtime en analysant deux sources d'événements :

SourceDescriptionExemples de détection
Syscalls kernelAppels système des conteneurs via eBPF ou module kernelShell spawné, fichier sensible lu, binaire modifié
Audit Events K8sÉvénements de l'API Server KubernetesPod créé en mode privileged, exec dans un pod, secrets accédés

Le schéma suit le trajet d'un événement à l'intérieur d'un nœud : la source capture le syscall, le moteur de règles l'évalue, puis les outputs émettent une alerte si une condition correspond. Aucun composant central n'est nécessaire, tout se joue sur le nœud lui-même.

Architecture de Falco sur un nœud Kubernetes : les appels système des conteneurs sont capturés par la source eBPF, évalués par le moteur de règles, puis transformés en alertes par les sorties

Falco fonctionne comme un DaemonSet : un pod par nœud qui capture les événements de tous les conteneurs.

Sources d'événements :

  • Kernel : syscalls capturés via Modern eBPF, eBPF legacy ou module kernel
  • Plugins : événements Kubernetes Audit, CloudTrail, etc.

Une mise au point utile avant d'aller plus loin, parce que Falco est souvent présenté comme une solution de sécurité à lui seul. Falco détecte des comportements pendant l'exécution, et c'est tout. Il ne remplace ni un scanner de vulnérabilités d'images, rôle de Trivy, ni un audit de configuration du cluster, rôle de kube-bench, ni une politique d'admission, rôle des Pod Security Standards. Ces quatre outils couvrent quatre moments différents, et aucun ne rattrape ce qu'un autre a laissé passer.

Le chart officiel falcosecurity/falco installe le DaemonSet, les règles par défaut et, en option, le routeur d'alertes. Deux paramètres décident du résultat : driver.kind, qui choisit le mécanisme de capture des appels système, et tty, sans lequel aucune alerte n'apparaît dans les journaux. Se tromper sur ces deux points donne un Falco qui tourne sans rien remonter : c'est le piège le plus courant.

Ces trois étapes suffisent à obtenir un Falco fonctionnel qui écrit ses alertes au format JSON sur la sortie standard.

  1. Ajouter le dépôt Helm Falco

    Fenêtre de terminal
    helm repo add falcosecurity https://falcosecurity.github.io/charts
    helm repo update
  2. Installer Falco avec détection automatique du driver

    Fenêtre de terminal
    helm install falco falcosecurity/falco \
    --namespace falco \
    --create-namespace \
    --set driver.kind=auto \
    --set tty=true \
    --set falco.json_output=true \
    --set falco.json_include_output_property=true

    Le paramètre tty=true force la sortie de Falco en mode ligne par ligne au lieu du tampon par blocs qu'un processus sans terminal utilise par défaut. Sur un cluster peu bavard, cela évite d'attendre que le tampon se remplisse pour voir une alerte.

    Ce n'est pas une condition pour voir les alertes. Vérifié sur Falco 0.44.1 : sans ce réglage, une alerte déclenchée apparaît dans kubectl logs en environ trois secondes, exactement comme avec. Si vous ne voyez rien, cherchez ailleurs, du côté de la sonde ou de la règle, pas de ce paramètre.

    Le chart recommande driver.kind=auto, et c'est le bon réglage par défaut : il privilégie la sonde eBPF moderne quand le noyau la permet, à partir de la version 5.8, et bascule sinon vers les mécanismes plus anciens, eBPF historique ou module noyau.

  3. Vérifier le déploiement

    Fenêtre de terminal
    kubectl get pods -n falco
    kubectl logs -n falco -l app.kubernetes.io/name=falco --tail=20

    Résultat attendu :

    NAME READY STATUS RESTARTS AGE
    falco-xxxxx 2/2 Running 0 2m

Ces valeurs se passent en --set sur la ligne de commande ou dans un fichier values.yaml. Les deux premières lignes sont les seules réellement indispensables à un déploiement exploitable ; les suivantes dépendent du contexte, en particulier le choix explicite du driver quand auto échoue.

OptionValeurDescription
ttytrueObligatoire, active la sortie des alertes sur stdout
driver.kindautoRecommandé, sélection automatique du meilleur driver
driver.kindmodern_ebpfModern eBPF probe (noyau 5.8+, intégré au binaire)
driver.kindebpfeBPF legacy (historique, cas spécifiques)
driver.kindkmodModule kernel (compatibilité, nécessite headers)
falco.json_outputtrueSortie JSON structurée (recommandé pour parsing)
falco.grpc.enabledtrue/falseActive l'API gRPC pour intégrations externes
falcosidekick.enabledtrueDéploie Falcosidekick pour router les alertes
falco.rules_fileListe de fichiersFichiers de règles à charger

Entre les trois mécanismes de capture, la sonde eBPF moderne est la cible à viser : elle est intégrée au binaire Falco, ce qui supprime toute la complexité des drivers externes à compiler et à maintenir au rythme des mises à jour du noyau. Si votre noyau est en 5.8 ou plus récent, il n'y a pas de raison de choisir autre chose.

Les règles Falco sont écrites en YAML avec trois composants principaux :

Une règle Falco s'appuie sur trois briques déclarées dans le même fichier. Les listes regroupent des valeurs, les macros nomment des conditions réutilisables, et la règle combine le tout avec un message de sortie et une priorité. L'exemple ci-dessous présente les trois dans l'ordre où le moteur les résout : une règle ne peut référencer qu'une macro ou une liste déjà définie.

# 1. Listes : ensembles de valeurs réutilisables
- list: sensitive_files
items: [/etc/shadow, /etc/passwd, /etc/sudoers]
# 2. Macros : conditions réutilisables
- macro: container
condition: container.id != host
- macro: open_read
condition: evt.type in (open, openat) and evt.is_open_read=true
# 3. Règles : logique de détection complète
- rule: Read sensitive file in container
desc: Detect reading of sensitive files inside containers
condition: open_read and container and fd.name in (sensitive_files)
output: >
Sensitive file read in container
(file=%fd.name user=%user.name container=%container.name
image=%container.image.repository)
priority: WARNING
tags: [filesystem, cks]

Le champ priority ne change rien à la détection elle-même : il sert au filtrage en aval, typiquement pour décider ce qui déclenche une astreinte. Les niveaux EMERGENCY et DEBUG restent marginaux dans les règles livrées.

PrioritéUsageExemple
EMERGENCYSystème inutilisable-
ALERTAction immédiate requiseMalware détecté
CRITICALConditions critiquesConteneur privileged créé
ERRORErreurs importantesÉchec d'authentification répété
WARNINGComportement suspectLecture /etc/shadow
NOTICEÉvénement normal mais notableShell spawné (peut être légitime)
INFOInformationNouveau conteneur démarré
DEBUGDebug-

Écrire une condition de détection suppose de connaître les champs que Falco expose. Ils donnent accès, au moment où l'événement est évalué, aux informations sur le processus, le conteneur, le fichier, le réseau et l'utilisateur.

# Processus
proc.name # Nom du processus (bash, python)
proc.pname # Nom du processus parent
proc.cmdline # Ligne de commande complète
# Conteneur
container.id # ID du conteneur
container.name # Nom du conteneur
container.image.repository # Image sans tag
# Fichiers
fd.name # Chemin du fichier
fd.directory # Répertoire parent
# Réseau
fd.sip # IP source
fd.sport # Port source
fd.dip # IP destination
fd.dport # Port destination
# Utilisateur
user.name # Nom utilisateur
user.uid # UID

Falco inclut plus de 100 règles de détection. Les plus importantes pour la CKS :

Vérifier quelle sonde Falco a réellement choisie

Section intitulée « Vérifier quelle sonde Falco a réellement choisie »

C'est la première chose à lire après l'installation, et elle tient en une ligne des journaux :

Fenêtre de terminal
kubectl -n falco logs ds/falco | grep -i probe
Sortie
Opening 'syscall' source with modern BPF probe.
Loaded event sources: syscall

modern BPF probe est ce qu'il faut voir : la sonde est intégrée au binaire, sans module noyau à compiler ni à maintenir. Sur un noyau Linux 6.8, avec le BTF disponible, driver.kind=auto la retient sans configuration supplémentaire. L'installation du chart prend une cinquantaine de secondes et déploie un DaemonSet, donc un Pod par nœud.

La règle Terminal shell in container, fournie par défaut, se déclenche dès qu'un processus shell obtient un terminal à l'intérieur d'un conteneur.

Fenêtre de terminal
# Observer les alertes en temps réel
kubectl logs -n falco -l app.kubernetes.io/name=falco -f | grep -i shell

Tester la détection :

Fenêtre de terminal
# Dans un autre terminal, spawner un shell
kubectl run test-shell --image=nginx:1.28@sha256:146adea4768b83c607d0bdfa4188464e3da6e0a3ad4475db1d1d8f64f27c29cc --rm -it -- /bin/bash

Le -it n'est pas un confort d'affichage, il conditionne la détection. Vérifié en lab : un kubectl exec sans terminal exécute bien un shell dans le conteneur et ne déclenche pas cette règle, alors que la règle sur les fichiers sensibles, elle, se déclenche normalement au même moment. La règle s'appelle « Terminal shell », et elle prend ce mot au sérieux.

Conséquence à retenir pour la détection réelle : un attaquant qui exécute des commandes sans allouer de terminal passe sous cette règle. Elle couvre l'intrusion interactive, pas l'exécution de commandes.

Alerte générée :

{
"output": "Notice A shell was spawned in a container (user=root container=test-shell shell=bash)",
"priority": "Notice",
"rule": "Terminal shell in container"
}

La règle Read sensitive file untrusted surveille les lectures de fichiers comme /etc/shadow ou /etc/sudoers, regroupés dans la macro sensitive_files. Un conteneur applicatif n'a aucune raison de les ouvrir : une alerte ici signale soit une reconnaissance après compromission, soit un outil mal placé dans l'image.

Cette règle est aussi celle qui produit le plus de faux positifs, parce que certains agents légitimes lisent ces fichiers. Le réflexe est alors d'allonger la liste known_sensitive_file_readers, jamais de désactiver la règle : vous gardez la détection et vous documentez au passage ce qui est autorisé à lire quoi.

- rule: Read sensitive file untrusted
desc: Detect reads of sensitive files by non-trusted programs
condition: >
sensitive_files and open_read
and proc_name_exists
and not proc.name in (known_sensitive_file_readers)
output: >
Sensitive file opened (file=%fd.name proc=%proc.name
container=%container.name)
priority: WARNING

La macro write couvre les appels système d'écriture. Associée à fd.name startswith /etc, elle repère les modifications de configuration système dans un conteneur, qui n'ont aucune raison d'exister sur une image immuable.

- rule: Write below etc
desc: Detect writes beneath /etc directory
condition: >
write and container
and fd.name startswith /etc
output: >
File below /etc written (file=%fd.name container=%container.name)
priority: ERROR

Les règles fournies couvrent des comportements génériques, pas votre contexte : registres autorisés, noms de processus internes, namespaces de recette. Vos propres règles vivent donc dans un fichier séparé, chargé en plus des règles par défaut. Cette séparation évite de modifier des fichiers que la prochaine mise à jour du chart écraserait.

La clé customRules du chart crée une ConfigMap montée dans le Pod Falco : chaque entrée y devient un fichier de règles, chargé au démarrage.

  1. Créer un fichier de règles personnalisées

    custom-rules.yaml
    customRules:
    custom-rules.yaml: |-
    - list: allowed_images
    items: [myregistry.io/app, myregistry.io/api]
    - rule: Container from unauthorized image
    desc: Detect containers from non-approved images
    condition: >
    container and evt.type=container
    and not container.image.repository in (allowed_images)
    output: >
    Unauthorized image used
    (image=%container.image.repository container=%container.name
    namespace=%k8s.ns.name)
    priority: WARNING
    tags: [container, compliance]
    - rule: Crypto mining detection
    desc: Detect potential crypto mining activity
    condition: >
    container and spawned_process
    and (proc.name in (xmrig, minerd, minergate, cpuminer)
    or proc.cmdline contains "stratum+tcp://")
    output: >
    Crypto mining suspected
    (proc=%proc.name cmdline=%proc.cmdline container=%container.name)
    priority: CRITICAL
    tags: [cryptomining, malware]
  2. Déployer avec Helm

    Fenêtre de terminal
    helm upgrade falco falcosecurity/falco \
    --namespace falco \
    --reuse-values \
    -f custom-rules.yaml
  3. Vérifier le chargement

    Fenêtre de terminal
    kubectl logs -n falco -l app.kubernetes.io/name=falco | grep -i "custom-rules"

Pour désactiver une règle bruyante sans modifier les fichiers originaux :

customRules:
custom-rules.yaml: |-
- rule: Terminal shell in container
enabled: false

Ou remplacer la condition pour un namespace spécifique :

customRules:
custom-rules.yaml: |-
- rule: Terminal shell in container
condition: >
spawned_process and container
and shell_procs and proc.tty != 0
and not k8s.ns.name in (debug-namespace, dev)

Détecter ne sert à rien si personne ne voit l'alerte. Falco sait alimenter plusieurs canaux simultanément : la sortie standard, un fichier sur le nœud et un appel HTTP. Activez json_output dès que les alertes sont consommées par un autre outil, car le format texte par défaut n'est pas structuré et se parse mal.

Falco peut envoyer les alertes vers plusieurs destinations :

# values.yaml pour Helm
falco:
json_output: true
stdout_output:
enabled: true
file_output:
enabled: true
filename: /var/log/falco/alerts.log
http_output:
enabled: true
url: http://alertmanager:9093/api/v1/alerts

Falcosidekick se déploie avec le même chart et prend en charge la diffusion vers les outils d'alerte, ce qui évite d'écrire et d'exploiter un récepteur HTTP maison.

En production, ne laissez pas les alertes dans kubectl logs : ajoutez Falcosidekick, un routeur qui les distribue vers plus de cinquante destinations, Slack, PagerDuty, Elasticsearch ou Prometheus selon votre chaîne d'alerte existante. Une détection que personne ne lit ne sert à rien.

Fenêtre de terminal
helm upgrade falco falcosecurity/falco \
--namespace falco \
--reuse-values \
--set falcosidekick.enabled=true \
--set falcosidekick.config.slack.webhookurl="https://hooks.slack.com/xxx"

Vérifier Falcosidekick :

Fenêtre de terminal
kubectl get pods -n falco -l app.kubernetes.io/name=falcosidekick
kubectl logs -n falco -l app.kubernetes.io/name=falcosidekick

Falco peut consommer les événements d'audit Kubernetes via des plugins dédiés. Cette intégration est distincte de la capture des syscalls kernel et dépend de votre plateforme.

Ne confondez pas les deux sources d'événements, c'est la confusion la plus coûteuse sur ce sujet. Le DaemonSet Falco capture les appels système du noyau, donc ce qui se passe dans les conteneurs. Les journaux d'audit Kubernetes, eux, décrivent les actions sur l'API, et leur consommation demande une configuration séparée, par plugin. Chercher une action kubectl dans les alertes du DaemonSet ne donnera jamais rien.

Ces deux sources ne se recouvrent pas : la première observe ce qui se passe dans les conteneurs, la seconde ce qui est demandé à l'API Server. Une commande comme kubectl exec apparaît dans les deux, sous deux angles différents.

SourceCaptureExemples
Kernel (syscalls)DaemonSet Falco sur chaque nœudShell spawné, fichier lu, connexion réseau
K8s Audit (plugin)Webhook depuis l'API ServerPod créé, secret accédé, RBAC modifié

Pour les clusters autogérés, configurez l'API Server pour envoyer les événements d'audit vers Falco :

# values.yaml pour Helm
falco:
plugins:
- name: k8saudit
library_path: libk8saudit.so
init_config: ""
open_params: "http://:9765/k8s-audit"
load_plugins: [k8saudit]

Sur un cluster managé, les journaux d'audit ne sont pas à votre main : ils arrivent dans CloudWatch, Stackdriver ou Azure Monitor selon le fournisseur. Falco sait les consommer par des plugins dédiés, k8saudit-eks par exemple. La documentation Falco détaille le plugin correspondant à votre plateforme.

Ces règles portent source: k8s_audit et utilisent les champs préfixés ka., propres au plugin d'audit : elles ne se déclenchent jamais tant que le plugin n'est pas chargé.

# Exemples de règles d'audit Kubernetes
- rule: K8s Secret Get Attempted
desc: Detect attempts to get secrets
condition: >
ka.verb in (get, list) and ka.target.resource=secrets
output: >
Secret access attempted
(user=%ka.user.name secret=%ka.target.name ns=%ka.target.namespace)
priority: WARNING
source: k8s_audit
- rule: Create Privileged Pod
desc: Detect creation of privileged pods
condition: >
ka.verb=create and ka.target.resource=pods
and ka.req.pod.containers.privileged=true
output: >
Privileged pod created (user=%ka.user.name pod=%ka.target.name)
priority: CRITICAL
source: k8s_audit

Après l'installation, vérifiez la chaîne complète, de la capture jusqu'à l'affichage de l'alerte. Le plus rapide consiste à provoquer volontairement un comportement couvert par les règles par défaut, puis à observer la sortie du DaemonSet.

Ces trois commandes déclenchent chacune une règle livrée avec Falco ; l'option --rm supprime le pod de test dès que la commande se termine.

Fenêtre de terminal
# Test 1 : Shell dans un conteneur
kubectl run test-falco --image=alpine:3.22@sha256:14358309a308569c32bdc37e2e0e9694be33a9d99e68afb0f5ff33cc1f695dce --rm -it -- /bin/sh -c "cat /etc/shadow"
# Test 2 : Écriture dans /etc
kubectl run test-write --image=alpine:3.22@sha256:14358309a308569c32bdc37e2e0e9694be33a9d99e68afb0f5ff33cc1f695dce --rm -it -- /bin/sh -c "touch /etc/test"
# Test 3 : Lecture sensitive file
kubectl run test-read --image=alpine:3.22@sha256:14358309a308569c32bdc37e2e0e9694be33a9d99e68afb0f5ff33cc1f695dce --rm -it -- /bin/sh -c "cat /etc/passwd"

Ces commandes fonctionnent avec ou sans tty=true : ce réglage change le moment où la ligne sort, pas le fait qu'elle sorte.

Fenêtre de terminal
# JSON formaté
kubectl logs -n falco -l app.kubernetes.io/name=falco -f | jq .
# Filtrer par priorité
kubectl logs -n falco -l app.kubernetes.io/name=falco | grep -i "warning\|error\|critical"

Deux pannes reviennent en boucle : le pod ne démarre pas faute de driver compatible avec le noyau, ou il démarre sans charger vos règles. Les deux se diagnostiquent dans les logs, mais pas dans le même conteneur du pod.

Le chargement du driver s'effectue dans un conteneur dédié, falco-driver-loader : c'est là qu'il faut lire les logs, pas dans le conteneur falco lui-même.

Fenêtre de terminal
# Vérifier les événements
kubectl describe pod -n falco -l app.kubernetes.io/name=falco
# Problèmes de driver courants
kubectl logs -n falco -l app.kubernetes.io/name=falco -c falco-driver-loader

Solutions courantes :

SymptômeCause probableSolution
Driver eBPF échoueKernel < 5.8Utiliser driver.kind=module
Module kernel échoueHeaders kernel manquantsInstaller linux-headers-$(uname -r)
Pas d'alertesRègles désactivéesVérifier falco.rules_file

Vérifiez d'abord que la ConfigMap contient le contenu attendu, puis cherchez dans les journaux de démarrage la ligne de chargement du fichier : c'est là que les erreurs de syntaxe sont signalées.

Fenêtre de terminal
# Vérifier la syntaxe YAML
kubectl get configmap -n falco falco-rules -o yaml
# Logs de chargement des règles
kubectl logs -n falco -l app.kubernetes.io/name=falco | grep -i "rule\|error\|warn"

Ces quatre réflexes pèsent davantage sur la qualité de la détection que le nombre de règles activées. Une règle qui se déclenche cent fois par jour finit par être ignorée, ce qui revient exactement à ne pas l'avoir écrite.

Filtrage par namespace

Exclure les namespaces de monitoring/debug pour réduire le bruit.

Priorités appropriées

Réserver CRITICAL/ALERT pour les vraies urgences nécessitant une action.

Tags cohérents

Utiliser des tags pour filtrer (mitre, compliance, cks, filesystem).

Tests réguliers

Valider que les règles détectent bien les comportements attendus.

Falco génère beaucoup d'alertes par défaut. En production, le tuning est essentiel.

Le bruit vient rarement d'une règle mal écrite : il vient d'activités légitimes que Falco ne peut pas distinguer d'une attaque. Identifiez la source récurrente avant d'écrire une exclusion, sinon vous neutralisez la détection bien au-delà du cas visé.

SourceExempleSolution
Namespaces de debugkubectl exec dans kube-systemExclure le namespace
Opérateurs KubernetesControllers qui lisent des secretsWhitelist par image
Jobs d'administrationBackups, maintenanceExclure par label
Conteneurs toolboxImages de debug avec shellsExclure par image

Redéfinir une règle sous le même nom remplace intégralement sa condition : on repart donc de la condition d'origine, à laquelle on ajoute les clauses not nécessaires.

customRules:
tuning.yaml: |-
- rule: Terminal shell in container
condition: >
spawned_process and container
and shell_procs and proc.tty != 0
and not k8s.ns.name in (kube-system, monitoring, debug)
and not container.image.repository in (busybox, alpine/debug)

L'ordre de ces étapes compte. Brancher les alertes vers une équipe avant d'avoir filtré le bruit garantit qu'elles seront ignorées au bout de quelques jours, y compris les vraies.

  1. Déployer en mode observation : Commencer sans alerting externe
  2. Collecter les faux positifs : Analyser les logs pendant 1-2 semaines
  3. Créer des exceptions : Whitelists par namespace, image, ou processus
  4. Activer les alertes : Connecter Falcosidekick après stabilisation
  5. Itérer : Ajuster au fil des déploiements

falcoctl est l'outil CLI pour gérer les règles et plugins Falco.

Fenêtre de terminal
# Installer falcoctl, version epinglee et archive verifiee
VERSION=0.11.0
curl -fsSLO "https://github.com/falcosecurity/falcoctl/releases/download/v$VERSION/falcoctl_${VERSION}_linux_amd64.tar.gz"
curl -fsSLO "https://github.com/falcosecurity/falcoctl/releases/download/v$VERSION/falcoctl_${VERSION}_checksums.txt"
grep " falcoctl_${VERSION}_linux_amd64.tar.gz$" "falcoctl_${VERSION}_checksums.txt" | sha256sum -c -
tar -xzf "falcoctl_${VERSION}_linux_amd64.tar.gz" falcoctl
sudo mv falcoctl /usr/local/bin/
# Lister les règles disponibles
falcoctl artifact list
# Installer des règles depuis le registry
falcoctl artifact install falco-rules

L'outillage a changé : falcoctl gère désormais les artefacts, règles et plugins, et simplifie nettement leur mise à jour. Les ConfigMaps restent valides pour vos règles personnalisées, mais ne construisez pas toute votre chaîne dessus si vous démarrez aujourd'hui.

ConceptDescription
FalcoOutil CNCF Graduated de détection runtime (syscalls + plugins)
Driverauto recommandé → Modern eBPF si noyau 5.8+, sinon fallback
RèglesYAML avec listes, macros, et conditions de détection
PrioritésEMERGENCY → DEBUG selon la criticité
FalcosidekickRouteur d'alertes vers 50+ destinations
K8s AuditPlugin séparé pour les événements de l'API Server
falcoctlCLI pour gérer les artefacts (règles, plugins)

Dix questions pour vérifier votre compréhension de Falco avant l'examen CKS.

Contrôle de connaissances

Validez vos connaissances avec ce quiz interactif

7 questions
8 min.
70% requis

Informations

  • Le chronomètre démarre au clic sur Démarrer
  • Questions à choix multiples, vrai/faux et réponses courtes
  • Vous pouvez naviguer entre les questions
  • Les résultats détaillés sont affichés à la fin

Lance le quiz et démarre le chronomètre

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