apiVersion: v1 data: rules.yaml: |2- - action: Terminate Pod actionner: kubernetes:terminate - action: Label Pod as Suspicious actionner: kubernetes:label parameters: labels: analysis/status: "suspicious" # PR10_STACK_VERSION: v17-response-truth # PR10_TALON_RULESET_ID: active-v17-response-truth # ============================================================ # PLAYBOOKS FALCO TALON ACTIFS # # Ces playbooks correspondent volontairement aux règles Falco dédiées # à la réponse déjà présentes dans valeurs-personnalisees.yaml. # # Les règles Falco réservées à la réponse sont exclues du résultat de détection # des 14 scénarios pendant le traitement des preuves. # ============================================================ # ------------------------------------------------------------ # CANARI DE DISPONIBILITÉ DU MODE ACTIF # ------------------------------------------------------------ - action: PR10 Active Canary Marker actionner: kubernetes:label parameters: level: pod labels: falco-talon-active: "true" - rule: PR10 Active Canary Playbook description: Preuve inoffensive de disponibilité du mode actif. match: rules: - PR10 Response Trigger Talon Active Canary actions: - action: PR10 Active Canary Marker # ------------------------------------------------------------ # PB1 - Collecte de preuves # ------------------------------------------------------------ - action: PB1 Marker Triggered actionner: kubernetes:label continue: true parameters: level: pod labels: falco-pb1-triggered: "true" - action: PB1 Collect Runtime Evidence actionner: kubernetes:script continue: true parameters: shell: /bin/sh script: | set +e # IMPORTANT : Falco Talon v0.3.0 appelle os.ExpandEnv() sur le script # avant de le copier dans le pod cible. Éviter les variables shell ordinaires # comme $DIR, $p, $i, etc., puisque Talon les développerait # d’abord dans son propre environnement (souvent vers une chaîne vide). rm -rf /tmp/falco-response/pb1 mkdir -p /tmp/falco-response/pb1 || exit 40 { echo "STACK_VERSION=v17-response-truth" echo "PLAYBOOK=PB1" echo "ACTION=EVIDENCE_COLLECTION" printf 'TIMESTAMP=' date -u '+%Y-%m-%dT%H:%M:%SZ' 2>/dev/null || true printf 'HOSTNAME_RUNTIME=' hostname 2>/dev/null || true printf 'IDENTITY=' id 2>/dev/null || true printf 'KERNEL=' uname -a 2>/dev/null || true } > /tmp/falco-response/pb1/00-context.txt # Collecter les preuves des processus sans réexécuter `ps aux`. Une nouvelle exécution # redéclencherait la règle de réponse PB1 de Falco et créerait une boucle. { echo "=== RÉPERTOIRES PROC ===" find /proc -maxdepth 1 -type d -regex '/proc/[0-9]+' -print 2>/dev/null | head -200 || true echo "=== LIGNES DE COMMANDE ===" grep -aH '' /proc/[0-9]*/cmdline 2>/dev/null | head -200 || true } > /tmp/falco-response/pb1/01-processes.txt { echo "=== TCP ===" cat /proc/net/tcp 2>/dev/null || true echo "=== TCP6 ===" cat /proc/net/tcp6 2>/dev/null || true echo "=== UDP ===" cat /proc/net/udp 2>/dev/null || true } > /tmp/falco-response/pb1/02-connections.txt cat /proc/mounts 2>/dev/null > /tmp/falco-response/pb1/03-mounts.txt || true if command -v find >/dev/null 2>&1; then find /tmp /var/tmp -maxdepth 2 -type f -ls 2>/dev/null \ | head -150 > /tmp/falco-response/pb1/04-files.txt || true else echo "commande find non disponible dans l’image cible" \ > /tmp/falco-response/pb1/04-files.txt fi if [ -s /tmp/falco-response/pb1/00-context.txt ] && \ [ -s /tmp/falco-response/pb1/01-processes.txt ] && \ [ -s /tmp/falco-response/pb1/02-connections.txt ] && \ [ -s /tmp/falco-response/pb1/03-mounts.txt ]; then echo "COLLECTED" > /tmp/falco-response/pb1/STATUS exit 0 fi echo "EVIDENCE_FAILED" > /tmp/falco-response/pb1/STATUS exit 42 - action: PB1 Collect Container Logs actionner: kubernetes:log continue: true parameters: tail_lines: 100 - action: PB1 Marker Complete actionner: kubernetes:label continue: true parameters: level: pod labels: falco-pb1-complete: "true" - rule: PB1 Evidence Collection Playbook description: Collecter les preuves après le déclencheur déterministe de réponse PB1. match: rules: - PR10 Response Trigger PB1 Process Discovery actions: - action: PB1 Marker Triggered - action: PB1 Collect Runtime Evidence - action: PB1 Collect Container Logs - action: PB1 Marker Complete # ------------------------------------------------------------ # PB2 - Mise en quarantaine d’un fichier # ------------------------------------------------------------ - action: PB2 Marker Triggered actionner: kubernetes:label continue: true parameters: level: pod labels: falco-pb2-triggered: "true" - action: PB2 Quarantine Artifact actionner: kubernetes:script continue: true parameters: shell: /bin/sh script: | set +e # Même contrainte os.ExpandEnv() de Talon que pour PB1 : utiliser des chemins littéraux et # éviter les références à des variables shell ordinaires dans ce script. rm -rf /tmp/falco-response/pb2 mkdir -p /tmp/falco-response/pb2 /tmp/falco-quarantine || exit 40 { echo "STACK_VERSION=v17-response-truth" echo "PLAYBOOK=PB2" echo "ACTION=FILE_QUARANTINE" echo "SOURCE=/tmp/manual-curl-tool.sh" echo "DESTINATION=/tmp/falco-quarantine/manual-curl-tool.sh" printf 'TIMESTAMP=' date -u '+%Y-%m-%dT%H:%M:%SZ' 2>/dev/null || true } > /tmp/falco-response/pb2/00-context.txt # Falco se déclenche au démarrage de curl. Attendre que le fichier téléchargé devienne # non vide sans utiliser de variable compteur shell que Talon pourrait # développer avant l’exécution. for _ in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20; do [ -s /tmp/manual-curl-tool.sh ] && break sleep 0.5 done if [ ! -s /tmp/manual-curl-tool.sh ]; then echo "SOURCE_NOT_FOUND_OR_EMPTY" > /tmp/falco-response/pb2/STATUS exit 41 fi sleep 1 ls -l /tmp/manual-curl-tool.sh \ > /tmp/falco-response/pb2/01-file-before.txt 2>&1 || true mv /tmp/manual-curl-tool.sh /tmp/falco-quarantine/manual-curl-tool.sh 2>/dev/null if [ -f /tmp/falco-quarantine/manual-curl-tool.sh ] && \ [ ! -e /tmp/manual-curl-tool.sh ]; then chmod 0400 /tmp/falco-quarantine/manual-curl-tool.sh 2>/dev/null || true ls -l /tmp/falco-quarantine/manual-curl-tool.sh \ > /tmp/falco-response/pb2/03-file-after.txt 2>&1 || true echo "QUARANTINED" > /tmp/falco-response/pb2/STATUS exit 0 fi ls -l /tmp/manual-curl-tool.sh /tmp/falco-quarantine/manual-curl-tool.sh \ > /tmp/falco-response/pb2/03-file-after.txt 2>&1 || true echo "QUARANTINE_FAILED" > /tmp/falco-response/pb2/STATUS exit 42 - action: PB2 Marker Complete actionner: kubernetes:label continue: true parameters: level: pod labels: falco-pb2-complete: "true" - rule: PB2 File Quarantine Playbook description: Mettre en quarantaine l’artefact contrôlé de réponse T1105. match: rules: - PR10 Response Trigger PB2 Tool Transfer actions: - action: PB2 Marker Triggered - action: PB2 Quarantine Artifact - action: PB2 Marker Complete # ------------------------------------------------------------ # PB3 - Isolement du pod # S’EXÉCUTE EN DERNIER dans executer-tests-reponse.sh. # ------------------------------------------------------------ - action: PB3 Marker Triggered actionner: kubernetes:label continue: true parameters: level: pod labels: falco-pb3-triggered: "true" - action: PB3 Collect Container Logs actionner: kubernetes:log continue: true parameters: tail_lines: 100 - action: PB3 Isolate Pod # Confinement : une NetworkPolicy deny-all précréée sélectionne # security-state=quarantined. Cette action de label accomplit donc deux # tâches de réponse de façon atomique : elle active l’isolement réseau bidirectionnel # et retire le pod compromis du sélecteur du Service normal. actionner: kubernetes:label continue: true parameters: level: pod labels: security-state: "quarantined" service-state: "quarantined" - action: PB3 Marker Complete actionner: kubernetes:label continue: true parameters: level: pod labels: falco-pb3-complete: "true" - rule: PB3 Pod Isolation Playbook description: Mettre le pod contrôlé PB3 en quarantaine tout en le conservant pour l’analyse forensique. match: rules: - PR10 Response Trigger PB3 Shell Execution actions: - action: PB3 Marker Triggered - action: PB3 Collect Container Logs - action: PB3 Isolate Pod - action: PB3 Marker Complete kind: ConfigMap metadata: annotations: meta.helm.sh/release-name: falco-talon meta.helm.sh/release-namespace: falco creationTimestamp: "2026-11-09T06:02:55Z" labels: app.kubernetes.io/instance: falco-talon app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: falco-talon app.kubernetes.io/part-of: falco-talon app.kubernetes.io/version: 0.3.0 helm.sh/chart: falco-talon-0.4.2 name: falco-talon-rules namespace: falco resourceVersion: "3565" uid: ea87d3c6-2c83-4112-9b6d-cbfe6151a7b7