默认 Pod 安全策略

本文档描述了 RKE2 如何配置 PodSecurityPoliciesNetworkPolicies 以确保默认安全,同时为操作员提供最大的配置灵活性。

版本门控

本文档适用于 RKE2 v1.24 及更早版本,请参阅 Pod 安全标准文档 以获取 RKE2 v1.25 及更高版本的默认策略信息。

Pod 安全策略

RKE2 可以在有或没有 profile: cis-1.6 配置参数的情况下运行。这将导致它在启动时应用不同的 PodSecurityPolicies (PSPs)。

  • 如果使用 cis-1.6 控制文件运行,RKE2 将对所有名称空间应用一个名为 global-restricted-psp 的限制性策略,除了 kube-systemkube-system 名称空间需要一个名为 system-unrestricted-psp 的不太限制的策略,以便启动关键组件。

  • 如果在没有 cis-1.6 控制文件的情况下运行,RKE2 将应用一个完全不受限制的策略,称为 global-unrestricted-psp,这相当于在没有启用 PSP 准入控制器的情况下运行。

RKE2 将在初始启动时实施这些策略,但之后不会修改它们,除非由集群操作员明确触发,如下所述。这样可以让操作员完全控制 PSP,而不受 RKE2 默认设置的干扰。

PSP 的创建和应用由 kube-system 名称空间上某些注释的存在或缺失来控制。这些直接映射到可以创建的 PSP,具体如下:

  • psp.rke2.io/global-restricted

  • psp.rke2.io/system-unrestricted

  • psp.rke2.io/global-unrestricted

在启动时,对策略及其注释执行以下逻辑:

  • 如果注释存在,RKE2 将继续而不采取进一步行动。

  • 如果注释不存在,RKE2 将检查关联的策略是否存在,如果存在,则删除并重新创建它,同时将注释添加到名称空间。

  • global-unrestricted-psp 的情况下,策略不会被重新创建。这是为了在 CIS 和非 CIS 模式之间移动时,不使集群的安全性降低。

  • 在创建策略时,还会创建集群角色和集群角色绑定,以确保默认情况下使用适当的策略。

因此,在初始启动后,操作员可以修改或删除 RKE2 的策略,RKE2 将尊重这些更改。此外,要 "重置" 策略,操作员只需从 kube-system 名称空间中删除相关注释并重启 RKE2。

以下是策略的概述,从最严格的 global-restricted PSP 开始。

apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
  name: global-restricted-psp
spec:
  privileged: false                # CIS - 5.2.1
  allowPrivilegeEscalation: false  # CIS - 5.2.5
  requiredDropCapabilities:        # CIS - 5.2.7/8/9
    - ALL
  volumes:
    - 'configMap'
    - 'emptyDir'
    - 'projected'
    - 'secret'
    - 'downwardAPI'
    - 'persistentVolumeClaim'
  hostNetwork: false               # CIS - 5.2.4
  hostIPC: false                   # CIS - 5.2.3
  hostPID: false                   # CIS - 5.2.2
  runAsUser:
    rule: 'MustRunAsNonRoot'       # CIS - 5.2.6
  seLinux:
    rule: 'RunAsAny'
  supplementalGroups:
    rule: 'MustRunAs'
    ranges:
      - min: 1
        max: 65535
  fsGroup:
    rule: 'MustRunAs'
    ranges:
      - min: 1
        max: 65535
  readOnlyRootFilesystem: false

如果 RKE2 在非 CIS 模式下启动,注释将像上面那样检查,但应用的 pod 安全策略是宽松的。请参见下文。

apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
  name: global-unrestricted-psp
spec:
  privileged: true
  allowPrivilegeEscalation: true
  allowedCapabilities:
  - '*'
  volumes:
  - '*'
  hostNetwork: true
  hostPorts:
  - min: 0
    max: 65535
  hostIPC: true
  hostPID: true
  runAsUser:
    rule: 'RunAsAny'
  seLinux:
    rule: 'RunAsAny'
  supplementalGroups:
    rule: 'RunAsAny'
  fsGroup:
    rule: 'RunAsAny'

在这两种情况下,都会应用 "系统无限制策略"。请参见下文。

apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
  name: system-unrestricted-psp
spec:
  privileged: true
  allowPrivilegeEscalation: true
  allowedCapabilities:
  - '*'
  volumes:
  - '*'
  hostNetwork: true
  hostPorts:
  - min: 0
    max: 65535
  hostIPC: true
  hostPID: true
  runAsUser:
    rule: 'RunAsAny'
  seLinux:
    rule: 'RunAsAny'
  supplementalGroups:
    rule: 'RunAsAny'
  fsGroup:
    rule: 'RunAsAny'

要查看当前在系统上部署的 pod 安全策略,请运行以下命令:

kubectl get psp -A

网络策略

当 RKE2 使用 profile: cis-1.6 参数运行时,它将对 kube-systemkube-publicdefault 名称空间应用 2 个网络策略,并应用相关注释。这些策略和注释与 PSP 的逻辑相同。启动时,将检查每个名称空间的注释是否存在,如果存在,RKE2 不会采取任何行动。如果注释不存在,RKE2 会检查策略是否存在,如果存在,则重新创建它。

应用的第一个策略是限制网络流量仅限于名称空间本身。请参见下文。

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  managedFields:
  - apiVersion: networking.k8s.io/v1
    fieldsType: FieldsV1
    fieldsV1:
      f:spec:
        f:ingress: {}
        f:policyTypes: {}
  name: default-network-policy
  namespace: default
spec:
  ingress:
  - from:
    - podSelector: {}
  podSelector: {}
  policyTypes:
  - Ingress

应用的第二个策略是针对 kube-system 名称空间,并允许 DNS 流量。请参见下文。

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  managedFields:
  - apiVersion: networking.k8s.io/v1
    fieldsV1:
      f:spec:
        f:ingress: {}
        f:podSelector:
          f:matchLabels:
        f:policyTypes: {}
  name: default-network-dns-policy
  namespace: kube-system
spec:
  ingress:
  - ports:
    - port: 53
      protocol: TCP
    - port: 53
      protocol: UDP
  podSelector:
    matchLabels:
  policyTypes:
  - Ingress

RKE2 将 default-network-policy 策略和 np.rke2.io 注释应用于所有内置名称空间。kube-system 名称空间还会应用 default-network-dns-policy 策略和 np.rke2.io/dns 注释。

要查看当前在系统上部署的网络策略,请运行以下命令:

kubectl get networkpolicies -A