Pod 安全策略(Pod Security Policies, PSP)

Pod 安全策略是 Kubernetes 中用于控制 Pod 创建和运行的安全机制,通过定义一组条件限制 Pod 的行为。尽管 Kubernetes 1.21 后 PSP 已被弃用,但替代方案(如 OPA Gatekeeper 或 Kyverno)仍遵循类似理念。

启用 Pod 安全策略 需在 API Server 启动参数中添加:

--enable-admission-plugins=PodSecurityPolicy

示例策略 限制容器以非 root 用户运行并禁止特权模式:

apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
  name: restricted
spec:
  privileged: false
  runAsUser:
    rule: MustRunAsNonRoot
  seLinux:
    rule: RunAsAny
  volumes:
  - 'configMap'
  - 'emptyDir'

网络策略(Network Policies)

网络策略通过定义规则控制 Pod 之间的网络通信,需配合支持 NetworkPolicy 的 CNI 插件(如 Calico、Cilium)。

默认拒绝所有入站流量
创建拒绝所有入站流量的默认策略:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny-ingress
spec:
  podSelector: {}
  policyTypes:
  - Ingress

允许特定命名空间的 Pod 访问
仅允许 monitoring 命名空间的 Pod 访问当前命名空间的 Pod:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-monitoring
spec:
  podSelector: {}
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          name: monitoring

替代 PSP 的方案

OPA Gatekeeper
使用约束模板定义策略,示例限制镜像仓库来源:

apiVersion: templates.gatekeeper.sh/v1beta1
kind: ConstraintTemplate
metadata:
  name: k8sallowedrepos
spec:
  crd:
    spec:
      names:
        kind: K8sAllowedRepos
      validation:
        openAPIV3Schema:
          properties:
            repos:
              type: array
              items:
                type: string
  targets:
    - target: admission.k8s.gatekeeper.sh
      rego: |
        package k8sallowedrepos
        violation[{"msg": msg}] {
          container := input.review.object.spec.containers[_]
          satisfied := [good | repo = input.parameters.repos[_] ; good = startswith(container.image, repo)]
          not any(satisfied)
          msg := sprintf("container <%v> has an invalid image repo <%v>, allowed repos are %v", [container.name, container.image, input.parameters.repos])
        }

Kyverno
通过声明式策略实现类似功能,示例要求资源添加 owner 标签:

apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: require-labels
spec:
  validationFailureAction: enforce
  rules:
  - name: check-for-owner-label
    match:
      resources:
        kinds:
        - Pod
    validate:
      message: "All pods must have an `owner` label."
      pattern:
        metadata:
          labels:
            owner: "?*"

关键实践建议

最小权限原则
所有策略应遵循最小权限原则,仅开放必要的访问权限。例如网络策略中精确指定源 Pod 和目标端口。

策略分层管理
结合集群级、命名空间级和资源级策略实现分层防护。使用 Kyverno 或 Gatekeeper 的 ClusterPolicy 定义全局规则,通过 NetworkPolicy 细化网络控制。

审计与监控
定期审查策略的实际效果,使用 kubectl audit 或 Falco 检测策略规避行为。网络策略可结合 Hubble(Cilium 的可观测性工具)可视化流量。

更多推荐