在 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:调整自定义镜像构建配置

前提条件

  • 具备重新构建镜像的访问权限和权限。

步骤

  1. 参考文档 Adjusting Containerfile for Task-Compatible Custom Images,修改 Containerfile 配置。
  2. 确保镜像中的应用程序可以在用户 65532 下正常运行。
  3. 为目录和文件设置适当的权限。

方案 2:调整应用程序配置

前提条件

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

步骤

  1. HOME 环境变量设置为权限足够的目录:

    # Set HOME environment variable to a temporary directory
    $ export HOME=$(mktemp -d)
    # Set git's safe.directory configuration
    $ git config --global --add safe.directory /workspace/source
  2. 使用应用程序参数指定配置文件的位置:

    # Use skopeo's --authfile parameter to specify the location of the authentication file
    $ skopeo --authfile /workspace/auth.json copy docker://${registry}/${image}:${tag} docker://${registry}/${image}:${tag}

方案 3:修改 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. 应用程序配置

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

相关内容