默认 Pod 安全标准

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

版本门控

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

Pod 安全标准

从 Kubernetes 版本 v1.25.0 开始,Pod 安全策略 (PSP) 已从 Kubernetes 中完全移除,并由 Pod 安全准入 (PSA) 取代。默认的 Pod 安全准入配置文件将在集群启动时添加,内容如下:

如果使用 profile: cisprofile: cis-1.23 配置:

  • RKE2 将通过配置文件应用受限的 Pod 安全标准,该配置文件将在整个集群中强制执行 restricted 模式,kube-systemcis-operator-systemtigera-operator 名称空间除外,以确保系统 Pod 的成功运行。

如果没有 profile 配置:

  • RKE2 将通过配置文件应用不受限的 Pod 安全标准,该配置文件将在整个集群中强制执行 privileged 模式,允许集群中所有 Pod 完全不受限制。

RKE2 将把此配置文件放在 /etc/rancher/rke2/rke2-pss.yaml,配置文件的内容根据您启动 RKE2 时选择的 cis 模式而有所不同:

  • CIS 模式

    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"
          audit: "restricted"
          audit-version: "latest"
          warn: "restricted"
          warn-version: "latest"
        exemptions:
          usernames: []
          runtimeClasses: []
          namespaces: [kube-system, compliance-operator-system, tigera-operator]
  • 非 CIS 模式

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

放置此配置文件后,RKE2 将使用以下标志 --admission-control-config-file 启动 kube-apiserver,该标志将设置为 PSA 配置文件的路径。

如果您想覆盖默认的 Pod 安全标准配置文件,可以将 pod-security-admission-config-file: <path-to-custom-psa-config-file> 传递给 RKE2 配置文件。

网络策略

当 RKE2 使用 profile: cis-1.23 参数运行时,它将对 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