iT邦幫忙

2026 iThome 鐵人賽

DAY 1
2
Kubernetes

資安這條路:從攻擊者視角看 Kubernetes系列 第 1

Day 1|ATT&CK Containers Matrix 完全解讀 + KOAD 靶場部署

  • 分享至 

  • xImage
  •  

資安這條路:從攻擊者視角看 Kubernetes

前言:為什麼 Kubernetes 安全需要一套攻擊框架?

2025 年,全球超過 60% 的生產環境運行在容器化平台上,Kubernetes 已經是事實上的標準。然而大部分的 K8s 安全指南停留在「強化清單」層次——告訴你該做什麼,卻沒解釋攻擊者怎麼打進來

如果你不了解攻擊者的思維路徑,防禦就只是打勾而已。

這就是為什麼我們需要 MITRE ATT&CK。

本篇是全系列的基石——上半場帶你走一遍 ATT&CK Containers Matrix 的 10 個戰術 × 28 個技術,下半場直接動手把 KOAD 靶場跑起來。讀完這篇,你會有兩樣東西:一張攻擊全景圖,和一座可以親手操作的靶場。


學習目標

完成本日實作後,你將能夠:

  • 理解 ATT&CK Containers Matrix 的 10 個戰術 × 28 個技術
  • 在本地環境部署完整的 KOAD 攻防靶場(35 場景 + 防禦堆疊)
  • 驗證 Falco、Kyverno、NetworkPolicy 是否正常運作
  • 存取靶場中的 Web 服務(SSRF Webapp、Jupyter Notebook)

先備知識:容器與 Kubernetes 是什麼?

如果你已經熟悉 Docker 和 K8s 架構,可以直接跳到下一節「什麼是 MITRE ATT&CK」。

什麼是容器?

傳統部署中,應用程式直接跑在作業系統上,共用函式庫。一個更新壞了,其他應用跟著掛。

容器把應用程式和它的所有依賴(程式碼、函式庫、設定)打包成獨立的單元——不管放到哪台機器上都能跑,互不干擾。

比較 虛擬機 (VM) 容器 (Container)
隔離方式 獨立的 OS 核心 共用 OS 核心,Namespace 隔離
啟動時間 分鐘級 秒級
資源佔用 GB 級(含完整 OS) MB 級(只有應用+依賴)
安全隔離 強(硬體級別) 較弱(共用核心,可能逃逸)

最後一點正是本系列的核心——容器共用宿主機核心,隔離配置不當就能「逃逸」到宿主機。Day 8–13 會拆解六種逃逸手法。

Docker 是最主流的容器引擎。核心概念只有三個:

  • 映像(Image):應用的唯讀模板(像光碟片)
  • 容器(Container):映像跑起來的實體(光碟裝好跑起來的程式)
  • Dockerfile:描述怎麼做出映像的腳本(安裝說明書)

動手試一下 Docker

如果你已經裝好 Docker,花兩分鐘跑一下:

# 1. 跑第一個容器(會自動下載映像)
docker run hello-world

# 2. 進入一個 Ubuntu 容器(-it = 互動模式)
docker run -it ubuntu bash
# 在容器內試試:
ls /        # 看到的是容器自己的檔案系統
cat /etc/os-release   # Ubuntu,不是你的宿主機
exit        # 離開容器

# 3. 查看目前的容器和映像
docker ps -a    # 列出所有容器(含已停止的)
docker images   # 列出本機的映像

如果還沒裝 Docker,沒關係——後面的 KOAD 靶場用 Minikube,會自動處理容器環境。這裡只是讓你感受一下「容器是什麼」。

什麼是 Kubernetes?

一個容器很簡單,但生產環境有幾百個容器——誰來決定容器跑在哪台機器、掛了自動重啟、流量怎麼分配?

Kubernetes(K8s) 就是容器的「管理平台」。它負責自動調度、自動修復、負載均衡、滾動更新。

K8s 架構分兩層:

Control Plane(大腦) Worker Node(手腳)

元件 角色 被打穿 = ?
API Server 所有 kubectl 指令的入口 整個叢集被控制(Day 2)
etcd 儲存所有 Secret、RBAC 設定 所有機密外洩(Day 16)
kubelet 每個 Node 上的 agent,管理 Pod Node 被控制(Day 2)

K8s 核心概念速查

概念 一句話 類比
Pod 最小部署單位,裡面跑 1+ 個容器 一個房間裡住 1–2 人
Deployment 管理 Pod 的複本數量和更新 物業管理公司
Service 為 Pod 提供穩定的網路入口 大樓門牌號碼
Namespace 叢集內的虛擬分區 不同樓層
ConfigMap 儲存非敏感設定 公告欄
Secret 儲存敏感資料(但預設只是 Base64,不是加密!) 沒上鎖的保險箱
ServiceAccount (SA) Pod 的身份,決定能存取什麼 API 員工證
RBAC 角色型存取控制——誰能做什麼 門禁系統
NetworkPolicy 控制 Pod 間的網路流量 防火牆規則
DaemonSet 每個 Node 都跑一個 Pod 每層樓的保全
CronJob 定期執行的任務 排班表

什麼是 MITRE ATT&CK?

