
偵測只是第一步——自動回應才是防禦閉路的關鍵。
完成本日實作後,你將能夠:
本篇會串連 Falco、Tetragon、Audit Log 三層偵測。建議的最低閱讀量:
| 等級 | 天數 | 內容 |
|---|---|---|
| 必備 | Day 1 | ATT&CK 概念 + 靶場部署 |
| 必備 | Day 25 | Falco 規則設計(本篇建立在 Falco 規則之上) |
| 建議 | Day 15 | Defense Impairment(理解安全工具被攻擊的風險) |
| 可跳過 | Day 2–14 | 各攻擊場景細節(本篇會回顧觸發的規則) |
快速路徑:如果時間有限,至少讀完 Day 1 → 25 → 本篇。

單一偵測層有盲區:
| 偵測層 | 能看到 | 看不到 |
|---|---|---|
| Falco | syscall、檔案存取、網路連線 | K8s API 操作的完整 request body |
| Audit Log | 所有 K8s API 操作 | 容器內部行為 |
| Tetragon | 精確的 syscall 鏈、process 樹 | K8s 語義(誰建了什麼 Pod) |
三層堆疊的覆蓋率:Falco 處理 80% 的 runtime 偵測,Audit Log 補上 API 層,Tetragon 提供最底層的 kernel-level enforcement。
Day 25 的 Falco 規則可以偵測攻擊,但偵測到告警後需要人工處理——這在凌晨三點的 SOC 值班中不夠及時。Falco Talon 接收 Falco 告警,自動執行預定義的回應動作。

