在 run-script Task 中使用自定义镜像时遇到权限不够的问题

目录

问题描述

在 Tekton 的 run-script Task 中使用自定义镜像时,可能会遇到操作文件权限不够的问题。这种情况通常发生在 Task 配置了非 root 用户运行,而自定义镜像中的应用程序需要 root 权限才能正常执行,或者镜像中不存在编号为 65532 的非 root 用户。

错误表现

TaskRun 执行失败,Pod 日志中显示权限不足:

** Permission denied

根因分析

该问题通常由以下原因导致:

  1. run-script Task 中配置了 runAsUser: 65532,导致 Pod 强制以非 root 用户运行。
  2. 自定义镜像中的应用程序需要 root 权限才能执行某些操作,或者镜像中不存在编号为 65532 的非 root 用户。
  3. 应用程序尝试访问或修改无权限的目录或文件。

示例 Task 配置:

apiVersion: tekton.dev/v1
kind: Task
metadata:
  name: run-script
spec:
  steps:
    - name: run-script
      securityContext:
        runAsNonRoot: true
        # 这里会强制该 Task 以 65532 号用户运行,目前无其他配置可以覆盖该设置。
        runAsUser: 65532

问题排查

如果该问题仅在使用自定义镜像时出现,建议按以下步骤排查:

  1. 验证镜像本身在 root 用户下是否存在权限不足的问题:

    $ docker run -it --rm --user root ${registry} ${cmd}
  2. 检查应用程序是否允许用户 65532 访问特定目录或文件:

    $ docker run -it --rm --user 65532:65532 ${registry} ${cmd} ls -la /path/to/directory
  3. 检查 Task 的 securityContext 配置:

    $ kubectl get task run-script -o yaml | grep -E 'runAsUser|runAsNonRoot'

解决方案

方案一:调整自定义镜像构建配置

前提条件

  • 具备重新构建镜像的环境和权限

操作步骤

  1. 参考 调整 Dockerfile 构建适用于 Task 的自定义镜像 文档,调整 Dockerfile 的配置。
  2. 确保镜像中的应用程序能够以 65532 用户正常运行。
  3. 合理设置目录和文件的权限。

方案二:调整应用程序的配置

前提条件

  • 应用程序支持通过环境变量或参数调整配置

操作步骤

  1. 设置 HOME 环境变量指向有权限的目录:

    # 设置 HOME 环境变量为临时目录
    $ export HOME=$(mktemp -d)
    # 设置 git 的 safe.directory 配置
    $ git config --global --add safe.directory /workspace/source
  2. 使用应用程序的参数指定配置文件位置:

    # 使用 skopeo 的 --authfile 参数指定认证文件位置
    $ skopeo --authfile /workspace/auth.json copy docker://${registry}/${image}:${tag} docker://${registry}/${image}:${tag}

方案三:修改 Task 配置

前提条件

  • 具备修改 Task 的权限
  • 评估安全风险

操作步骤

  1. 移除 runAsNonRoot 及 runAsUser 配置:

    apiVersion: tekton.dev/v1
    kind: Task
    metadata:
      name: run-script
    spec:
      steps:
        - name: run-script
          securityContext:
            # runAsNonRoot: true
            # runAsUser: 65532
  2. 或者修改 runAsUser 为有权限的用户:

    apiVersion: tekton.dev/v1
    kind: Task
    metadata:
      name: run-script
    spec:
      steps:
        - name: run-script
          securityContext:
            # runAsNonRoot: true
            runAsUser: 0

预防措施

  1. 镜像构建

    • 优先使用非 root 用户构建镜像。
    • 统一使用 UID 65532 作为非 root 用户。
    • 确保应用程序能够以非 root 用户正常运行。
    • 合理设置目录和文件的权限。
  2. 权限管理

    • 遵循最小权限原则。
    • 提前规划好目录权限。
    • 定期审查权限配置。
    • 避免使用 root 用户运行容器。
  3. 应用程序配置

    • 使用环境变量或参数调整配置。
    • 避免硬编码文件路径。
    • 支持配置文件位置的自定义。

相关内容