使用限制条件来实施 Pod 安全措施

本主题说明了如何使用政策控制器限制条件来实现许多与 PodSecurityPolicies 相同的保护,以及在执行政策前测试政策的附加功能。本主题中的示例并未涵盖所有相关的限制条件,而是说明了如何入门。

准备工作

在 Anthos Config Management 中注册的任一集群上安装政策控制器。确保启用限制条件模板库

Gatekeeper 项目代码库的 pod-security-policy 目录中提供了本主题中讨论的限制条件和限制条件模板的源代码。每个限制条件模板也包括单元测试。

阻止 Pod 运行特权容器

PodSecurityPolicies 的主题中的示例阻止 Pod 运行特权容器。推荐这样做是因为特权容器可能会影响节点上的主机操作系统或节点上运行的其他工作负载。

此限制条件使用 K8sPSPPrivilegedContainer 限制条件模板重新实现相同的限制:

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sPSPPrivilegedContainer
metadata:
  name: psp-privileged-container
spec:
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Pod"]

容器上需要一个只读根文件系统

默认情况下,容器可以写入其根文件系统。除了安全问题外,由于容器可写层中的写入延迟,这可能会导致性能瓶颈。您可以使用 PodSecurityPolicy 或使用限制条件在容器上要求只读根文件系统。此限制条件使用 K8sPSPReadOnlyRootFilesystem 限制条件模板。

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sPSPReadOnlyRootFilesystem
metadata:
  name: psp-readonlyrootfilesystem
spec:
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Pod"]

限制容器可以装载的卷的类型

默认情况下,容器可以在集群上装载通过 Kubernetes API 注册的任何类型的卷。此限制条件使用 K8sPSPVolumeTypes 限制条件模板将容器限制为一组有界限的卷类型。

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sPSPVolumeTypes
metadata:
  name: psp-volume-types
spec:
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Pod"]
  parameters:
    volumes:
    # - "*" # * may be used to allow all volume types
    - configMap
    - emptyDir
    - projected
    - secret
    - downwardAPI
    - persistentVolumeClaim
    #- hostPath #required for allowedHostPaths
    - flexVolume #required for allowedFlexVolumes

审核结果

您可以使用 dryrun 强制措施来测试限制条件的有效性,而不会干扰活动工作负载。这将为您的政策生成审核结果,而不会主动屏蔽。如需了解详情,请参阅使用限制条件进行审核

后续步骤