使用 PodSecurityPolicy

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

概览

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

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

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

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

准备工作

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

使用以下任一方法设定默认的 gcloud 设置:

  • 使用 gcloud init(如果您想要在系统引导下完成默认设置)。
  • 使用 gcloud config(如果您想单独设置项目 ID、区域和地区)。

使用 gcloud init

如果您收到 One of [--zone, --region] must be supplied: Please specify location 错误,请完成本部分。

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

    gcloud init

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

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

使用 gcloud config

  • 设置默认项目 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

定义 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
  seLinux:
    rule: RunAsAny
  supplementalGroups:
    rule: RunAsAny
  runAsUser:
    rule: RunAsAny
  fsGroup:
    rule: RunAsAny
  volumes:
  - '*'

PodSecurityPolicy 规范可以为众多控制项提供保障。此示例中指定的控制项 seLinuxsupplementalGroupsrunAsUserfsGroup 均设置为 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 的服务帐号。在这种情况下,为用户帐号授予权限是不够的。如需了解详情,请参阅进行政策授权

后续步骤