ATT&CK(Adversarial Tactics, Techniques, and Common Knowledge)是由 MITRE 維護的攻擊知識庫。它把真實世界中觀察到的攻擊手法,按照**戰術(Tactics)技術(Techniques)**兩個維度進行分類:

  • 戰術(Tactic):攻擊者「想要達成什麼」——初始存取、執行、持久化、提權……
  • 技術(Technique):攻擊者「如何達成」——SSRF、容器逃逸、竊取 Token……

ATT&CK 有多個矩陣(Enterprise、Mobile、ICS),而 2021 年正式加入的 Containers Matrix 專門描述容器與編排平台的攻擊面。

ATT&CK 對防禦者的價值

用途 說明
威脅建模 用 ATT&CK 作為框架,系統性盤點叢集面對的威脅
偵測規則設計 每個 Technique 對應具體的 syscall / API 行為,可直接轉化為 Falco 規則
紅隊演練 按 Kill Chain 順序模擬完整攻擊路徑,驗證防禦有效性
合規對照 將 CKS 考試領域、CIS Benchmark 項目對應到 ATT&CK 技術
安全成熟度評估 計算「我的偵測規則覆蓋了多少 Technique」作為量化指標

MITRE ATT&CK Containers Matrix:10 個戰術 × 28 個技術

Containers Matrix 定義了攻擊者從入侵容器化環境造成影響的完整殺傷鏈。以下逐一拆解每個戰術和對應技術。

TA0001 Initial Access — 初始存取

攻擊者如何取得在容器環境中的第一個立足點。

技術 ID 技術名稱 說明 攻擊難度
T1190 Exploit Public-Facing Application 利用對外服務的漏洞(如 SSRF)滲透進叢集
T1133 External Remote Services 暴露的管理介面——kubelet API、Dashboard、SSH
T1078 Valid Accounts 取得合法憑證——洩漏的 kubeconfig、雲端 IAM

KOAD 場景: S01 SSRF 漏洞 Web App、S02 暴露的 kubelet、S03 洩漏的 kubeconfig

現實案例: 2022 年某電商因 SSRF 漏洞被打穿 Metadata API,攻擊者取得雲端 IAM 憑證後橫向移動至生產資料庫。這正是 T1190 的經典路線。

攻擊者視角: 初始存取是整條 Kill Chain 最關鍵的一步——進不去就什麼都做不了。在 K8s 環境中,最常見的入口不是什麼零日漏洞,而是暴露的管理介面洩漏的 kubeconfig。Shodan 上隨時能找到數千個暴露的 kubelet 連接埠。


TA0002 Execution — 執行

攻擊者取得立足點後,如何在容器環境中執行指令。

技術 ID 技術名稱 說明 攻擊難度
T1059 Command and Scripting Interpreter Web Shell、反向 Shell、腳本執行
T1609 Container Administration Command 使用 kubectl/docker 等管理工具操作叢集
T1610 Deploy Container 部署惡意容器(特權 Pod、挖礦容器)
T1053 Scheduled Task/Job 建立 CronJob 定期執行惡意任務
T1204 User Execution 誘導管理員執行惡意 YAML(社交工程)

KOAD 場景: S04 Jupyter Web Shell、S05 kubectl 控制叢集、S06 部署特權 Pod、S07 CronJob 持久化、S08 釣魚 Pod

關鍵觀念: 在 K8s 中,「執行」不只是跑一條指令。部署一個 Pod 本身就是一種執行——而且一旦 Pod 啟動,攻擊者就有了持續運行的工作負載。kubectl apply -f evil-pod.yaml 這一條指令就足以在叢集中開啟一個永久的立足點。


TA0003 Persistence — 持久化

攻擊者如何確保失去初始存取後仍能回來。

技術 ID 技術名稱 說明 攻擊難度
T1098 Account Manipulation 竄改 RBAC 綁定,給攻擊者帳號提權
T1136 Create Account 建立隱藏的 ServiceAccount 並綁定高權限
T1543 Create/Modify System Process 透過 Mutating Webhook 注入惡意 Sidecar
T1133 External Remote Services 維持外部遠端存取管道
T1525 Implant Internal Image 將後門映像推入內部 Registry
T1053 Scheduled Task/Job CronJob 作為持久化機制
T1078 Valid Accounts 維持已竊取的合法帳號存取

KOAD 場景: S09 RBAC 竄改、S10 後門 SA、S11 Sidecar 注入、S12 映像植入

關鍵觀念: K8s 的持久化手法比傳統 Linux 更豐富。攻擊者不需要寫 crontab 或改 systemd,只要在 RBAC 加一條 ClusterRoleBinding,就擁有永久的叢集管理員權限。而且這條 Binding 藏在幾百個 RBAC 物件中,不主動審計根本不會被發現。


TA0004 Privilege Escalation — 權限提升

攻擊者如何從容器內的低權限提升到節點或叢集層級。

技術 ID 技術名稱 說明 攻擊難度
T1611 Escape to Host 容器逃逸——本矩陣最具技術深度的領域
T1068 Exploitation for Privilege Escalation 利用核心漏洞提權(如 Dirty Pipe)
T1098 Account Manipulation RBAC 提權
T1543 Create/Modify System Process 修改系統級別 process
T1053 Scheduled Task/Job 利用 Job 執行高權限操作
T1078 Valid Accounts 利用高權限帳號

KOAD 場景: S13–S18 容器逃逸六式、S19 核心 CVE 提權

容器逃逸六式——Day 8–11 的核心內容:

