使用 PodSecurityPolicies

本頁面說明如何在 Google Kubernetes Engine 中使用 PodSecurityPolicies。

總覽

PodSecurityPolicy 是一種由使用者建立的許可控制器資源,可驗證在叢集中建立與更新 pod 的要求。PodSecurityPolicy 會定義一組條件,pod 必須符合這些條件才會被叢集接受;如果要求建立或更新的 pod 不符合 PodSecurityPolicy 中的條件,系統就會拒絕要求,並傳回錯誤訊息。

如要使用 PodSecurityPolicy,您必須先建立及定義政策,且新的 pod 和更新的 pod 都必須符合相關政策。接著,您必須啟用 PodSecurityPolicy 許可控制器,以根據政策定義來驗證要建立與更新 pod 的要求。

有多個 PodSecurityPolicies 可用時,許可控制器會使用第一個驗證成功的政策。政策會按照字母順序排序,且控制器會優先使用非修改政策 (亦即,不變更 pod 的政策),而非修改政策。

PodSecurityPolicy 適用於執行 Kubernetes 1.8.6 以上版本的 GKE 叢集。

事前準備

如要準備這項工作,請執行下列步驟:

  • 確認您已啟用 Google Kubernetes Engine API。
  • 啟用 Google Kubernetes Engine API
  • 確認您已安裝 Cloud SDK
  • 設定預設的專案 ID
    gcloud config set project [PROJECT_ID]
  • 如果您使用區域叢集,請設定預設的運算區域
    gcloud config set compute/zone [COMPUTE_ZONE]
  • 如果您使用地區叢集,請設定預設的運算地區
    gcloud config set compute/region [COMPUTE_REGION]
  • gcloud 更新到最新版本:
    gcloud components update

定義 PodSecurityPolicies

您必須先在叢集中定義 PodSecurityPolicy 資源,PodSecurityPolicy 控制器才能驗證及接受 pod 加入叢集。

PodSecurityPolicies 會指定在政策中建立的 pod 限制、需求和預設值清單。範例包括禁止使用具有特殊權限的容器、hostPath 磁碟區和主機網路,或將所有容器預設為以 seccomp 設定檔執行。PodSecurityPolicy 許可控制器會根據可用的 PodSecurityPolicies 驗證要求。

下列範例 PodSecurityPolicy (my-psp.yaml) 只禁止建立具有特殊權限的 pod。本政策也會影響其他幾個控管規定,例如允許存取所有可用磁碟機:

apiVersion: extensions/v1beta1
kind: PodSecurityPolicy
metadata:
  name: my-psp
spec:
  privileged: false  # Prevents creation of privileged Pods
  seLinux:
    rule: RunAsAny
  supplementalGroups:
    rule: RunAsAny
  runAsUser:
    rule: RunAsAny
  fsGroup:
    rule: RunAsAny
  volumes:
  - '*'

PodSecurityPolicy 規格可以保護多項控管規定。本範例中指定的控管規定 (包含 seLinuxsupplementalGroupsrunAsUserfsGroup) 全都設為 RunAsAny,代表這些欄位的任何有效值都可以與這個政策搭配使用。

如要深入瞭解 PodSecurityPolicies 和控管規定,請參閱什麼是 pod 安全性政策? 以及 Kubernetes 說明文件中的政策參考資料

您可以使用 kubectl 指令列工具來建立本資源:

kubectl apply -f my-psp.yaml

如要查看更多設定 PodSecurityPolicies 的範例,請參閱 Kubernetes 說明文件中 PodSecurityPolicy 頁面上的範例

授權政策

具有叢集管理員角色的帳戶可以使用角色型存取權控管來建立 RoleClusterRole,將需要的服務帳戶存取權授予 PodSecurityPolicies。ClusterRole 可授予「全叢集」的權限,而 Role 可在您定義的「命名空間」中授予權限

舉例來說,下列 ClusterRole (my-clusterrole.yaml) 會將存取權授予 my-psp PodSecurityPolicy,如 verb: use 所示:

kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: my-clusterrole
rules:
- apiGroups:
  - extensions
  resources:
  - podsecuritypolicies
  resourceNames:
  - my-psp
  verbs:
  - use

如要建立 ClusterRole,請執行下列指令:

kubectl apply -f my-clusterrole.yaml

建立 Role (或 ClusterRole) 後,您可以建立 RoleBinding (或 ClusterRoleBinding) 資源,將 Role (或 ClusterRole) 與需要的服務帳戶建立關聯。

下列 RoleBinding (my-rolebinding.yaml) 會將 ClusterRole (my-clusterrole) 繫結到特定命名空間 (my-namespace) 中的服務帳戶:

# Bind the ClusterRole to the desired set of service accounts.
# Policies should typically be bound to service accounts in a namespace.
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: my-rolebinding
  namespace: my-namespace
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: my-clusterrole
subjects:
# Example: All service accounts in my-namespace
- apiGroup: rbac.authorization.k8s.io
  kind: Group
  name: system:serviceaccounts
# Example: A specific service account in my-namespace
- kind: ServiceAccount # Omit apiGroup
  name: default
  namespace: my-namespace

在這個 RoleBinding 中:

  • subjects 欄位會指定 ClusterRole 要繫結的帳戶。
  • 第一個主體是 Group (system:serviceaccounts),包含叢集中的所有服務帳戶。
  • 第二個主體是個別 ServiceAccount (default),會指定命名空間中的預設服務帳戶。

如要建立 RoleBinding,請執行下列指令:

kubectl apply -f my-rolebinding.yaml

如要深入瞭解 RBAC,請參閱使用 RBAC 授權

啟用 PodSecurityPolicy 控制器

如要使用 PodSecurityPolicy 許可控制器,您必須使用 --enable-pod-security-policy 標記來建立新叢集或更新現有叢集。

如要使用 PodSecurityPolicy 建立新叢集,請執行下列指令:

gcloud beta container clusters create [CLUSTER_NAME] --enable-pod-security-policy

如要更新現有叢集:

gcloud beta container clusters update [CLUSTER_NAME] --enable-pod-security-policy

停用 PodSecurityPolicy 控制器

如要停用 PodSecurityPolicy 控制器,請執行下列指令:

gcloud beta container clusters update [CLUSTER_NAME] --no-enable-pod-security-policy

停用控制器會導致叢集停止驗證及預設現有政策,但不會刪除這些政策,也不會刪除繫結。

使用 NetworkPolicy

如果您使用的是 NetworkPolicy,且您有須遵守 PodSecurityPolicy 的 pod,請建立一個有權限使用 PodSecurityPolicy 的 RBAC 角色或 ClusterRole。然後將角色或 ClusterRole 與 pod 的服務帳戶互相繫結。在這種情況下,授予權限給使用者帳戶的條件仍不足夠。詳情請參閱授權政策

後續步驟

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Kubernetes Engine 說明文件