跳转到内容

Kubernetes Pod安全策略

来自代码酷
Admin留言 | 贡献2025年5月1日 (四) 22:18的版本 (Page creation by admin bot)

(差异) ←上一版本 | 已核准修订 (差异) | 最后版本 (差异) | 下一版本→ (差异)

Kubernetes Pod安全策略[编辑 | 编辑源代码]

Pod安全策略(Pod Security Policies, PSP)是Kubernetes中用于控制Pod创建和运行的安全机制,通过定义一组规则来限制Pod的行为,从而增强集群的安全性。PSP可以防止用户运行特权容器、限制主机命名空间的使用、控制文件系统访问等。在Kubernetes 1.21版本后,PSP已被弃用,并逐步被Pod Security Admission取代,但在许多现有集群中仍广泛使用。

基本概念[编辑 | 编辑源代码]

Pod安全策略是一种集群级别的资源,定义了Pod必须满足的条件才能被调度到节点上。管理员可以创建多个PSP,并通过RBAC(基于角色的访问控制)将其分配给不同的用户或服务账户。

核心功能[编辑 | 编辑源代码]

  • 特权模式限制:禁止或允许容器以特权模式运行。
  • 主机命名空间隔离:限制Pod访问主机网络、PID或IPC命名空间。
  • 文件系统限制:控制卷挂载、只读根文件系统等。
  • 用户和组ID控制:指定容器运行时的用户和组ID范围。
  • 能力(Capabilities)管理:限制容器可以使用的Linux内核能力。

配置示例[编辑 | 编辑源代码]

以下是一个典型的Pod安全策略定义,限制Pod不能以特权模式运行,并强制使用只读根文件系统:

apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
  name: restricted-psp
spec:
  privileged: false
  allowPrivilegeEscalation: false
  requiredDropCapabilities:
    - ALL
  volumes:
    - 'configMap'
    - 'emptyDir'
    - 'secret'
  hostNetwork: false
  hostIPC: false
  hostPID: false
  runAsUser:
    rule: 'MustRunAsNonRoot'
  seLinux:
    rule: 'RunAsAny'
  supplementalGroups:
    rule: 'MustRunAs'
    ranges:
      - min: 1
        max: 65535
  fsGroup:
    rule: 'MustRunAs'
    ranges:
      - min: 1
        max: 65535
  readOnlyRootFilesystem: true

策略绑定[编辑 | 编辑源代码]

创建PSP后,需要通过ClusterRole和ClusterRoleBinding将其绑定到用户或组:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: psp-restricted
rules:
- apiGroups: ['policy']
  resources: ['podsecuritypolicies']
  verbs:     ['use']
  resourceNames:
  - restricted-psp

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: psp-restricted-binding
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: psp-restricted
subjects:
- kind: Group
  apiGroup: rbac.authorization.k8s.io
  name: system:authenticated

实际应用案例[编辑 | 编辑源代码]

场景:防止特权容器[编辑 | 编辑源代码]

在开发环境中,团队可能无意中部署了需要特权模式的Pod,这会带来安全风险。通过以下PSP可以阻止此类部署:

apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
  name: no-privilege
spec:
  privileged: false
  allowPrivilegeEscalation: false

当用户尝试创建特权Pod时,将收到错误:

Error creating: pods "privileged-pod" is forbidden: unable to validate against any pod security policy: [spec.containers[0].securityContext.privileged: Invalid value: true: Privileged containers are not allowed]

场景:限制主机网络访问[编辑 | 编辑源代码]

以下PSP阻止Pod使用主机网络,防止网络隔离被绕过:

apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
  name: no-host-network
spec:
  hostNetwork: false
  hostPorts:
    - min: 1
      max: 65535

迁移到Pod Security Admission[编辑 | 编辑源代码]

由于PSP已被弃用,Kubernetes推荐使用Pod Security Admission(PSA)作为替代。PSA通过准入控制器实现,支持三种模式:

  • enforce:拒绝不符合策略的Pod
  • audit:允许Pod创建但记录警告
  • warn:向用户显示警告但允许创建

示例PSA配置:

apiVersion: apiserver.config.k8s.io/v1
kind: AdmissionConfiguration
plugins:
- name: PodSecurity
  configuration:
    apiVersion: pod-security.admission.config.k8s.io/v1beta1
    kind: PodSecurityConfiguration
    defaults:
      enforce: "restricted"
      enforce-version: "latest"
    exemptions:
      usernames: []
      runtimeClasses: []
      namespaces: ["kube-system"]

最佳实践[编辑 | 编辑源代码]

1. 从最严格的策略开始,逐步放宽限制 2. 为不同团队或命名空间分配不同的PSP 3. 定期审计PSP使用情况 4. 计划迁移到Pod Security Admission 5. 结合网络策略(NetworkPolicy)实现深度防御

限制与注意事项[编辑 | 编辑源代码]

  • PSP需要启用PodSecurityPolicy准入控制器
  • 策略冲突时,Pod创建会被拒绝
  • 某些功能(如特定卷类型)可能需要放宽策略
  • PSP不影响已经运行的Pod

参见[编辑 | 编辑源代码]

通过合理配置Pod安全策略,可以显著提高Kubernetes集群的安全性,防止容器逃逸、权限提升等攻击。尽管PSP已被弃用,但其设计理念仍值得学习,并应用于新的安全机制中。