手法 原理 前提 KOAD
Privileged + mount 特權容器可 mount 宿主機磁碟 privileged: true S13
Cgroup release_agent 利用 cgroup 通知機制執行宿主機指令 cgroup v1 + 寫入權限 S14
Docker.sock 掛載 Docker socket 直接操作 Docker daemon hostPath /var/run/docker.sock S15
/proc core_pattern 寫入 core_pattern 在 crash 時執行命令 可寫 /proc/sys/kernel/core_pattern S16
SYS_PTRACE + HostPID 附加到宿主機 process 注入 shellcode SYS_PTRACE cap + hostPID: true S17
lxcfs 利用 lxcfs 的 devices.allow 建立裝置節點 lxcfs 環境 + mknod 能力 S18

這六種逃逸手法將在 Day 8–11 逐一拆解,每個場景都可以在 KOAD 靶場中實際操作。


TA0005 Stealth — 隱匿

攻擊者如何隱藏自己的行動。

技術 ID 技術名稱 說明
T1612 Build Image on Host 在宿主機上建構惡意映像,繞過 Registry 審計
T1070 Indicator Removal 清除 bash_history、Pod 日誌、K8s Events
T1036 Masquerading 將惡意 Pod 命名為系統元件(如 kube-proxy)
T1078 Valid Accounts 使用合法帳號活動,不觸發異常偵測

KOAD 場景: S20 宿主機建映像、S21 痕跡清除、S22 偽裝系統元件

為什麼隱匿重要: 真正的攻擊者不會像 KOAD 測試那樣一次觸發 174 條 Falco 告警。他們會用合法帳號、合法映像、合法操作來掩護自己。偽裝成 kube-proxy 的 Pod 在 kubectl get pods 裡看起來完全正常——除非你仔細比對映像 hash。


TA0112 Defense Impairment — 防禦破壞

攻擊者如何癱瘓你的安全監控。

技術 ID 技術名稱 說明
T1685 Disable or Modify Tools 刪除 Falco DaemonSet、修改 Audit Policy、移除 Kyverno

KOAD 場景: S23 停用安全工具

關鍵觀念: 在 K8s 中,安全工具本身就是叢集內的工作負載。攻擊者如果有 cluster-admin 權限,一條 kubectl delete ds falco -n falco 就能讓你的 Runtime 偵測全面失效。這是為什麼 RBAC 最小權限如此重要——保護安全工具的 Namespace 應該有獨立的、限制極嚴格的 RBAC。


TA0006 Credential Access — 憑證存取

攻擊者如何竊取叢集中的機密資訊。

技術 ID 技術名稱 說明
T1110 Brute Force 對 Dashboard/API Server 暴力破解
T1528 Steal Application Access Token 從環境變數或 ConfigMap 竊取 API Token
T1552 Unsecured Credentials 讀取未加密的 Secrets、SA Token、docker config

KOAD 場景: S24 暴力破解、S25 竊取 Token、S26 明文憑證

你可能不知道的事實: K8s Secret 預設只是 base64 編碼,不是加密。kubectl get secret db-password -o jsonpath='{.data.password}' | base64 -d 就能看到明文。如果 etcd 沒有啟用靜態加密(encryption at rest),任何能讀 etcd 的人都能拿到所有 Secret。


TA0007 Discovery — 探索

攻擊者如何了解叢集的全貌。

技術 ID 技術名稱 說明
T1613 Container and Resource Discovery 列舉 Pod、Namespace、Node、SA
T1046 Network Service Discovery nmap 掃描 Service CIDR 和 Pod CIDR
T1069 Permission Groups Discovery 列舉 RBAC 權限(kubectl auth can-i)

KOAD 場景: S27 資源列舉、S28 網路掃描、S29 RBAC 探測


TA0008 Lateral Movement — 橫向移動

攻擊者如何從一個 Namespace 移動到另一個。

技術 ID 技術名稱 說明
T1550 Use Alternate Authentication Material 使用竊取的 SA Token 存取其他 Namespace

KOAD 場景: S30 跨 Namespace Token 橫向移動

關鍵觀念: K8s 的 Namespace 不是安全邊界。如果 RBAC 配置不當,攻擊者拿到一個 cluster-admin 的 SA Token 就能存取所有 Namespace 的資源。真正的隔離需要 NetworkPolicy + RBAC + 獨立叢集三管齊下。


TA0040 Impact — 影響

攻擊者最終造成的破壞。

技術 ID 技術名稱 說明
T1485 Data Destruction 刪除 Deployment、PVC(Persistent Volume Claim,Pod 申請持久儲存空間的資源請求),破壞工作負載
T1499 Endpoint Denial of Service Resource Bomb 耗盡 CPU/Memory
T1490 Inhibit System Recovery 刪除 Backup CronJob,阻止災難復原
T1498 Network Denial of Service 大量 Pod 消耗 Service CIDR / iptables 規則
T1496 Resource Hijacking 部署挖礦程式劫持運算資源

KOAD 場景: S31 資料破壞、S32 Resource Bomb、S33 阻止恢復、S34 網路 DoS、S35 挖礦劫持

挖礦是最常見的 K8s 攻擊目標: 根據 Sysdig 2025 Container Security Report,超過 65% 的容器入侵事件最終目的是挖礦。因為 K8s 叢集通常有大量 CPU 和自動擴展能力——對攻擊者來說,這就是免費的算力。


