5.8. 遵守 pod 安全准入
Pod 安全准入 是 Kubernetes pod 安全标准的实现。Pod 安全准入 限制 pod 的行为。不遵循全局或命名空间级别定义的 pod 安全准入的 Pod 不会被接受到集群且无法运行。
如果 Operator 项目不需要升级的权限才能运行,您可以确保您的工作负载在将命名空间设置为 restricted
pod 安全级别。如果 Operator 项目需要升级的权限才能运行,您必须设置以下安全上下文配置:
- Operator 命名空间允许的 pod 安全准入级别
- 工作负载服务帐户允许的安全性上下文约束 (SCC)
如需更多信息,请参阅 了解和管理 pod 安全准入。
红帽支持的 Operator SDK CLI 工具版本,包括 Operator 项目的相关构建和测试工具已被弃用,计划在以后的 OpenShift Dedicated 发行版本中删除。红帽将在当前发行生命周期中提供对这个功能的程序错误修复和支持,但此功能将不再获得改进,并将在以后的 OpenShift Dedicated 版本中删除。
对于创建新 Operator 项目,不建议使用红帽支持的 Operator SDK 版本。现有 Operator 项目的 Operator 作者可使用 OpenShift Dedicated 4 发布的 Operator SDK CLI 工具版本来维护其项目,并创建针对较新版本的 OpenShift Dedicated 的 Operator 发行版本。
以下与 Operator 项目相关的基础镜像 没有被弃用。这些基础镜像的运行时功能和配置 API 仍然会有程序错误修复和并提供对相关 CVE 的解决方案。
- 基于 Ansible 的 Operator 项目的基础镜像
- 基于 Helm 的 Operator 项目的基础镜像
有关 Operator SDK 不支持的、社区维护版本的信息,请参阅 Operator SDK (Operator Framework)。
5.8.1. 关于 pod 安全准入
OpenShift Dedicated 包括 Kubernetes pod 安全准入。不遵循全局或命名空间级别定义的 pod 安全准入的 Pod 不会被接受到集群且无法运行。
在全局范围内,会强制 privileged
配置集,restricted
配置集用于警告和审核。
您还可以在命名空间级别配置 pod 安全准入设置。
不要在默认项目中运行工作负载或共享对默认项目的访问权限。为运行核心集群组件保留默认项目。
以下默认项目被视为具有高度特权:default
, kube-public
, kube-system
, openshift
, openshift-infra
, openshift-node
,其他系统创建的项目的标签 openshift.io/run-level
被设置为 0
或 1
。依赖于准入插件(如 pod 安全准入、安全性上下文约束、集群资源配额和镜像引用解析)的功能无法在高特权项目中工作。
5.8.1.1. Pod 安全准入模式
您可以为命名空间配置以下 pod 安全准入模式:
模式 | 标签 | 描述 |
---|---|---|
|
| 如果 pod 不符合集合配置集,则拒绝 pod 来自准入 |
|
| 如果 pod 不符合集合配置集,日志审计事件 |
|
| 如果 pod 不符合集合配置集,则会显示警告 |
5.8.1.2. Pod 安全准入配置集
您可以将每个 pod 安全准入模式设置为以下配置集之一:
profile | 描述 |
---|---|
| 最低限制策略;允许已知特权升级 |
| 最低限制策略;防止已知特权升级 |
| 最严格的策略;遵循当前的 pod 强化最佳实践 |
5.8.1.3. 特权命名空间
以下系统命名空间总是设置为 privileged
pod 安全准入配置集:
-
default
-
kube-public
-
kube-system
您无法更改这些特权命名空间的 pod 安全配置集。
5.8.2. 关于 pod 安全准入同步
除了全局 pod 安全准入控制配置外,还存在一个控制器,它会根据给定命名空间中的服务帐户的 SCC 权限将 pod 安全准入控制 warn
和 audit
标签应用到命名空间。
控制器检查 ServiceAccount
对象权限,以便在每个命名空间中使用安全性上下文约束。安全性上下文约束 (SCC) 根据其字段值映射到 Pod 安全配置集,控制器使用这些翻译配置集。Pod 安全准入 warn
和 audit
标签被设置为命名空间中的最特权 pod 安全配置集,以防止在创建 pod 时显示警告和日志记录审计事件。
命名空间标签基于对命名空间本地服务帐户权限的考虑。
直接应用 pod 可能会使用运行 Pod 的用户的 SCC 特权。但是,在自动标记过程中不会考虑用户权限。
5.8.2.1. Pod 安全准入同步命名空间排除
在系统创建的命名空间中永久禁用 Pod 安全准入同步,openshift
Block 前缀的命名空间。
定义为集群有效负载一部分的命名空间会永久禁用 pod 安全准入同步。以下命名空间被永久禁用:
-
default
-
kube-node-lease
-
kube-system
-
kube-public
-
openshift
-
所有带有
openshift-
前缀的系统创建命名空间。
5.8.3. 确保 Operator 工作负载在命名空间中运行,设置为受限 pod 安全级别
为确保 Operator 项目可以在各种部署和环境中运行,请将 Operator 的工作负载配置为在命名空间中运行,设置为 restricted
pod 安全级别。
您必须将 runAsUser
字段留空。如果您的镜像需要特定用户,则无法在受限安全性上下文约束 (SCC) 和受限 Pod 安全强制下运行。
流程
要将 Operator 工作负载配置为在设置为
restricted
pod 安全级别的命名空间中运行,请编辑类似以下示例的 Operator 命名空间定义:重要建议您在 Operator 的命名空间定义中设置 seccomp 配置集。但是,OpenShift Dedicated. 4.10 不支持设置 seccomp 配置集。
对于必须在 OpenShift Dedicated 4.11 及之后的版本中运行的 Operator 项目,请编辑类似以下示例的 Operator 命名空间定义:
config/manager/manager.yaml
文件示例... spec: securityContext: seccompProfile: type: RuntimeDefault 1 runAsNonRoot: true containers: - name: <operator_workload_container> securityContext: allowPrivilegeEscalation: false capabilities: drop: - ALL ...
- 1
- 通过将 seccomp 配置集类型设置为
RuntimeDefault
,SCC 默认为命名空间的 pod 安全配置集。
对于必须在 OpenShift Dedicated 4.10 中运行的 Operator 项目,请编辑类似以下示例的 Operator 命名空间定义:
config/manager/manager.yaml
文件示例... spec: securityContext: 1 runAsNonRoot: true containers: - name: <operator_workload_container> securityContext: allowPrivilegeEscalation: false capabilities: drop: - ALL ...
- 1
- 不设置 seccomp 配置集类型可确保您的 Operator 项目可以在 OpenShift Dedicated. 4.10 中运行。
其他资源
5.8.4. 为需要升级权限的 Operator 工作负载管理 pod 安全准入
如果 Operator 项目需要升级的权限才能运行,您必须编辑 Operator 的集群服务版本 (CSV)。
流程
将安全上下文配置设置为 Operator CSV 中所需的权限级别,如下例所示:
具有网络管理员特权的
<operator_name>.clusterserviceversion.yaml
文件示例... containers: - name: my-container securityContext: allowPrivilegeEscalation: false capabilities: add: - "NET_ADMIN" ...
设置服务帐户权限,允许 Operator 工作负载使用所需的安全性上下文约束 (SCC),如下例所示:
<operator_name>.clusterserviceversion.yaml
文件示例... install: spec: clusterPermissions: - rules: - apiGroups: - security.openshift.io resourceNames: - privileged resources: - securitycontextconstraints verbs: - use serviceAccountName: default ...
编辑 Operator 的 CSV 描述,以说明 Operator 项目需要升级的权限,如下例所示:
<operator_name>.clusterserviceversion.yaml
文件示例... spec: apiservicedefinitions:{} ... description: The <operator_name> requires a privileged pod security admission label set on the Operator's namespace. The Operator's agents require escalated permissions to restart the node if the node needs remediation.