
August 20, 2026
9 min read
Table of Contents
By Kokil Thapa | Last reviewed: August 2026
Static analysis and image scanning only protect your cluster before deployment; once a pod is running, you need Falco: Runtime Security for Kubernetes to detect actual malicious behavior like shell spawns or sensitive file access. While traditional web application security focuses on code-level vulnerabilities as discussed in my guide on securing websites and servers, containerized environments require kernel-level observability to catch zero-day exploits and insider threats in real time. This guide covers the practical engineering steps to deploy, tune, and operate Falco in production without drowning your team in false positives.
How does Falco architecture capture syscalls safely?
Understanding the data path is critical before deploying Falco: Runtime Security for Kubernetes in any environment where performance matters. Unlike log aggregators that parse text streams, Falco operates at the kernel boundary. In 2026, the recommended driver is eBPF (specifically the modern CO-RE driver), which attaches probes to syscall entry and exit points without loading a custom kernel module. This eliminates the risk of kernel panics that plagued earlier versions using the legacy falco.ko module.
The architecture follows a strict producer-consumer model. The kernel probe captures raw syscall events and applies initial filtering in-kernel to reduce overhead. Only events matching pre-compiled filter conditions are copied to userspace via a ring buffer. The Falco userspace process then evaluates these events against the loaded ruleset. If a rule matches, it generates an alert. This separation ensures that even under high load, the kernel-side instrumentation remains lightweight and bounded.
For teams managing infrastructure in Nepal or regions with limited bandwidth for shipping logs externally, this in-kernel filtering is especially valuable. You avoid saturating network links with benign syscall noise. The modern eBPF driver also supports field extraction directly in the probe, meaning metadata like container ID, process name, and user UID are resolved before reaching userspace. This reduces CPU overhead significantly compared to post-hoc enrichment.
How do you install Falco on Kubernetes in 2026?
Deployment has matured considerably. In 2026, the standard approach uses the official Helm chart (falcosecurity/falco) with the modern eBPF driver enabled by default. Avoid manual DaemonSet manifests unless you have specific compliance constraints preventing Helm usage. The following steps assume a Kubernetes cluster v1.28+ and Helm v3.14+.
Step 1: Add the repository and create namespace
helm repo add falcosecurity https://falcosecurity.github.io/charts
helm repo update
kubectl create namespace falco-system Step 2: Configure values for production
Create a falco-values.yaml file. Do not use defaults in production. Explicitly set the driver, resource limits, and output channels.
# falco-values.yaml
driver:
kind: modern_ebpf
modernEbpf:
leastPrivileged: true
resources:
requests:
cpu: 100m
memory: 256Mi
limits:
cpu: 500m
memory: 512Mi
falco:
rules_file:
- /etc/falco/falco_rules.yaml
- /etc/falco/rules.d/custom-rules.yaml
json_output: true
json_include_output_property: true
http_output:
enabled: true
url: "http://your-siem-collector.internal:8080/falco"
collectors:
containerd:
enabled: true
socket: /run/containerd/containerd.sock Step 3: Deploy and verify
helm install falco falcosecurity/falco \
--namespace falco-system \
--values falco-values.yaml \
--version 4.7.0
# Verify pods are running and driver loaded
kubectl get pods -n falco-system
kubectl logs -n falco-system -l app.kubernetes.io/name=falco | grep "Driver selected" A common mistake I've seen on client projects is forgetting to mount the correct container runtime socket. If your nodes use containerd (standard in 2026 K8s distributions), ensure containerd.socket path matches your node OS. On Ubuntu 22.04/24.04, it's typically /run/containerd/containerd.sock. Misconfiguration here causes Falco to miss container metadata enrichment, rendering alerts useless for forensics.
What are the most effective custom Falco rules?
Default rules generate excessive noise. Effective Falco: Runtime Security for Kubernetes requires tuning. Start by disabling noisy baseline rules and adding targeted detections for your workload. Rules use YAML with condition macros. Below is a production-tested pattern for detecting credential theft attempts in Laravel or PHP applications — a scenario relevant if you're building legal-tech portals handling sensitive documents.
# custom-rules.yaml
- rule: Sensitive File Access in Container
desc: Detect reads of .env, private keys, or config files outside expected paths
condition: >
evt.type = openat and
evt.is_open_read = true and
container.id != host and
fd.name rmatch "/var/www/html/.env" or
fd.name rmatch "/etc/shadow" or
fd.name rmatch "*/id_rsa"
output: "Sensitive file accessed (file=%fd.name container=%container.name proc=%proc.name user=%user.name)"
priority: WARNING
tags: [filesystem, credentials, laravel]
- macro: trusted_php_processes
condition: proc.name in (php-fpm, php, artisan, queue-worker)
- rule: Unexpected Shell Spawn in PHP Container
desc: Shells spawned by non-shell parent processes in web containers
condition: >
spawned_process and
container.image.repository contains "laravel-app" and
not trusted_php_processes and
proc.name in (bash, sh, zsh, dash)
output: "Shell spawned in PHP container (shell=%proc.name parent=%proc.pname container=%container.name)"
priority: CRITICAL
tags: [process, shell, webapp] Always validate rules locally before deploying. Use falcoctl test or run Falco in dry-run mode against captured pcap/syscall traces. Untested rules in production cause either missed detections or alert fatigue. For eCommerce platforms processing payments via eSewa or Khalti, add specific rules monitoring outbound connections to payment gateway IPs only — flag any other external connection from the payment processing pod as HIGH priority.
How does Falco compare to other Kubernetes security tools?
Choosing the right tool depends on your threat model. Falco excels at runtime behavioral detection but doesn't replace policy enforcement or vulnerability scanning. Below is a functional comparison based on production deployments in 2026.
| Capability | Falco | Kyverno / OPA Gatekeeper | Sysdig Secure | Cilium Tetragon |
|---|---|---|---|---|
| Runtime Threat Detection | ✅ Primary strength | ❌ Policy only | ✅ Commercial enhanced | ✅ Strong eBPF native |
| Admission Control | ❌ Not supported | ✅ Primary strength | ✅ Integrated | ⚠️ Limited |
| Custom Rule Language | YAML + Macros | Rego / CEL | Proprietary + Falco compat | TracingPolicy YAML |
| Performance Overhead | Low (eBPF filtered) | Negligible (admission) | Medium-High | Very Low (kernel enforced) |
| CNCF Status | Graduated | Incubating | Commercial | Sandbox |
| Best For | Breach detection, forensics | Compliance guardrails | Enterprise bundled platform | Network + syscall correlation |
In practice, many teams combine Falco with Kyverno. Kyverno prevents misconfigured pods from deploying (shift-left), while Falco detects when a correctly configured pod gets compromised at runtime (shield-right). For Nepali startups or SMEs with constrained budgets, the open-source Falco + Kyverno stack provides enterprise-grade defense without commercial licensing costs. If you're already evaluating cloud hosting options as covered in cloud hosting services comparison, factor in whether your provider offers managed Falco/Sysdig integration.
How do you handle Falco alert fatigue in production?
Alert fatigue kills security programs faster than missing detections. After deploying Falco: Runtime Security for Kubernetes, expect 2-4 weeks of aggressive tuning. Follow this operational workflow:
- Baseline Phase (Week 1-2): Run Falco in "log-only" mode. Aggregate alerts by rule name and container image. Identify top 10 noisiest rules.
- Suppress Known Good: Create exception lists for legitimate application behavior. Example: If your Laravel queue worker legitimately spawns
ffmpegfor video processing, add an exception rather than disabling the entire "unexpected child process" rule. - Priority Reclassification: Demote informational alerts to DEBUG. Reserve WARNING/CRITICAL for actionable incidents. Never send CRITICAL alerts to Slack channels without human triage capability.
- Enrichment Integration: Pipe Falco JSON to a SIEM or log aggregator. Correlate alerts with pod labels, deployment version, and user identity. Raw Falco output lacks business context needed for prioritization.
- Automated Response Hooks: For high-confidence rules (e.g., reverse shell detected), integrate with Kubernetes API to auto-isolate pods via NetworkPolicy or taint nodes. Start with manual response; automate only after 30+ days of stable detection accuracy.
Track your signal-to-noise ratio weekly. A healthy Falco deployment should have <5% false positive rate on WARNING+ alerts within 60 days. If not, revisit rule granularity. Consider splitting monolithic rules into workload-specific variants. For example, separate "shell spawn" rules for frontend pods vs backend worker pods — their acceptable behaviors differ fundamentally.
Implementing Falco: Runtime Security for Kubernetes Effectively
Falco: Runtime Security for Kubernetes delivers genuine value when treated as an operational discipline, not a set-and-forget checkbox. Deploy with the modern eBPF driver, invest heavily in rule tuning during the first month, integrate alerts with your existing observability stack, and measure false positive rates rigorously. Pair it with admission controllers for defense-in-depth. For teams building regulated applications in Nepal's legal or financial sectors, runtime detection is no longer optional — it's the last line of defense when preventive controls fail. If you need help architecting secure container workflows or integrating Falco with your existing Laravel/PHP infrastructure, reach out to discuss your specific requirements.