微軟 Kubernetes 威脅矩陣 vs ATT&CK

微軟在 2020 年發布了 Kubernetes 威脅矩陣,從另一個維度切入:

維度 MITRE ATT&CK 微軟 K8s 矩陣
組織方式 戰術 × 技術 攻擊面 × 手法
重點 攻擊者做了什麼 攻擊面在哪裡
覆蓋範圍 通用容器 專注 K8s + 雲端

微軟矩陣的三大攻擊面:

  1. 叢集(Cluster):API Server 未授權、RBAC 錯誤配置、etcd 暴露
  2. 容器(Container):映像漏洞、特權容器、容器逃逸
  3. 供應鏈(Supply Chain):CI/CD 投毒、Registry 滲透、映像 tag 劫持

兩者高度互補——ATT&CK 適合設計偵測規則,微軟矩陣適合盤點攻擊面。KOAD 以 ATT&CK 為主架構,同時覆蓋微軟矩陣的所有攻擊面。


OWASP Kubernetes Top 10(2025)

OWASP 在 2025 年更新的 K8s Top 10 與 ATT&CK 技術的對應:

OWASP K8s 說明 對應 ATT&CK KOAD 場景
K01 Insecure Workload Configuration T1611, T1610 S06, S13–S18
K02 Supply Chain Vulnerabilities T1525, T1068 S12, S19
K03 Overly Permissive RBAC T1098, T1078 S09, S10
K04 Lack of Centralized Policy T1685 S23
K05 Inadequate Logging / Monitoring T1070 S21
K06 Broken Authentication T1110, T1552 S24, S26
K07 Missing Network Segmentation T1550, T1046 S28, S30
K08 Secrets Management Failures T1552, T1528 S25, S26
K09 Misconfigured Cluster Components T1133 S02
K10 Outdated / Vulnerable Components T1068 S19

CKS 六大領域 × ATT&CK 對照

如果你正在準備 CKS(Certified Kubernetes Security Specialist)認證,ATT&CK 矩陣可以幫助你理解每個考試領域對應的攻擊場景:

CKS 領域 權重 對應 ATT&CK 戰術 KOAD 場景 文章天數
Cluster Setup 15% TA0001 Initial Access S01–S03 Day 2–3
Cluster Hardening 15% TA0003, TA0006 S09–S12, S24–S26 Day 6–7, 16–17
System Hardening 10% TA0004 Privilege Escalation S13–S19 Day 8–13
Minimize Microservice 20% TA0004, TA0040 S13–S19, S31–S35 Day 8–13, 20–21
Supply Chain Security 20% TA0005 Stealth S12, S20, S23–S24 Day 22–23
Monitoring/Runtime 20% TA0112 Defense Impairment S23, S26–S29 Day 25–27

宣布 KOAD:第一個 100% 覆蓋 ATT&CK Containers 的開源靶場

KOAD(Kubernetes Offensive and Active Defense Lab)是本系列的核心專案:

  • 35 個攻擊場景,覆蓋 ATT&CK Containers Matrix 全部 10 個戰術、28 個技術
  • 每個場景可操作——不是紙上談兵,而是真正的 kubectl apply + 手動攻擊
  • 攻防對照——每個攻擊場景都有對應的防禦對策和 Falco 偵測規則
  • 一鍵部署——bash setup.sh 在 Minikube 上 5 分鐘內完成全部場景

KOAD 靶場資料


部署前:認識你的工具箱

在動手之前,先認識這次會用到的工具——每一個都有明確的角色:

工具 是什麼 類比 本系列的角色
Docker 容器引擎,負責跑容器 水電瓦斯(基礎設施) 提供容器運行環境
Minikube 本地單節點 K8s 叢集 練習用的小操場 不需要雲端帳號,本地就能跑完整 K8s
kubectl K8s 的命令列工具 搖控器 你和叢集溝通的唯一方式
Helm K8s 的套件管理器 像 apt/brew 一條指令裝好 Falco(500+ 行 YAML)
Falco Runtime 威脅偵測 監視器 + 保全 即時偵測容器內異常行為,發出告警
Kyverno K8s 策略引擎 機場安檢門 檢查 Pod 是否符合安全策略
Calico CNI 網路插件 大樓的隔間牆 實作 NetworkPolicy,讓網路隔離生效

kubectl 新手必備指令

# 列出 Pod
kubectl get pods -n koad              # 指定 Namespace
kubectl get pods -A                   # 所有 Namespace

# 查看詳細資訊(除錯必備)
kubectl describe pod <name> -n koad

# 查看 Pod 日誌
kubectl logs <name> -n koad           # 一次性
kubectl logs -f <name> -n koad        # 持續追蹤(像 tail -f)

# 進入容器(本系列最常用)
kubectl exec -it <name> -n koad -- bash
#   -i = 互動模式, -t = 分配終端, -- 後面是容器內指令

# 套用 / 刪除 YAML
kubectl apply -f pod.yaml
kubectl delete -f pod.yaml

# 我有什麼權限?
kubectl auth can-i --list

YAML 語法速學

K8s 的所有資源都用 YAML 定義。每個 K8s YAML 都有四個固定欄位:

apiVersion: v1              # API 版本
kind: Pod                   # 資源類型(Pod / Deployment / Service...)
metadata:                   # 元資料(名稱、標籤、Namespace)
  name: my-pod
  namespace: koad
