在 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. 参考 为 Task 兼容的自定义镜像调整 Containerfile 文档,修改 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. 删除 runAsNonRootrunAsUser 配置:

    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. 应用配置

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

相关内容