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

问题描述

在 Tekton 的 run-script Task 中使用自定义镜像时,可能会遇到文件权限不足的问题。此类情况通常发生在 Task 配置为以非 root 用户身份运行,而自定义镜像中的应用程序需要 root 权限才能正常运行,或者镜像中不存在 UID 为 65532 的非 root 用户。

错误表现

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

** Permission denied

根因分析

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

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

示例 Task 配置:

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

问题排查

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

  1. 验证镜像以 root 用户身份运行时是否存在权限不足:

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

    $ podman 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. 参考文档 Adjusting Containerfile for Task-Compatible Custom Images 修改 Containerfile 配置。
  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. 应用配置

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

相关内容