spec:                       # 規格(你想要什麼)
  containers:
    - name: web
      image: nginx:1.25

YAML 注意事項:

  • 縮排必須用空格,不能用 Tab
  • 冒號後面要有空格name: value(對)、name:value(錯)
  • 清單用 - 開頭:每個 - 是一個元素

KOAD 靶場部署實戰

接下來是動手時間。以下步驟會在你的本地環境建立一座完整的攻防靶場。

Step 0:取得 KOAD 靶場原始碼

KOAD 靶場是一個獨立的 GitHub 專案,包含所有場景 YAML、靶機應用、防禦配置。第一步是把它 clone 下來:

# 主機終端
git clone https://github.com/fei3363/koad.git
cd koad

什麼是 git clone 就是把 GitHub 上的專案完整下載到你的電腦。執行後會在目前資料夾建立一個 koad/ 資料夾,裡面包含所有檔案。後續所有指令都在這個目錄下執行。

Clone 完成後,目錄結構如下:

koad/
├── setup.sh               # 一鍵部署(可選,自動執行下面所有步驟)
├── teardown.sh             # 清理環境
├── scenarios/              # 35 個攻擊場景 YAML
│   ├── initial-access/     # S01-S03
│   ├── execution/          # S04-S08
│   ├── persistence/        # S09-S12
│   └── ...                 # 共 10 個戰術目錄
├── apps/                   # 靶機應用程式原始碼 + Dockerfile
├── defense/                # 防禦元件(Falco、Kyverno、seccomp...)
├── attacker/               # 攻擊者工具箱
└── images/                 # 攻擊用容器映像

快速部署捷徑: 如果你想跳過手動步驟,直接 bash setup.sh 會自動執行 Step 1-7 的全部內容。但建議第一次跟著手動操作,理解每一步在做什麼。

環境需求

硬體:

項目 最低需求 建議配置
CPU 4 核心 8 核心
記憶體 8 GB 16 GB
磁碟空間 50 GB 可用 100 GB 可用

軟體:

工具 版本 用途
Docker 24+ 容器運行環境
Minikube v1.38+ 本地 K8s 叢集
kubectl v1.30+ K8s CLI
Helm v3.17+ / v4+ 部署 Falco / Kyverno

Step 1:安裝工具鏈

Linux(Ubuntu / Debian)

# 主機終端
# Docker
sudo apt-get update
sudo apt-get install -y docker.io
sudo systemctl enable docker && sudo systemctl start docker
sudo usermod -aG docker $USER
# 執行完後,登出再登入(或 newgrp docker)讓群組生效

# Minikube
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube

# kubectl
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
sudo install kubectl /usr/local/bin/kubectl

# Helm(推薦 snap,可繞過某些網路問題)
sudo snap install helm --classic

macOS

# 主機終端(需要先安裝 Homebrew:https://brew.sh)
brew install minikube kubectl helm

# Docker:macOS 需要 Docker Desktop
# 下載安裝:https://www.docker.com/products/docker-desktop/
# 安裝後開啟 Docker Desktop,確認 Docker Engine Running

Windows

# PowerShell(以系統管理員執行)
# 前提:啟用 WSL2(Windows Subsystem for Linux 2)
wsl --install

# 安裝 Docker Desktop(會自動使用 WSL2 後端)
# 下載:https://www.docker.com/products/docker-desktop/

# 使用 winget 安裝其他工具
winget install Kubernetes.minikube
winget install Kubernetes.kubectl
winget install Helm.Helm

# 建議在 WSL2 的 Ubuntu 環境中操作,體驗最接近 Linux

驗證安裝(全平台通用)

# 主機終端
docker version --format '{{.Client.Version}}'
kubectl version --client --short
minikube version --short
helm version --short

四個指令都顯示版本號就表示安裝完成。

Step 2:啟動 Minikube 叢集

# 主機終端
minikube start \
  --driver=docker \
  --cpus=4 \
  --memory=8192 \
  --kubernetes-version=v1.30.0 \
  --cni=calico

參數考量:

  • --driver=docker:Docker driver 最穩定,但容器逃逸場景會受限於 Docker-in-Docker
  • --cni=calico:選用 Calico 是因為它支援 NetworkPolicy(Minikube 預設 CNI 不支援)
  • --kubernetes-version=v1.30.0:固定版本確保場景行為一致

等待 Node 就緒:

# 主機終端
kubectl wait --for=condition=Ready node/minikube --timeout=120s

踩坑 #1:Node NotReady
Calico CNI 需要時間啟動。剛跑完 minikube start 就用 kubectl get nodes 會看到 NotReady。等 30–60 秒讓 Calico Pod 完全啟動即可。

Step 3:建立 Namespace

# 主機終端
for ns in koad koad-attack koad-defense koad-registry koad-production; do
  kubectl create namespace "$ns"
done
Namespace 用途
koad 主要攻擊場景(S01–S35 大部分在這裡)
koad-attack 攻擊者工具
koad-defense 防禦工具
koad-registry 私有 Registry(S12 映像植入)
koad-production 模擬生產環境(S30 橫向移動目標)

Step 4:建構自訂映像

# 主機終端
# SSRF 漏洞 Web App(Day 2 會詳細解說)
minikube image build -t koad/vulnerable-webapp:latest apps/vulnerable-webapp/

