Falco + eBPF 容器安全監控實戰:從安裝到 Production 部署全攻略

## 咩係 Falco? Falco 係 CNCF 旗下嘅開源 runtime security 工具,專門用嚟監控 Linux 系統同容器嘅異常行為。佢底下用 eBPF(extended Berkeley Packet Filter)技術,可以喺 kernel 層面直接 capture syscall,唔使裝任何 agent 入 container 入面,真正做到 non-intrusive 嘅...

咩係 Falco?

Falco 係 CNCF 旗下嘅開源 runtime security 工具,專門用嚟監控 Linux 系統同容器嘅異常行為。佢底下用 eBPF(extended Berkeley Packet Filter)技術,可以喺 kernel 層面直接 capture syscall,唔使裝任何 agent 入 container 入面,真正做到 non-intrusive 嘅安全監控。

簡單講:Falco 就係你啲 container 嘅 CCTV,24×7 幫你睇實邊個做緊啲咩可疑嘢。

Falco 嘅核心原理係咁:佢定義咗一套 rules(用 YAML 寫),每條 rule 描述一個「唔應該發生嘅行為」,例如「有人喺 container 入面 run shell」、「有人改咗 /etc/passwd」、「有 process spawn 咗一個 reverse shell」。當 Falco 偵測到 matching event,就會即刻 send alert 去你指定嘅 channel(stdout、file、syslog、webhook、Slack 等等)。

Falco 用 eBPF 嘅好處係乜?傳統 kernel module 需要 compile against 你嘅 exact kernel version,每次 kernel upgrade 都有機會 break。eBPF 就唔同 — 佢係 kernel 原生支援嘅 sandboxed bytecode execution environment,Falco 嘅 eBPF probe 可以動態 load 入 kernel 而唔需要任何 compile step,兼容性同穩定性都高好多。而且 eBPF 嘅 overhead 極低,production workload 幾乎感覺唔到。

點解 Falco 咁重要?

傳統嘅 container security 方案通常係 image scanning(例如 Trivy、Snyk),scan 完 build-time 嘅 vulnerability 就算。但 runtime 嘅攻擊先係最危險 — 就算你個 image 冇 CVE,attacker 都可以透過 application-level 嘅漏洞(例如 RCE、SSRF)打入嚟然後橫向移動。

Falco 就係填補呢個 gap。佢唔係 scan image,而係 monitor runtime behavior。例如:

有冇人用 `kubectl exec` 入 container?

有冇 program 嘗試 read sensitive file(/etc/shadow)?

有冇 unexpected outbound network connection?

全部呢啲,Falco 都可以 detect 到。

Step 1:安裝 Falco

Falco 支援多種安裝方式:直接裝喺 host Linux、用 Helm 裝喺 Kubernetes cluster、或者用 Docker compose。呢度我哋用最直接嘅方法 — 喺 Ubuntu 22.04 host 上面裝。

# Add Falco repo
curl -fsSL https://falco.org/repo/falcosecurity-packages.asc | \
  sudo gpg --dearmor -o /usr/share/keyrings/falco-archive-keyring.gpg

echo "deb [signed-by=/usr/share/keyrings/falco-archive-keyring.gpg] \
  https://download.falco.org/packages/deb stable main" | \
  sudo tee /etc/apt/sources.list.d/falcosecurity.list

# Install Falco
sudo apt update && sudo apt install -y falco

裝完之後 Falco 會自動 start 做 systemd service。你可以 check status:

sudo systemctl status falco

Falco Step 2:啟用 eBPF probe

Falco 預設用 kernel module,但 eBPF probe 更加 modern、唔使 compile kernel module、而且對 system 嘅 overhead 更低。建議用 eBPF mode:

# 確認 kernel version >= 4.14(eBPF 最低要求)
uname -r

# 改 Falco config 改用 eBPF
sudo sed -i 's/^engine: .*/engine: ebpf/' /etc/falco/falco.yaml

# Restart Falco
sudo systemctl restart falco

如果你行嘅係 containerized environment,Falco 仲可以自動 detect 你嘅 container runtime(Docker、containerd、CRI-O),然後自動 enrich event 入面嘅 container ID、image name、pod name 等等 metadata。

# Test Falco 是否正常運作 — 用 event generator
sudo falco-event-generator run syscall.WriteBelowBinaryDir

# 睇 Falco log 有冇 trigger alert
sudo journalctl -u falco -f

