1. RBAC — 角色型存取控制
RBAC 控制誰(User、Group、ServiceAccount)可以對哪些資源(resources)執行什麼操作(verbs),在 namespace 或叢集範圍內。
RBAC Flow:
Subject (Who?) → Role/ClusterRole (What?) → RoleBinding (Links)
User "alice" Role "pod-reader" RoleBinding
ServiceAccount - get pods alice → pod-reader
Group "devs" - list pods (in namespace "dev")
- watch pods
| 物件 | 範圍 | 使用場景 |
|---|---|---|
| Role | Namespace | 單一 namespace 內的權限 |
| ClusterRole | Cluster-wide | 整個叢集的權限或非 namespace 資源(nodes) |
| RoleBinding | Namespace | 在單一 namespace 中將 Role 或 ClusterRole 指派給 Subject |
| ClusterRoleBinding | Cluster-wide | 在整個叢集中將 ClusterRole 指派給 Subject |
考試重點: 可以使用 RoleBinding 將 ClusterRole 綁定到特定 namespace——這是重用權限模板而不授予全叢集權限的方法。考試中經常出現!
2. ServiceAccount
每個 Pod 可以附加一個 ServiceAccount。ServiceAccount 的 Token 會自動掛載到 /var/run/secrets/kubernetes.io/serviceaccount/。Pod 使用此 Token 呼叫 Kubernetes API。
Default ServiceAccount flow:
Pod → ServiceAccount → RBAC Role → API Server
範例:Prometheus 需要讀取 Pod 指標:
ServiceAccount: prometheus-sa
ClusterRole: pod-metrics-reader (verbs: get, list, watch)
ClusterRoleBinding: prometheus-sa → pod-metrics-reader
3. Network Policy
預設情況下,叢集中所有 Pod 可以相互通訊。NetworkPolicy 允許根據 Pod 選擇器、Namespace 選擇器或 IP 區塊限制 ingress/egress 流量。
❌ Default (no NetworkPolicy): All pods talk to all pods
✅ With NetworkPolicy:
frontend → backend (allowed)
frontend → database (BLOCKED)
backend → database (allowed)
考試重點: NetworkPolicy 只有在 CNI 外掛支援時才有效(Calico、Cilium、Weave)。Flannel 不支援 NetworkPolicy。沒有 policy → 全部允許。有至少 1 個 policy → 被選中的 Pod 預設拒絕。
4. Pod Security Standards
Kubernetes 定義了 3 種 Pod Security Standards(自 v1.25 起取代 PodSecurityPolicy):
| 設定檔 | 限制程度 | 適用對象 |
|---|---|---|
| Privileged | 無限制 | 系統/基礎設施工作負載(kube-system) |
| Baseline | 防止明顯的權限提升 | 一般工作負載 |
| Restricted | 遵循最大強化標準 | 安全敏感應用 |
5. SecurityContext
SecurityContext 在 Pod 或 Container 層級設定安全組態:
| 安全設定 | 含義 |
|---|---|
runAsNonRoot: true | 容器不得以 UID 0 執行 |
runAsUser: 1000 | 以 UID 1000 執行容器 |
readOnlyRootFilesystem: true | 檔案系統唯讀(寫入需使用 volume) |
allowPrivilegeEscalation: false | 不允許程序提升權限 |
capabilities.drop: ["ALL"] | 移除所有 Linux capabilities |
6. 速查表
| 考試問題 | 答案 |
|---|---|
| Pod 需要呼叫 K8s API,用什麼? | ServiceAccount |
| 限制使用者在單一 namespace 的權限? | Role + RoleBinding |
| 限制 Pod 之間的網路流量? | NetworkPolicy |
| NetworkPolicy 需要什麼才能運作? | 支援的 CNI 外掛(Calico、Cilium) |
| Privileged → Restricted,Pod 安全需要? | Pod Security Admission |
7. 練習題
Q1: 應用 Pod 需要存取 Kubernetes API 以列出其 namespace 中的 Pod。叢集管理員應該建立什麼?
- A) 具有 ClusterRoleBinding 的 ClusterRole(所有 namespace)
- B) 具有 Role(list pods)和 RoleBinding 的 ServiceAccount ✓
- C) 用於 API Server 的 LoadBalancer 類型 Service
- D) 包含 API Server 憑證的 ConfigMap
解析:Pod 需要 ServiceAccount、授予其 namespace 中「list pods」的 Role,以及連結兩者的 RoleBinding。使用 ClusterRole 會過度授權整個叢集的存取權限。
Q2: 將 NetworkPolicy 套用到 Pod 後,規則未明確匹配的流量預設行為是什麼?
- A) 所有流量都被允許(預設允許)
- B) 流量被記錄但不被封鎖
- C) 匹配 Pod 選擇器的流量被拒絕;其他所有流量通過 ✓
- D) 所有進出 Pod 的流量都被拒絕
解析:一旦 NetworkPolicy 選擇了 Pod(透過 podSelector),該策略類型(ingress/egress)中未明確允許的所有流量都會被拒絕。未被選中的 Pod 不受影響,保持完全連接性。
Q3: 哪個 Pod Security Standard 設定檔應用於需要對主機進行特權存取的系統層級元件?
- A) Restricted
- B) Baseline
- C) Privileged ✓
- D) SystemAdmin
解析:Privileged 設定檔不對 Pod 施加任何限制,允許所有 capabilities。適用於系統/基礎設施元件。Baseline 防止已知的權限提升;Restricted 執行最大強化。