# 模擬雲端 Metadata API
minikube image build -t koad/mock-metadata:latest apps/mock-metadata/

# 暴力破解工具
minikube image build -t koad/brute-forcer:latest apps/brute-forcer/

踩坑 #2:Docker 權限問題
如果你使用 snap 安裝的 Docker,直接 docker build 會遇到 permission denied 讀不到 ~/.minikube/certs/ca.pem。解法是使用 minikube image build——它直接在 Minikube VM 裡建構,不需要本地 Docker 存取 Minikube 的憑證。

Step 5:部署 35 個攻擊場景

# 主機終端 — 一次部署全部場景
for dir in initial-access execution persistence privilege-escalation \
           stealth defense-impairment credential-access discovery \
           lateral-movement impact; do
  kubectl apply -f scenarios/$dir/
done

驗證部署:

$ kubectl get pods -n koad
NAME                                    READY   STATUS      AGE
attacker                                1/1     Running     38m
brute-forcer                            1/1     Running     38m
cred-stealer                            1/1     Running     38m
critical-app-5776fdb957-dfxqr           1/1     Running     38m
dind-escape                             1/1     Running     38m
monitoring-agent-775b8dc8d4-rd7fv       1/1     Running     38m  ← S35 挖礦偽裝
privileged-pod                          1/1     Running     38m
...

踩坑 #3:bitnami/kubectl:1.30 not found
Bitnami 的映像 tag 命名規則變更,1.30 已不是有效 tag。解法:

sed -i 's|bitnami/kubectl:1.30|bitnami/kubectl:latest|g' scenarios/**/*.yaml

踩坑 #4:kube-system PodSecurity 限制
S22 偽裝 Pod 原本要部署到 kube-system(模擬真實攻擊),但 K8s 1.25+ 對 kube-system 啟用 PodSecurity Standards(Restricted level),Pod 會被立即刪除。解法是改部署到 koad namespace,在文章中說明真實攻擊的行為。

Step 6:部署防禦堆疊

Falco — Runtime 威脅偵測

Falco 是什麼? 雲原生的即時安全監控工具(CNCF 專案)。它在 Linux 核心層監聽系統呼叫(syscall)——容器內的任何動作(讀檔案、開 socket、執行指令)最終都要呼叫核心,Falco 就在那裡攔截並比對規則。偵測到異常就發告警,像大樓的監視器——不能阻止入侵,但第一時間通知你。

在本系列中,每次攻擊步驟旁邊的 Falco 觀察 就是 Falco 產生的告警。

# 主機終端
helm repo add falcosecurity https://falcosecurity.github.io/charts
helm repo update

helm install falco falcosecurity/falco \
  -n falco --create-namespace \
  -f defense/falco/values-custom.yaml

KOAD 的 Falco 配置重點:

  • driver: modern_ebpf——使用 eBPF 而非 kernel module,Docker-in-Docker 環境更穩定
  • Falcosidekick UI: 啟用,提供告警視覺化介面
  • 26 條自訂規則: 覆蓋容器逃逸、kubectl 執行、SA Token 讀取、挖礦偵測等場景

踩坑 #5:Falco chart v9 棄用 gRPC 設定
Falco 0.44+ 的 Helm chart 移除了 falco.grpcfalco.grpc_output 設定。如果你從舊版 values 複製過來,會遇到 template 錯誤。移除這兩個區塊即可。

踩坑 #6:rules_file 與 rules_files 衝突
Falco 0.44 使用 rules_files(複數),Helm chart 會自動設定。如果你在 values 裡又寫了 rules_file(單數),會因為兩者同時存在而報驗證錯誤。自訂規則改用 customRules 區塊。

踩坑 #7:inotify handler 初始化失敗
Minikube Docker driver 環境中,inotify 的 max_user_instances 受限。解法是在 values 中設定 watch_config_files: false,或在主機上 sudo sysctl -w fs.inotify.max_user_instances=1024

驗證 Falco 規則觸發:

$ kubectl logs -n falco -l app.kubernetes.io/name=falco --tail=5

{"rule":"KOAD S05 kubectl Execution in Container","priority":"Critical",...}
{"rule":"KOAD S26 SA Token Read","priority":"Warning",...}
{"rule":"KOAD S13 Privileged Container Started","priority":"Critical",...}

Kyverno — Kubernetes 原生策略引擎

Kyverno 是什麼? K8s 原生的 Policy-as-Code 引擎。當有人 kubectl apply 建立 Pod 時,Kyverno 在 API Server 前面攔截請求,檢查是否符合安全策略——像機場安檢門,不合規的 Pod 直接被拒絕(Enforce 模式)或記錄在案(Audit 模式)。KOAD 使用 Audit 模式,讓攻擊能執行但記錄違規。

# 主機終端
helm repo add kyverno https://kyverno.github.io/kyverno/
helm repo update

helm install kyverno kyverno/kyverno \
  -n kyverno --create-namespace

# 部署 KOAD 策略(Audit 模式)
kubectl apply -f defense/kyverno/policies.yaml

KOAD 的 7 條 Kyverno 策略(全部 Audit 模式,不阻擋,只記錄):

