使用 PodSecurityPolicy


本页面介绍如何在 Google Kubernetes Engine 中使用 PodSecurityPolicy。

概览

PodSecurityPolicy 是您创建的一种准入控制器资源,用于验证有关在集群上创建和更新 Pod 的请求。PodSecurityPolicy 定义了一组条件,Pod 必须满足这些条件才能被集群接受;如果创建或更新 Pod 的请求不符合 PodSecurityPolicy 中的条件,则系统将拒绝该请求并返回错误。

要使用 PodSecurityPolicy,必须先创建并定义新的和更新后的 Pod 必须满足的政策。然后,必须启用 PodSecurityPolicy 准入控制器,它根据所定义的政策验证创建和更新 Pod 的请求。

当多个 PodSecurityPolicy 可用时,准入控制器将使用第一个成功验证的政策。政策按字母顺序排列,控制器优先使用不可变政策(不更改 Pod 的政策),其次才是可变政策。

PodSecurityPolicy 可以在运行 Kubernetes 1.8.6 或更高版本的 GKE 集群中使用。

准备工作

在开始之前,请确保您已执行以下任务:

  • 确保您已启用 Google Kubernetes Engine API。
  • 启用 Google Kubernetes Engine API
  • 确保您已安装 Cloud SDK
  • 使用以下方法之一为您的项目设置默认 gcloud 命令行工具设置:
    • 使用 gcloud init(如果您想要在系统引导下完成项目默认设置)。
    • 使用 gcloud config(如果您想要单独设置项目 ID、可用区和区域。

    gcloud init

    1. 运行 gcloud init 并按照说明操作:

      gcloud init

      如果您要在远程服务器上使用 SSH,请使用 --console-only 标志来防止命令启动浏览器:

      gcloud init --console-only
    2. 按照说明授权 gcloud 工具使用您的 Google Cloud 帐号。
    3. 创建新配置或选择现有配置。
    4. 选择 Google Cloud 项目。
    5. 选择默认的 Compute Engine 可用区
    6. 选择默认的 Compute Engine 区域

    gcloud config

    1. 设置默认项目 ID
      gcloud config set project PROJECT_ID
    2. 设置默认的 Compute Engine 区域(例如 us-central1):
      gcloud config set compute/region COMPUTE_REGION
    3. 设置默认的 Compute Engine 可用区(例如 us-central1-c):
      gcloud config set compute/zone COMPUTE_ZONE
    4. gcloud 更新到最新版本:
      gcloud components update

    通过设置默认位置,您可以避免 gcloud 工具中出现以下错误:One of [--zone, --region] must be supplied: Please specify location

定义 PodSecurityPolicy

您需要先在集群中定义 PodSecurityPolicy 资源,然后 PodSecurityPolicy 控制器才能验证 Pod 并允许其进入集群。

PodSecurityPolicy 指定一个列表,其中包含针对在此策略下创建的 Pod 的限制、要求和默认值。例如,限制特权容器、hostPath 卷和主机网络的使用,或者让所有容器默认通过 seccomp 配置文件运行。PodSecurityPolicy 准入控制器根据可用的 PodSecurityPolicy 验证请求。

以下示例 PodSecurityPolicy my-psp.yaml 会阻止创建特权 Pod。该政策还影响其他几个控制项,例如允许访问所有可用卷:

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

PodSecurityPolicy 规范可以为众多控制项提供保障。此示例中指定的控制项 supplementalGroupsrunAsUserfsGroup 均设置为 RunAsAny,表示这些字段的所有有效值均可以与此政策结合使用。

如需详细了解 PodSecurityPolicy 及其控制项,请参阅 Kubernetes 文档中的“什么是 Pod 安全政策?”政策参考

您可以使用 kubectl 命令行工具创建此资源:

kubectl apply -f my-psp.yaml

如需查看配置 PodSecurityPolicy 的更多示例,请参阅 Kubernetes 文档的 PodSecurityPolicy 页面上的示例

进行政策授权

具有 cluster-admin 角色的帐号可以使用基于角色的访问权限控制来创建 RoleClusterRole,以便为所需服务帐号授予对 PodSecurityPolicy 的访问权限。ClusterRole 可进行集群级授权,而 Role 则可在您定义的命名空间内进行授权

例如,以下 ClusterRole my-clusterrole.yaml 授予对 verb: use 所指示的 my-psp PodSecurityPolicy 的访问权限:

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

运行以下命令可创建 ClusterRole:

kubectl apply -f my-clusterrole.yaml

创建 Role(或 ClusterRole)之后,可创建 RoleBinding(或 ClusterRoleBinding)资源将其与所需服务帐号关联起来。

以下 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 且有一个 Pod 受到 PodSecurityPolicy 的约束,请创建有权使用 PodSecurityPolicy 的 RBAC Role 或 ClusterRole。然后将 Role 或 ClusterRole 绑定到 Pod 的服务帐号。在这种情况下,为用户帐号授予权限是不够的。如需了解详情,请参阅进行政策授权

后续步骤