IBM Cloud Docs
Pod 安全许可

Pod 安全许可

Pod 安全许可实现限制 pod 行为的 Kubernetes pod 安全标准,为违反为相关名称空间配置的 pod 安全概要文件策略的 pod 提供警告消息和 kube-apiserver 审计事件。

IBM Cloud Kubernetes Service V 1.25 和更高版本包含对 Kubernetes pod 安全许可的支持。 有关更多信息,请参阅 Kubernetes 文档中的 Pod 安全许可Pod 安全标准

IBM Cloud Kubernetes Service 1.25 及更高版本始终启用 Pod Security Admission。 Kubernetes 的早期版本使用 pod 安全策略。

了解安全概要文件

Kubernetes pod 安全标准定义以下三个概要文件。

特权
缺省 pod 安全配置全局实施 privileged Kubernetes pod 安全概要文件,该概要文件不受限制,允许已知特权升级,并根据 restricted 概要文件设置的策略生成警告和审计事件。
基线
baseline 概要文件是防止已知特权升级的限制性概要文件。 允许缺省 (最少指定) Pod 配置。
受限制
restricted 概要文件受到严格限制,并且遵循当前 pod 强化最佳实践。

有关 pod 安全概要文件的更多信息,请参阅 Kubernetes 文档中的 概要文件详细信息

Pod 安全许可包含三种方式,用于定义在检测到潜在违例时控制平面执行的操作。

强制执行
策略违例导致 pod 被拒绝。
审计
策略违例会触发向审计日志中记录的事件添加审计注释,但在其他情况下是允许的。
warn
策略违例会触发面向用户的警告,但在其他情况下是允许的。

随着安全标准或概要文件实现更改以解决新功能,您可以配置 Pod 安全许可以使用特定版本的角色。 支持以下版本

  • Kubernetes major.minor 版本 (例如,v1.25)
  • latest

如果 Pod 安全准入对我来说不是正确的选择呢?

虽然始终启用 Pod 安全许可,但它可以是多个许可控制器之一。 您可以配置第三方 Kubernetes 许可控制器,以实现适合您用例的其他安全策略模型。

如果使用 privileged 概要文件配置 Pod 安全许可以实施,警告和审计,那么控制平面将允许所有 pod 运行。 然后,您可以配置其他许可控制器以拒绝这些控制器。

只要不执行以下任一操作,就可以安装第三方许可控制器。

  • 它不会安装自己的 pod 安全策略 (PSP)。
  • 它不依赖于 PSP 来实施策略的某些部分。

配置 Pod 安全性许可名称空间标签

您可以定义要用于每个名称空间中的 pod 安全性的许可控制方式。 Kubernetes 定义一组标签,您可以设置这些标签以定义要用于名称空间的预定义 Pod 安全标准概要文件。 您选择的标签定义在检测到潜在违例时控制平面执行的操作。

缺省情况下,IBM Cloud Kubernetes Service 会将 privileged Pod 安全标签添加到以下名称空间。 使用 privileged 概要文件将这些名称空间标记为 enforceauditwarn

  • kube-system
  • ibm-system
  • ibm-operators
  • calico-system (V 1.29 和更高版本)
  • tigera-operator (V 1.29 和更高版本)
  • calico-apiserver (版本 ) 1.31

请勿除去或更改这些名称空间的标签。

可以对名称空间进行标记,以便为任何或所有 Pod 安全许可 modes 设置 pod 安全概要文件。

例如,除了使用 warnaudit 之外,您还可以使用 baseline 概要文件来标注名称空间以强制实施 privileged 概要文件。

此标签允许管理员和应用程序开发者通过仅查找针对 baseline 概要文件的警告和审计记录而不拒绝 pod 来执行应用程序。 然后,可以在将实施方式更改为 baseline 之前对工作负载进行必要的更改。

Pod 安全许可名称空间标签的格式为 pod-security.kubernetes.io/<MODE>: <LEVEL>pod-security.kubernetes.io/<MODE>-version: <VERSION>

  • pod-security.kubernetes.io/enforce
  • pod-security.kubernetes.io/enforce-version
  • pod-security.kubernetes.io/audit
  • pod-security.kubernetes.io/audit-version
  • pod-security.kubernetes.io/warn
  • pod-security.kubernetes.io/warn-version