策略 偵測內容
koad-block-privileged 特權容器
koad-block-hostpath HostPath 掛載
koad-block-host-namespaces HostPID / HostNetwork / HostIPC
koad-require-trusted-registry 非信任映像來源
koad-require-run-as-nonroot Root 容器
koad-disable-automount-sa SA Token 自動掛載
koad-drop-capabilities 未刪除的 Linux capabilities

為什麼用 Audit 而不是 Enforce?因為 KOAD 是攻防靶場——攻擊場景本身就是「違規」的。Audit 模式讓攻擊能正常執行,同時記錄所有違規事件,方便後續分析。

NetworkPolicy

# 主機終端
kubectl apply -f defense/network-policies/default-deny.yaml

部署 4 條策略:

  • default-deny-all:預設阻擋所有進出流量
  • allow-dns:允許 DNS 查詢
  • allow-ssrf-webapp-ingress:允許 SSRF webapp 的 ingress
  • block-metadata-api:阻擋 169.254.169.254 metadata API 存取

部署後驗證

全部部署完成後,確認以下指標:

# Pod 狀態
$ kubectl get pods -n koad | grep -c Running
37

# Falco
$ kubectl get pods -n falco
falco-xxxxx                 2/2   Running
falco-falcosidekick-xxxxx   1/1   Running

# Kyverno
$ kubectl get cpol | head -5
NAME                             ADMISSION   BACKGROUND   READY
koad-block-host-namespaces       true        true         True
koad-block-hostpath              true        true         True
koad-block-privileged            true        true         True
...

# NetworkPolicy
$ kubectl get networkpolicies -n koad
default-deny-all           ...
allow-dns                  ...

KOAD 靶場架構總覽

KOAD 靶場架構總覽


存取靶場服務

服務 存取方式 埠號
SSRF Webapp minikube service ssrf-webapp -n koad --url 30080
Jupyter Notebook minikube service jupyter-insecure -n koad --url 30088
K8s Dashboard(假) minikube service kube-dashboard -n koad --url 30443
Private Registry minikube service private-registry -n koad-registry --url 30500
Falcosidekick UI kubectl port-forward svc/falco-falcosidekick-ui -n falco 2802 2802

磁碟空間管理

KOAD 拉取的映像 + 建構的容器會佔用大量磁碟空間。如果遇到 Docker is out of disk space

docker system df           # 檢查使用情況
docker system prune -a -f --volumes   # 清理未使用的映像

建議在部署前確保至少有 50 GB 可用空間。


清除靶場

# 清除所有 KOAD 資源
bash teardown.sh

# 完全刪除 Minikube 叢集
minikube delete

30 天文章導覽

天數 主題 類型
Day 1 ATT&CK 全景 + KOAD 部署 綜合
Day 2 三條入侵路徑:SSRF + 暴露服務 + 洩漏憑證 攻擊
Day 3 防禦初始存取:API Server 強化 + NetworkPolicy 防禦
Day 4 四種執行手法:Web Shell + kubectl + Pod + CronJob 攻擊
Day 5 防禦執行:Admission Control + RBAC 最小權限 防禦
Day 6 五種持久化:RBAC + SA + Sidecar + 映像 + StaticPod 攻擊
Day 7 防禦持久化:Audit Log + RBAC 監控 + 映像簽章 防禦
Day 8 逃逸第一式:Privileged mount device 攻擊
Day 9 逃逸第二、三式:Cgroup + lxcfs 攻擊
Day 10 逃逸第四、五式:Docker.sock + /proc core_pattern 攻擊
Day 11 逃逸第六式 + 核心 CVE:SYS_PTRACE + Dirty Pipe 攻擊
Day 12 防禦逃逸(上):PSS + seccomp + AppArmor 防禦
Day 13 防禦逃逸(下):gVisor + 容器不變性 防禦
Day 14 隱匿三連:偽裝 + 清痕 + 建映像 攻擊
Day 15 防禦破壞:停用 Falco + 竄改 Audit 攻擊
Day 16 三種憑證竊取:暴力破解 + Token + 明文 攻擊
Day 17 防禦憑證:etcd 加密 + Secret 管理 防禦
Day 18 偵察全攻略:資源列舉 + 網路掃描 + RBAC 探測 攻擊
Day 19 橫向移動:竊取 Token 跨 Namespace 攻擊
Day 20 五種破壞:資料銷毀 + DoS + 挖礦 攻擊
Day 21 防禦影響:ResourceQuota + PDB + 備份 防禦
Day 22 供應鏈攻擊:映像藏密 + Registry + CI/CD 攻擊
Day 23 防禦供應鏈:簽章 + 掃描 + ImagePolicy 防禦
Day 24 KOAD Kill Chain:35 場景全自動攻擊 攻擊
Day 25 Falco 實戰:自訂規則覆蓋全 ATT&CK 防禦
Day 26 Falco Talon + Tetragon + Audit Log 防禦
Day 27 NetworkPolicy + Kyverno + CIS Benchmark 防禦
Day 28 KOAD 攻防矩陣:ATT&CK × D3FEND 對照 綜合
Day 29 Incident Response:當 Falco 告警響起 防禦
Day 30 KOAD 開源 +「資安這條路」的下一站 綜合

學習路線建議

不需要依序讀完 30 天。根據你的目標選擇路線:

路線 A:初學者快速上手(9 天)

Day 1 → 2 → 3 → 4 → 5 → 8 → 12 → 24 → 30

先建立攻防全景觀,體驗一條完整的攻擊鏈,再看防禦手段。跳過進階逃逸和隱匿手法。