Talon 的核心是一個事件驅動的規則引擎:
listenAddress: 0.0.0.0
listenPort: 2803
defaultNotifiers:
- k8s
rules:
# 偵測到挖礦 → 立即隔離
- name: Isolate Cryptominer
match:
rules:
- "KOAD S35 Cryptominer Process"
priority: critical
actions:
- action: Label Pod
parameters:
labels:
quarantine: "true"
- action: NetworkPolicy
parameters:
allow:
- "127.0.0.1/32" # 只允許 localhost
# 偵測到容器逃逸 → 立即終止
- name: Terminate Escape Pod
match:
rules:
- "KOAD S13 Privileged Container Started"
- "KOAD S14 Cgroup Manipulation"
- "KOAD S15 Docker Socket Access"
- "KOAD S16 Core Pattern Modified"
- "KOAD S17 Ptrace in Container"
- "KOAD S18 Device Node Created"
priority: critical
actions:
- action: Terminate Pod
parameters:
gracePeriodSeconds: 0 # 立即終止
# 偵測到暴力破解 → 標記告警
- name: Alert Brute Force
match:
rules:
- "KOAD S24 Brute Force Attempt"
priority: critical
actions:
- action: Label Pod
parameters:
labels:
security-alert: brute-force
# 偵測到橫向移動 → 完全隔離
- name: Isolate Lateral Movement
match:
rules:
- "KOAD S30 Cross-Namespace Secret Access"
priority: critical
actions:
- action: NetworkPolicy
parameters:
allow: [] # 完全隔離
| 動作 | 說明 | 適用場景 |
|---|---|---|
| Terminate Pod | 立即刪除 Pod | 容器逃逸(S13-S18) |
| Label Pod | 標記 quarantine label | 挖礦(S35)、暴力破解(S24) |
| NetworkPolicy | 動態建立隔離策略 | 橫向移動(S30)、C2 通訊 |
| Exec | 在 Pod 內執行命令 | 取證(snapshot) |
| Notification | 發送通知 | 所有場景 |
# 主機終端
# 1. 部署 Falco Talon
$ helm install falco-talon falco-talon/falco-talon \
-n falco \
--set-file config.config=defense/falco-talon/config.yaml
# 2. 配置 Falco 將告警轉發到 Talon
# falco values-custom.yaml:
falcosidekick:
enabled: true
config:
webhook:
address: "http://falco-talon:2803"
# 3. 驗證 Talon 已正常啟動
$ kubectl get pods -n falco | grep talon
falco-talon-7f8d9c6b4-x2k9p 1/1 Running 0 30s
# 4. 查看 Talon 日誌確認規則載入
$ kubectl logs -n falco -l app=falco-talon --tail=10
2026-08-19T10:00:01Z INF Listening on 0.0.0.0:2803
2026-08-19T10:00:01Z INF Loaded 4 rules
2026-08-19T10:00:01Z INF Default notifiers: [k8s]
Talon 需要足夠的權限來執行回應動作:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: falco-talon
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list", "delete", "update", "patch"]
- apiGroups: [""]
resources: ["pods/exec"]
verbs: ["create"]
- apiGroups: ["networking.k8s.io"]
resources: ["networkpolicies"]
verbs: ["get", "list", "create", "update", "delete"]
- apiGroups: [""]
resources: ["events"]
verbs: ["create"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: falco-talon
subjects:
- kind: ServiceAccount
name: falco-talon
namespace: falco
roleRef:
kind: ClusterRole
name: falco-talon
apiGroup: rbac.authorization.k8s.io

部署完成後,觸發一個攻擊場景驗證 Talon 自動回應:
# 主機終端
# 觸發 S13(特權容器)攻擊,觀察 Talon 回應
kubectl apply -f scenarios/privilege-escalation/S13-privileged-pod.yaml
# 等待 5 秒後檢查 Talon 是否自動終止了 Pod
sleep 5
kubectl get pods -n koad -l koad-scenario=S13
預期結果:
NAME READY STATUS RESTARTS AGE
privileged-pod 0/1 Terminating 0 5s
Talon 收到 Falco 的
KOAD S13 Privileged Container Started告警後,自動執行了Terminate Pod動作。
# 確認 Talon 日誌記錄了回應動作
kubectl logs -n falco -l app=falco-talon --tail=5
預期結果:
2026-08-19T10:00:06Z INF Received event: "KOAD S13 Privileged Container Started"
2026-08-19T10:00:06Z INF Matched rule: "Terminate Escape Pod"
2026-08-19T10:00:06Z INF Action: Terminate Pod (gracePeriodSeconds: 0)
2026-08-19T10:00:06Z INF Pod koad/privileged-pod terminated
| 陷阱 | 說明 | 解法 |
|---|---|---|
| 誤殺生產 Pod | 合法 Pod 觸發規則被 Terminate | 先用 Label + NetworkPolicy 隔離,不直接 Terminate |
| NetworkPolicy 殘留 | Talon 建立的 NP 不會自動清理 | 設計清理流程或加 TTL annotation |
| 告警風暴 | 大量 Pod 同時觸發 → Talon 過載 | 設定 rate limiting + 批次處理 |
| RBAC 不足 | Talon SA 沒有權限執行動作 | 預先配置 ClusterRole(見上方) |
| 項目 | Falco | Tetragon |
|---|---|---|
| 技術 | eBPF / kernel module | eBPF |
| 規則語言 | Falco 規則語法 | TracingPolicy YAML |
| 強項 | 廣泛的預設規則集 | 精確的 syscall 追蹤 |
| 回應 | 需要 Talon | 內建 enforcement(SIGKILL) |
| 適用 | 通用偵測 | 精確策略 |
| Process 樹 | 有限 | 完整 parent → child 追蹤 |
| 效能開銷 | ~2-5% CPU | ~1-3% CPU |
| 社群 | CNCF Incubating | CNCF(Cilium 生態系) |
# 主機終端
# 使用 Helm 部署 Tetragon
$ helm repo add cilium https://helm.cilium.io
$ helm install tetragon cilium/tetragon \
-n kube-system \
--set tetragon.btf=/sys/kernel/btf/vmlinux
# 驗證
$ kubectl get pods -n kube-system | grep tetragon
tetragon-operator-6b9d8c7f4-q2k8p 1/1 Running 0 45s
tetragon-node-agent-xk9p2 1/1 Running 0 45s
# 安裝 tetra CLI(用於查看事件)
$ GOOS=$(go env GOOS) GOARCH=$(go env GOARCH)
$ curl -L https://github.com/cilium/tetragon/releases/latest/download/tetra-${GOOS}-${GOARCH}.tar.gz | tar -xz
$ sudo mv tetra /usr/local/bin/
# 主機終端
# 確認 Tetragon Pod 正常運行
kubectl get pods -n kube-system -l app.kubernetes.io/name=tetragon
預期結果:
NAME READY STATUS RESTARTS AGE
tetragon-operator-6b9d8c7f4-q2k8p 1/1 Running 0 2m
tetragon-node-agent-xk9p2 1/1 Running 0 2m
# 測試 Tetragon 事件串流
kubectl exec -n kube-system ds/tetragon -- tetra getevents -o compact --timeout 10
預期結果:
process default/test-pod /bin/sh
process default/test-pod /usr/bin/ls
exit default/test-pod /usr/bin/ls 0
如果看到 process 事件,代表 Tetragon 已正確掛載 eBPF 探測器並追蹤容器行為。
apiVersion: cilium.io/v1alpha1
kind: TracingPolicy
metadata:
name: detect-sa-token-read
spec:
kprobes:
- call: "security_file_open"
syscall: false
args:
- index: 0
type: file
selectors:
- matchArgs:
- index: 0
operator: "Equal"
values:
- "/var/run/secrets/kubernetes.io/serviceaccount/token"
apiVersion: cilium.io/v1alpha1
kind: TracingPolicy
metadata:
name: block-dangerous-binaries
spec:
tracepoints:
- subsystem: "syscalls"
event: "sys_enter_execve"
args:
- index: 0
type: "string"
selectors:
- matchArgs:
- index: 0
operator: "Equal"
values:
- "/usr/bin/nmap"
- "/usr/bin/hydra"
- "/usr/local/bin/xmrig"
matchActions:
- action: Sigkill # 立即 kill process
apiVersion: cilium.io/v1alpha1
kind: TracingPolicy
metadata:
name: detect-suspicious-connect
spec:
kprobes:
- call: "tcp_connect"
syscall: false
args:
- index: 0
type: "sock"
selectors:
- matchArgs:
- index: 0
operator: "DPort"
values:
- "4444" # Metasploit
- "5555" # C2
- "9050" # Tor SOCKS
apiVersion: cilium.io/v1alpha1
kind: TracingPolicy
metadata:
name: detect-container-escape
spec:
kprobes:
- call: "security_sb_mount"
syscall: false
args:
- index: 0
type: "string"
- index: 1
type: "path"
selectors:
- matchArgs:
- index: 0
operator: "Equal"
values:
- "/dev/sda1"
- "/dev/vda1"
matchActions:
- action: Sigkill
- call: "__x64_sys_ptrace"
syscall: true
args:
- index: 0
type: "int"
selectors:
- matchArgs:
- index: 0
operator: "Equal"
values:
- "16" # PTRACE_ATTACH
- "17" # PTRACE_SEIZE
matchActions:
- action: Sigkill
Tetragon 最強大的功能之一是完整的 process 樹追蹤。當偵測到可疑行為時,你可以看到從 container entrypoint 到 exploit binary 的完整呼叫鏈:
# 主機終端
# 查看 Tetragon 事件(compact 模式)
$ kubectl exec -n kube-system ds/tetragon -- \
tetra getevents -o compact
process koad/attacker /bin/bash
process koad/attacker /usr/bin/curl http://169.254.169.254/...
[connect] koad/attacker /usr/bin/curl tcp 169.254.169.254:80
process koad/attacker /usr/bin/kubectl get secrets -A
[open] koad/attacker /usr/bin/kubectl /var/run/secrets/.../token
process koad/attacker /usr/bin/nmap -sT 10.96.0.0/16
[exit] koad/attacker /usr/bin/nmap SIGKILL

Tetragon 在 kernel 層面就能 kill process,攻擊者甚至來不及完成 syscall。對比 Falco + Talon 需要經過多個元件的傳遞,Tetragon 的 enforcement 幾乎是即時的。
apiVersion: audit.k8s.io/v1
kind: Policy
rules:
# Level 1: 記錄 Secret 的所有操作(但不記錄 body)
- level: Metadata
resources:
- group: ""
resources: ["secrets"]
# Level 2: 記錄 RBAC 變更(含完整內容)
- level: RequestResponse
resources:
- group: "rbac.authorization.k8s.io"
resources: ["clusterrolebindings", "rolebindings"]
verbs: ["create", "update", "delete", "patch"]
# Level 3: 記錄 Pod/Deployment 的建立和刪除
- level: Request
resources:
- group: ""
resources: ["pods"]
- group: "apps"
resources: ["deployments", "daemonsets"]
verbs: ["create", "delete"]
# Level 4: 忽略健康檢查和心跳
- level: None
users: ["system:kube-proxy"]
verbs: ["watch"]
# Level 5: 其他所有操作記錄 Metadata
- level: Metadata
# 編輯 /etc/kubernetes/manifests/kube-apiserver.yaml,加入以下參數:
--audit-policy-file=/etc/kubernetes/audit-policy.yaml
--audit-log-path=/var/log/kubernetes/audit/audit.log
--audit-log-maxage=30
--audit-log-maxbackup=10
--audit-log-maxsize=100
# 掛載 volume
volumeMounts:
- mountPath: /etc/kubernetes/audit-policy.yaml
name: audit-policy
readOnly: true
- mountPath: /var/log/kubernetes/audit
name: audit-log
volumes:
- name: audit-policy
hostPath:
path: /etc/kubernetes/audit-policy.yaml
type: File
- name: audit-log
hostPath:
path: /var/log/kubernetes/audit
type: DirectoryOrCreate
| Level | 記錄內容 | 適用 |
|---|---|---|
| None | 不記錄 | 健康檢查、心跳 |
| Metadata | 時間、使用者、動作、資源 | 大部分操作 |
| Request | Metadata + 請求 body | RBAC 變更 |
| RequestResponse | Request + 回應 body | 安全關鍵操作 |
以 S09(RBAC 竄改)為例,Audit Log 記錄了完整的攻擊行為:
{
"kind": "Event",
"apiVersion": "audit.k8s.io/v1",
"level": "RequestResponse",
"auditID": "a1b2c3d4-e5f6-7890",
"stage": "ResponseComplete",
"requestURI": "/apis/rbac.authorization.k8s.io/v1/clusterrolebindings",
"verb": "create",
"user": {
"username": "system:serviceaccount:koad:attacker-sa",
"groups": ["system:serviceaccounts", "system:authenticated"]
},
"objectRef": {
"resource": "clusterrolebindings",
"name": "koad-backdoor-admin",
"apiGroup": "rbac.authorization.k8s.io"
},
"responseStatus": { "code": 201 },
"requestObject": {
"roleRef": {
"kind": "ClusterRole",
"name": "cluster-admin"
},
"subjects": [{
"kind": "ServiceAccount",
"name": "backdoor-sa",
"namespace": "koad"
}]
},
"requestReceivedTimestamp": "2026-08-19T14:33:22.123456Z"
}
這筆 Audit Log 記錄了攻擊者用 attacker-sa 建立了 koad-backdoor-admin ClusterRoleBinding,把 backdoor-sa 綁定到 cluster-admin。有了 RequestResponse level,請求 body 完整保留。
# /etc/kubernetes/audit-webhook.yaml
apiVersion: v1
kind: Config
clusters:
- name: audit-webhook
cluster:
server: https://siem.company.com/k8s-audit
users:
- name: audit-webhook
user:
token: "webhook-token"
contexts:
- context:
cluster: audit-webhook
user: audit-webhook
name: audit-webhook
current-context: audit-webhook
# API Server 參數
--audit-policy-file=/etc/kubernetes/audit-policy.yaml
--audit-webhook-config-file=/etc/kubernetes/audit-webhook.yaml
--audit-webhook-batch-max-wait=5s
| 場景 | Audit 事件 | Level |
|---|---|---|
| S07 CronJob | create cronjobs | Request |
| S09 RBAC 竄改 | create clusterrolebindings | RequestResponse |
| S10 後門 SA | create serviceaccounts in kube-system | Request |
| S22 偽裝 Pod | create pods in kube-system by non-system user | Request |
| S23 刪除安全工具 | delete daemonsets in falco namespace | Metadata |
| S30 跨 NS Secret | get secrets in different namespace | Metadata |
| S31 資料破壞 | delete deployments / persistentvolumeclaims | Metadata |
Falco + Tetragon + Audit Log 是目前最成熟的偵測組合,但 K8s 安全生態還有幾個值得關注的工具:
| 工具 | 定位 | 核心技術 | vs Falco/Tetragon |
|---|---|---|---|
| KubeArmor | 執行期防護(阻擋,非僅偵測) | LSM(AppArmor/BPF-LSM/SELinux) | Falco 偵測後通知;KubeArmor 直接在核心層阻擋檔案存取、程式執行、網路連線 |
| SPIFFE/SPIRE | 工作負載身份框架 | X.509 SVID + mTLS | 不需要 Service Mesh 也能做 Pod 對 Pod 的 mTLS 認證,實作零信任網路 |
| Hubble | 網路可觀測性 | Cilium eBPF datapath | 提供 L3-L7 流量可視化,是 NetworkPolicy 除錯的最佳工具——能看到哪些封包被 drop |
選型建議:
hubble observe 直接看封包命運| 場景類型 | Falco | Tetragon | Audit Log |
|---|---|---|---|
| Container 內 shell | ✓ syscall | ✓ execve | — |
| 檔案存取 | ✓ open_read/write | ✓ kprobe | — |
| 網路連線 | ✓ connect | ✓ tcp_connect | — |
| K8s API 操作 | ✓ k8s_audit | — | ✓ |
| RBAC 變更 | ✓ k8s_audit | — | ✓ |
| 核心漏洞 exploit | △ proc name | ✓ syscall 追蹤 | — |
| 回應能力 | Talon(秒級) | SIGKILL(毫秒級) | 無(純日誌) |
| 環境 | 建議 | 適用團隊 |
|---|---|---|
| 基本 | Falco + Audit Log | 小團隊、初期導入 |
| 進階 | Falco + Talon + Audit Log + Webhook | 有 SOC 的中型團隊 |
| 高安全 | Falco + Talon + Tetragon + Audit Log + SIEM | 金融、醫療等合規要求高的環境 |
在 KOAD 靶場(4 CPU / 8GB Minikube)上的實測資料:
| 工具 | CPU 開銷 | 記憶體 | 事件延遲 |
|---|---|---|---|
| Falco (modern_ebpf) | ~2-3% | 256MB | 1-2s(到 Sidekick) |
| Tetragon | ~1-2% | 128MB | <1ms(kernel 層) |
| Audit Log (file) | ~1% | N/A | 即寫入 |
| Audit Log (webhook) | ~1-2% | N/A | 5s(batch) |
| 三層總計 | ~5-7% | ~400MB | — |
# 主機終端
# 現象
$ kubectl logs -n falco ds/falco
Error: failed to open eBPF probe
# 原因:核心版本 < 5.8 不支援 modern_ebpf
$ uname -r
5.4.0-150-generic
# 解法:改用 kmod driver
# values-custom.yaml:
driver:
kind: kmod
# 主機終端
# 現象:部署 TracingPolicy 成功但沒有事件
$ kubectl apply -f policy.yaml
tracingpolicy.cilium.io/detect-sa-token-read created
# 原因:kprobes.call 拼錯了函數名,Tetragon 靜默忽略
# 排查:
$ kubectl logs -n kube-system ds/tetragon | grep -i error
WARN kprobe "security_file_openn" not found
# 解法:確認 kernel function 存在
$ kubectl exec -n kube-system ds/tetragon -- \
cat /proc/kallsyms | grep security_file_open
# 主機終端
# 現象:磁碟被 audit log 佔滿
$ du -sh /var/log/kubernetes/audit/
12G /var/log/kubernetes/audit/
# 解法:設定大小和保留限制
--audit-log-maxage=7 # 只保留 7 天
--audit-log-maxbackup=3 # 最多 3 個備份
--audit-log-maxsize=100 # 單檔最大 100MB
| 考點 | 本日內容 | 權重 |
|---|---|---|
| Audit Log | Policy 配置 + 四級 Level | Monitoring/Runtime 20% |
| Falco | 告警回應流程 | Monitoring/Runtime 20% |
| Runtime 安全 | Falco + Tetragon 比較 | Monitoring/Runtime 20% |
--audit-policy-file、--audit-log-path)以及 volume mount| 問題 | 現象 | 解法 |
|---|---|---|
| Talon 收不到告警 | Talon 日誌無 Received event |
確認 Falcosidekick webhook 位址正確:kubectl get cm -n falco falcosidekick -o yaml 中 webhook.address 應為 http://falco-talon:2803 |
| Talon 無權限執行動作 | 日誌顯示 403 Forbidden |
確認 ClusterRole/ClusterRoleBinding 已建立:kubectl get clusterrolebinding falco-talon |
| Tetragon 安裝失敗 | helm install 報 BTF 錯誤 |
核心版本需 >= 5.8,確認 /sys/kernel/btf/vmlinux 存在:ls -la /sys/kernel/btf/vmlinux |
| TracingPolicy 無事件 | Policy 建立成功但 getevents 無輸出 |
檢查 kprobe 函數名是否拼錯:kubectl logs -n kube-system ds/tetragon 搜尋 not found |
| Audit Log 未啟用 | /var/log/kubernetes/audit/ 不存在 |
確認 API Server manifest 已加入 --audit-policy-file 和 --audit-log-path 參數,且 volume mount 正確 |
| Audit Log 磁碟爆滿 | Node NotReady 或 kubelet 告警 | 設定 --audit-log-maxage=7 --audit-log-maxbackup=3 --audit-log-maxsize=100 限制日誌大小 |
| 面向 | KOAD 靶場 | 真實生產環境 |
|---|---|---|
| 部署方式 | Helm install 在 Minikube 上 | 需要考慮 DaemonSet 資源、Node 相容性、Kernel 版本 |
| 規則數量 | 數條自訂規則 | 可能數百條規則,需要 tuning 降低 False Positive |
| 回應機制 | Talon 直接 kill Pod | 生產環境需要更謹慎,避免誤殺正常服務 |
在 KOAD 中部署 Falco/Tetragon 很快。真實環境的挑戰是規則調校和誤報處理——部署只是開始。
核心觀念:偵測→回應的時間差決定了攻擊的影響範圍。 從 Audit Log 的「事後分析」到 Falco Talon 的「秒級回應」再到 Tetragon 的「毫秒級阻擋」,越接近核心的偵測點回應越快、影響越小。
明天 Day 27 進入策略引擎全覆蓋——NetworkPolicy + Kyverno + CIS Benchmark。