满足 Pod Security Restricted 安全规范
目录
功能概述使用场景前提条件理解 Restricted 标准操作步骤1. 配置 Tekton 为 init 容器添加安全上下文方案 A:通过 TektonPipeline 配置方案 B:通过 TektonConfig 配置2. 为自定义 Task 定义添加安全上下文3. 配置容器镜像使用非 root 用户操作结果使用策略执行工具故障排查内置 Tasks 与 Restricted 标准TaskRun 因容器用户错误失败TaskRun 因 "Forbidden: cannot set securityContext.capabilities" 失败Init 容器因权限错误失败了解更多功能概述
pod-security.kubernetes.io/enforce=restricted 标准是最严格的 Pod Security Standard,它强制执行当前 Pod 加固的最佳实践。当命名空间被标记为此标准时,该命名空间中创建的所有 Pod 必须符合严格的安全要求。
本指南说明如何配置 Tekton Pipelines 以满足 restricted 安全标准,确保您 Tasks 中的所有容器均能在受限命名空间中成功运行。
使用场景
- 在带有
pod-security.kubernetes.io/enforce=restricted标签的命名空间中运行Tekton Pipelines - 满足组织的安全合规性要求
- 提升 CI/CD 流水线的安全态势
- 在高度受监管的环境中运行工作负载
前提条件
- 通过
TektonPipeline或TektonConfigCR 安装了Tekton Pipelines - 您有权限修改
TektonPipeline或TektonConfig资源 - 您可以创建或编辑
Task定义 - 对于自定义镜像,您可以修改
Containerfiles并重新构建镜像
理解 Restricted 标准
pod-security.kubernetes.io/enforce=restricted 标准要求 Pod 中的三类容器均满足以下安全上下文配置:
- 普通容器 (
containers) - Init 容器 (
initContainers) - 临时容器 (
ephemeralContainers)
每个容器必须具备如下安全上下文配置:
配置说明:
操作步骤
1. 配置 Tekton 为 init 容器添加安全上下文
Tekton 会为其管理的每个 Pod 创建 init 容器。为满足 restricted 标准,您需要启用 Tekton 自动为这些 init 容器添加所需的安全上下文。
方案 A:通过 TektonPipeline 配置
如果您直接通过 TektonPipeline CR 管理 Tekton:
应用配置:
方案 B:通过 TektonConfig 配置
如果您通过 TektonConfig CR 管理 Tekton:
应用配置:
注意: 此配置更改会立即生效,无需重启
Tekton控制器。更改后创建的新TaskRuns和PipelineRuns会自动为 init 容器应用所需的安全上下文。
2. 为自定义 Task 定义添加安全上下文
对于自定义 Tasks(非平台提供的内置 Tasks),您需要显式为每个步骤添加安全上下文。
示例带安全上下文的 Task:
重要提示: 此步骤适用于自定义
Tasks。平台提供的内置Tasks(除buildah,详见故障排查部分)兼容这些安全约束,但其Task定义中未包含显式的securityContext配置,因为它们设计为支持多种安全上下文,而不仅限于 restricted 模式。
3. 配置容器镜像使用非 root 用户
容器镜像必须配置为以非 root 用户运行。用户必须使用数字 UID 指定,而非用户名。
在您的 Containerfile 中添加非 root 用户并设置为默认用户。以下是基于 Alpine 镜像的示例:
注意:
adduser命令语法因基础镜像而异。请参阅下方参考文档了解其他基础镜像的示例。
验证镜像配置:
有关调整 Containerfile 的详细指导,请参阅 Adjust Containerfile for Building Task-Compatible Custom Images。
操作结果
完成上述步骤后:
- Init 容器:
Tekton创建的 init 容器将自动符合restricted标准 - 自定义 Tasks:您的自定义
Task步骤将具备所需的安全上下文 - 容器镜像:镜像将以非 root 用户且权限最小化的方式运行
您可以通过在受限命名空间中创建 TaskRun 来验证合规性:
成功的 TaskRun 显示 SUCCEEDED 为 True,REASON 为 Succeeded,表示所有容器均已成功运行并满足所需的安全约束。
使用策略执行工具
为了实现更自动化的方式,您可以使用如 Kyverno 之类的策略执行工具,自动向所有容器注入所需的安全上下文。通过创建 Kyverno Policy(使用 apiVersion: kyverno.io/v1 和 kind: Policy),可以自动变更 Pods,添加必要的安全上下文配置。
更多信息请参见 Scenario 4: Specified Namespace Security Context Enforcement。
此方法免去为每个 Task 手动配置安全上下文,简化合规管理。
有关配置 Kyverno 策略的详细指导,请参考:
故障排查
内置 Tasks 与 Restricted 标准
平台提供的内置 Tasks 中,只有 buildah Task 无法在 restricted 标准下运行。原因是 buildah 需要提升权限以构建容器镜像。
buildah Task 需要如下安全上下文:
解决方案:
- 在使用
buildahTask的命名空间中使用baseline模式而非restricted模式(例如pod-security.kubernetes.io/enforce=baseline) - 探索其他容器镜像构建方法,可能具有不同的安全需求
TaskRun 因容器用户错误失败
您可能遇到以下错误之一:
- "container has runAsNonRoot and image will run as root" —— 容器镜像的
Containerfile中无USER指令(默认 root),或显式设置了USER 0或USER root - "container has runAsNonRoot and image has non-numeric user" —— 容器镜像使用了符号用户名(如
USER appuser)而非数字 UID
解决方案:
-
按步骤 3 所述,使用数字非 root 用户 ID 重新构建镜像。例如,使用
USER 65532替代USER appuser或USER root。 -
在
Task的securityContext中指定用户: -
在
TaskRun的podTemplate中指定用户:
注意:
podTemplate.securityContext设置 Pod 级别的安全上下文,所有容器会继承此配置,除非容器级别另行覆盖。
方案 2 和 3 适用于无法修改容器镜像的情况。
TaskRun 因 "Forbidden: cannot set securityContext.capabilities" 失败
当安全上下文尝试添加能力的同时又丢弃所有能力时,会出现此错误。
解决方案: 确保您的 Task 不添加任何能力,仅如示例中那样丢弃能力。
Init 容器因权限错误失败
如果启用 set-security-context: true 后 init 容器出现权限错误,请检查:
- 命名空间是否有合适的安全策略
Tekton使用的容器镜像是否配置为非 root 用户运行Tekton安装版本是否为最新