路線 B:完整學習(30 天)

Day 1 → 2 → 3 → ... → 30(依序)

攻擊與防禦交替,每個戰術都有動手實作。適合想全面掌握 K8s 安全的讀者。

路線 C:CKS 考試準備(13 天)

Day 1 → 3 → 5 → 7 → 12 → 13 → 16 → 17 → 22 → 23 → 25 → 27 → 29

聚焦防禦側,涵蓋 CKS 六大領域:Cluster Setup、Hardening、System Hardening、Microservice、Supply Chain、Monitoring。

前置條件

天數 前置條件
Day 2-7 Day 1(環境部署)
Day 8-11 Day 4(需要理解 Execution 才懂逃逸)
Day 12-13 Day 8(需要理解逃逸才懂防禦)
Day 24 Day 1-23(Kill Chain 串聯所有戰術)
Day 28 Day 1(ATT&CK 矩陣)+ 至少完成一條攻擊路線
Day 29 Day 25(需要 Falco 基礎)

常見問題排除

症狀 原因 解法
Node 一直 NotReady Calico CNI 未啟動 kubectl get pods -n kube-system 等 Calico Pod Running
Pod ImagePullBackOff 自訂映像未建構 回到 Step 4 執行 minikube image build
Falco Pod CrashLoopBackOff values.yaml 格式錯誤 確認移除 falco.grpc 區塊、使用 rules_files
minikube start 失敗 Docker 未啟動或權限不足 sudo systemctl start docker && sudo usermod -aG docker $USER
磁碟空間不足 映像佔用空間 docker system prune -a -f --volumes 後重試

術語表

本系列常出現的術語快速參照:

英文 中文 一句話說明
Cluster 叢集 一組 Node 組成的 K8s 環境
Node 節點 叢集中的一台機器
Pod Pod K8s 最小部署單位
Container 容器 獨立運行的應用實體
Image 映像 容器的唯讀模板
Namespace 命名空間 叢集內的邏輯分區
RBAC 角色型存取控制 誰能做什麼
ServiceAccount (SA) 服務帳號 Pod 的身份
Secret 機密 敏感資料(預設只 Base64)
NetworkPolicy 網路策略 Pod 間的防火牆規則
CNI 容器網路介面 K8s 的網路插件標準
Syscall 系統呼叫 程式向核心請求服務的介面
Capabilities 能力 Linux 把 root 權限拆成的 38 個細項
Seccomp 安全計算模式 限制容器可用的 syscall
eBPF 擴展伯克利封包過濾器 Linux 核心內的可程式化框架(Falco 用它)
ATT&CK 對手戰術技術知識庫 MITRE 維護的攻擊知識庫
Kill Chain 殺傷鏈 攻擊從入侵到造成影響的完整路徑
PSS Pod 安全標準 K8s 內建的三級 Pod 安全基準(Privileged / Baseline / Restricted)
AppArmor 應用程式裝甲 Linux 核心的強制存取控制模組,限制程式能存取的檔案和能力
gVisor 應用程式核心 Google 開源的容器 sandbox runtime,用使用者空間核心攔截 syscall
Kyverno K8s 策略引擎 用 YAML 寫的 Admission Controller,驗證和變更 K8s 資源
Admission Controller 准入控制器 API Server 在寫入 etcd 前攔截請求的插件(驗證或變更)
CRD 自訂資源定義 擴展 K8s API 的機制,讓你定義自己的資源類型
Tetragon eBPF 安全觀測 Cilium 出品的 eBPF runtime 安全工具,可追蹤程序、檔案、網路行為
OCI 開放容器標準 容器映像和 runtime 的業界標準規範
CRI 容器 Runtime 介面 K8s 與容器 runtime(containerd / CRI-O)之間的標準介面
Namespace (Linux) Linux 命名空間 核心級隔離機制(PID / Network / Mount 等),容器隔離的基礎
cgroup 控制群組 Linux 核心的資源限制機制(CPU / 記憶體),也是容器逃逸的攻擊面

本日小結

完成度自我檢查

  • [ ] 能說出 ATT&CK Containers Matrix 的 10 個戰術名稱
  • [ ] Minikube 叢集已啟動且 Node Ready
  • [ ] 5 個 Namespace 已建立(koad / koad-attack / koad-defense / koad-registry / koad-production)
  • [ ] 35 個攻擊場景 Pod 大部分為 Running 狀態
  • [ ] Falco Pod 正常運行且有告警輸出
  • [ ] Kyverno 7 條策略已 Ready
  • [ ] NetworkPolicy 4 條策略已套用
  • [ ] 能存取 SSRF Webapp(minikube service ssrf-webapp -n koad --url

今日重點回顧

  1. ATT&CK Containers Matrix 全景——10 個戰術、28 個技術,每個技術都對應 KOAD 場景
  2. KOAD 靶場實際部署——35 場景 + Falco + Kyverno + NetworkPolicy,記錄 7 個踩坑

明天開始進入正題——Day 2 從 TA0001 Initial Access 開始,實際操作 SSRF 攻擊、kubelet 探測和 kubeconfig 洩漏三條入侵路徑。



下一篇
Day 2|三條入侵路徑:SSRF + 暴露服務 + 洩漏憑證
系列文
資安這條路:從攻擊者視角看 Kubernetes7
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言