Chuyển đến nội dung chính

第4課:RBAC 與 Kubernetes 安全

角色型存取控制(RBAC)、ServiceAccount、Network Policy、 Pod Security Standards 與 Security Context。Kubernetes 叢集安全。

RBAC 授權模型 — Subject、RoleBinding、Role、Rules

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
物件範圍使用場景
RoleNamespace單一 namespace 內的權限
ClusterRoleCluster-wide整個叢集的權限或非 namespace 資源(nodes)
RoleBindingNamespace在單一 namespace 中將 Role 或 ClusterRole 指派給 Subject
ClusterRoleBindingCluster-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 執行最大強化。