Detect and respond to in-container threats at the syscall level using Falco (eBPF-based, CNCF, open-source, no license cost). Covers Falco installation on EKS/GKE with eBPF driver, custom rule authoring, alert routing via Falcosidekick, rule debugging, and bridging Falco runtime signals to Kyverno admission enforcement. Use when asked to "detect privilege escalation in containers", "set up runtime threat detection", "write a Falco rule", "route Falco alerts to Slack", or "debug why my Falco rule is not firing".
85%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
Passed
No findings from the security scan
Detect and respond to threats inside running containers using Falco.
When invoked with no arguments, ask before proceeding:
Q1 — Mode?
What do you need?
1. install — deploy Falco on Kubernetes (EKS or GKE) with eBPF driver
2. rules — write and test a custom Falco rule
3. alerts — configure Falcosidekick to route alerts (Slack, webhook, etc.)
4. debug — diagnose why a Falco rule is not firing
5. harden — map runtime Falco alerts to Kyverno admission policies
Alerts on behaviour a container never showed while learning (profile-based,
no rule writing), or Kubescape already runs → /platform-skills:kubescape-operator runtime
Enter 1–5 or mode name:Before install, check for another eBPF agent: kubectl get ds -A | grep -iE 'node-agent|tetragon'. Kubescape's node-agent with runtimeDetection overlaps with Falco on the same nodes; pick one per node pool, or disable Kubescape's runtimeDetection and keep its posture and CVE capabilities.
Q2 — Context (after mode selected, one at a time):
Which cloud platform? EKS / GKE / other (specify node OS if known):Describe the behaviour to detect (e.g. "shell spawned in a container", "unexpected outbound connection"):Which output destination? Slack / webhook / PagerDuty / other:Describe the symptom — which rule is not firing, and what event should trigger it?Which Falco alert or rule output should block re-admission? (paste the alert or rule name):Then proceed into the relevant mode below.
Deploy Falco on Kubernetes (EKS or GKE) using the eBPF driver via Helm.
Prerequisites:
kubectl access to the target clusterSteps:
helm repo add falcosecurity https://falcosecurity.github.io/charts
helm repo updatehelm install falco falcosecurity/falco \
--namespace falco \
--create-namespace \
-f examples/runtime-security/falco-values.yamlkubectl rollout status daemonset/falco -n falco
kubectl get pods -n falco -o widekubectl logs -n falco -l app.kubernetes.io/name=falco --tail=20Notice A shell was spawned... (from the default ruleset test events)EKS-specific note: if using Bottlerocket nodes, set driver.kind: modern_ebpf in Helm values — Bottlerocket does not ship kernel headers for the classic eBPF probe.
GKE-specific note: COS nodes require driver.kind: modern_ebpf. GKE Autopilot does not support Falco (no DaemonSet scheduling).
Write and test custom Falco rules.
Steps:
- rule: Shell spawned in container
desc: A shell was spawned inside a container — potential interactive intrusion
condition: >
spawned_process
and container
and shell_procs
and not container.image.repository in (allowed_shell_images)
output: >
Shell spawned in container
(user=%user.name user_id=%user.uid
container=%container.name image=%container.image.repository
shell=%proc.name parent=%proc.pname cmdline=%proc.cmdline)
priority: WARNING
tags: [container, shell, mitre_execution]spawned_process — a new process was exec'dcontainer — event is inside a container (not on the host)proc.name — process namecontainer.image.repository — image name without tagfd.net — network file descriptor (for connection events)kubectl run event-generator \
--image=falcosecurity/event-generator \
--restart=Never \
--rm -it -- run syscallkubectl logs -n falco -l app.kubernetes.io/name=falco | grep WARNINGcustomRules:
custom-rules.yaml: |-
- rule: Shell spawned in container
...Configure Falcosidekick to route Falco alerts to Slack, webhooks, or other outputs.
Steps:
helm upgrade --install falco falcosecurity/falco \
--namespace falco \
--create-namespace \
--set falcosidekick.enabled=true \
--set falcosidekick.webui.enabled=true \
-f examples/runtime-security/falcosidekick-values.yamlfalcosidekick:
config:
slack:
webhookurl: "https://hooks.slack.com/services/<token>"
minimumpriority: warning
messageformat: >
Alert: *{{ .Rule }}* (Priority: {{ .Priority }})
Container: `{{ index .OutputFields "container.name" }}`
Image: `{{ index .OutputFields "container.image.repository" }}`kubectl port-forward -n falco svc/falco-falcosidekick-ui 2802:2802
# Open http://localhost:2802 — events appear in the UIslack.minimumpriority: warning to suppress DEBUG/INFO noiseIf you need deeper context on any Falco component, load references/runtime-security.md.
Diagnose why a Falco rule is not firing.
Checklist (work through in order):
kubectl get pods -n falco -o wide
kubectl logs -n falco -l app.kubernetes.io/name=falco | tail -20kubectl logs -n falco -l app.kubernetes.io/name=falco | grep -i "Loading rules"
kubectl exec -n falco daemonset/falco -- cat /etc/falco/rules.d/custom-rules.yaml 2>/dev/null \
|| kubectl exec -n falco daemonset/falco -- ls /etc/falco/kubectl exec -n falco daemonset/falco -- falco --validate /etc/falco/rules.d/custom-rules.yamlkubectl run test --image=falcosecurity/event-generator --rm -it -- run syscallfalcosidekick.config.slack.minimumpriority: error, rules with priority: WARNING are silently dropped. Adjust priority or threshold.never_true is shadowing your condition:
kubectl exec -n falco daemonset/falco -- cat /etc/falco/falco_rules.yaml | grep -A3 "macro: <macro name>"
kubectl exec -n falco daemonset/falco -- ls /etc/falco/rules.d/Map Falco runtime alerts to Kyverno admission policies to prevent redeployment of flagged workloads.
Steps:
kubectl label deployment <name> -n <namespace> \
security.platform/falco-alert=criticalapiVersion: policies.kyverno.io/v1
kind: ValidatingPolicy
metadata:
name: block-falco-flagged-workloads
spec:
validationActions: [Deny]
matchConstraints:
resourceRules:
- apiGroups: ["apps"]
apiVersions: ["v1"]
operations: ["CREATE", "UPDATE"]
resources: ["deployments"]
validations:
- expression: >
!has(object.metadata.labels) ||
!('security.platform/falco-alert' in object.metadata.labels) ||
object.metadata.labels['security.platform/falco-alert'] != 'critical'
message: "Deployment is flagged by a Falco critical alert and cannot be re-admitted. Remove the flag after remediation."Important: Kyverno blocks new pod admissions only — it does not terminate existing running pods that violate the policy. After applying the policy, manually identify and terminate flagged pods:
# Find pods matching the label that triggered the alert kubectl get pods -n <namespace> -l <label-key>=<label-value> # Terminate with grace period to allow in-flight requests to drain kubectl delete pod <name> -n <namespace> --grace-period=30
Recovery: If a Kyverno policy blocks a legitimate workload, remove the triggering label immediately:
kubectl label deployment <name> -n <namespace> security.platform/falco-alert-The workload will be re-admitted on next rollout. Fix the underlying security issue, then re-apply the label to re-admit under policy enforcement.
After completing this task, log errors and learnings via /platform-skills:self-improve log.
nitinjain999/platform-skills
c2e75b7
Also appears in
since Oct 19, 2026
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.