Step 3:自訂 Falco Rules

Falco 預設 rules 已經好全面,但有時你要根據自己 environment 加 custom rules。例如你想 monitor 有冇人 access 你個 application 嘅 config file:

# /etc/falco/rules.d/custom-app-rules.yaml
- rule: Unauthorized Config Access
  desc: Detect any attempt to read app config
  condition: >
    open_read
    and fd.name startswith /opt/myapp/config/
    and not proc.name in (myapp, config-loader)
  output: >
    Unauthorized config read! user=%user.name
    file=%fd.name container=%container.name
  priority: WARNING
  tags: [app, config, falco]

加完 rules 之後 reload Falco:

sudo systemctl restart falco

Falco 會 parse 所有 /etc/falco/rules.d/ 入面嘅 YAML file,merge 埋一齊行。你可以用好 specific 嘅 condition filter 去減少 false positive。

Falco Step 4:將 Alert 送去 Slack / Webhook

Production 環境當然唔可能淨係靠睇 log。Falco 支援多種 output channel。最基本嘅做法係用 program output 將 alert forward 去 webhook:

# 喺 /etc/falco/falco.yaml 加呢段
program_output:
  enabled: true
  keep_alive: false
  program: |
    curl -X POST -H "Content-Type: application/json" \
    -d '{"text":"Falco Alert: %output"}' \
    https://hooks.slack.com/services/YOUR/WEBHOOK/URL

又或者用 Falcosidekick — 呢個係 Falco 嘅官方 companion tool,可以將 alert forward 去 30+ 種 backend(Slack、Teams、Datadog、Prometheus、Loki、Elasticsearch 等等),仲有 web UI 俾你 visualise event:

# 用 Helm 裝 Falco + Falcosidekick 去 K8s
helm repo add falcosecurity https://falcosecurity.github.io/charts
helm install falco falcosecurity/falco \
  --set falcosidekick.enabled=true \
  --set falcosidekick.webui.enabled=true \
  --set falcosidekick.config.slack.webhookurl="https://hooks.slack.com/..."

咁樣你就可以喺 Slack 收到 Falco 嘅 real-time security alert,仲有 dashboard 睇 trend。

Step 5:Falco + Prometheus 監控 Dashboard

Alert 之外,Falco 仲可以 export metrics 去 Prometheus,俾你用 Grafana 整 dashboard。Falcosidekick 內置 Prometheus endpoint:

# 檢查 Falcosidekick Prometheus metrics endpoint
curl http://localhost:2801/metrics

# 你會見到類似呢啲 metrics:
# falcosidekick_inputs_total{source="syscalls"}
# falcosidekick_outputs_total{destination="slack"}
# falcosidekick_kernel_drops_total

你可以 set alert rule 喺 Prometheus 入面 — 例如 `falcosidekick_kernel_drops_total` 突然飆升就可能代表 Falco miss 咗 event,需要 investigate。

常見嘅 Falco production tuning tips:

**減低 noise**:用 `append: false` override default rules 入面太 sensitive 嘅條件

**Macro 重用**:將常用 condition 抽成 macro,例如定義 `container_env` macro 統一 filter 特定 namespace

**Tag 分類**:用 tags 將 rules 分類(network、filesystem、process),方便之後 filter

**Rate limiting**:set `priority` 同 throttle 去避免 alert fatigue

📌 延伸閱讀:Docker安全掃描懶人包:用Trivy一鍵掃瞄容器漏洞 — Trivy + Falco = build-time + runtime 完整防線!
📌 相關文章:Palo Alto PA-550 系列評測 — 企業級安全防護選擇

🔗 參考資料:Falco Official Docs | Falco GitHub

Falco 總結:Runtime Security 由今日開始

Falco 係 Kubernetes-native runtime security 嘅標準答案。佢唔會取代 image scanning,而係 complement — image scan 管 build-time,Falco 管 runtime。兩樣加埋先係完整嘅 container security 策略。

如果你仲未 deploy runtime security monitoring,今日就係最好嘅時候。起手簡單:裝 Falco → 用 eBPF mode → 駁落 Slack → 慢慢 tune rules。唔使一步到位,最緊要係開始。

📌 延伸閱讀:之前我哋寫過 Docker安全掃描懶人包:用Trivy一鍵掃瞄容器漏洞,Trivy + Falco = build-time + runtime 完整防線!