要标注名称空间以强制实施 privileged 概要文件,并针对 baseline 概要文件的违例生成警告和审计事件,请使用以下标签。

  • pod-security.kubernetes.io/enforce: privileged
  • pod-security.kubernetes.io/enforce-version: latest
  • pod-security.kubernetes.io/audit: baseline
  • pod-security.kubernetes.io/audit-version: latest
  • pod-security.kubernetes.io/warn: baseline
  • pod-security.kubernetes.io/warn-version: latest

缺省 Pod 安全许可插件配置

缺省情况下,IBM Cloud Kubernetes Service 使用以下 PodSecurityConfiguration

apiVersion: pod-security.admission.config.k8s.io/v1
kind: PodSecurityConfiguration
defaults:
  enforce: "privileged"
  enforce-version: "latest"
  audit: "privileged"
  audit-version: "latest"
  warn: "privileged"
  warn-version: "latest"
exemptions:
  usernames: []
  runtimeClasses: []
  namespaces: []

定制 Pod 安全许可插件配置

集群范围的 Pod 安全许可插件配置针对所有没有 pod 安全标签或免除的名称空间设置 enforceauditwarn 行为。

对于 Kubernetes 1.24 集群,apiVersion 必须为 pod-security.admission.config.k8s.io/v1beta。 对于 1.25 和更高版本 pod-security.admission.config.k8s.io/v1 是首选,但仍可以使用 v1beta API 版本。

  1. 创建包含 PodSecurityConfiguration 资源的 YAML 文件。 您可以使用缺省配置来启动。

    apiVersion: pod-security.admission.config.k8s.io/v1
    kind: PodSecurityConfiguration
    defaults:
      enforce: "privileged"
      enforce-version: "latest"
      audit: "privileged"
      audit-version: "latest"
      warn: "privileged"
      warn-version: "latest"
    exemptions:
      usernames: []
      runtimeClasses: []
      namespaces: []
    
  2. 定制您想要使用的功能。 查看有关配置的每个部分的以下信息。

    defaults

    配置的 defaults 部分为没有 pod 安全标号的名称空间定义集群范围的缺省值。 这些字段可以具有与相应名称空间标签相同的值。

    exemptions

    配置的 exemptions 部分允许您创建由于与特定名称空间关联的策略而禁止的 pod。 豁免维度包括以下情况。

    • 用户名: 将忽略来自具有免除认证 (或模拟) 用户名的用户的请求。 用户名通常是 IAM 用户或服务帐户。 例如,usernames: [ "IAM#user@example.com" ]。 您还可以免除与 admin kubeconfig 客户机证书关联的用户名。 如果要指定 admin kubeconfig 证书,那么用户名是当前客户机证书的 CN 组件。

      kubectl config view --minify -o jsonpath='{.users[0].user.client-certificate}'
      /home/user/.bluemix/plugins/container-service/clusters/mycluster-cheku1620qbs90gq6mdg-admin/admin.pem
      

      在以下示例中,用户名为 IBMid-27000xxxxx-admin-2023-05-12。 如果您获得新的 admin kubeconfig,那么用户名可能不同。

      openssl x509 -in <client-certificate> -subject -noout`
      subject=C = US, ST = San Francisco, L = CA, O = ibm-admins, CN = IBMid-27000xxxxx-admin-2023-05-12
      
    • RuntimeClassNames:指定免责运行时类名称的 Pod 和工作负载资源将被忽略。

    • 名称空间: 忽略豁免名称空间中的 Pod 和工作负载资源。

  3. 保存定制 YAML 文件。

  4. 运行 ibmcloud ks cluster master pod-security set 命令。

    ibmcloud ks cluster master pod-security set --cluster CLUSTER --config-file CONFIG-FILE
    

运行 ibmcloud ks cluster master pod-security set 命令时,如果未指定配置文件,那么 pod 安全许可将重置为缺省配置。