4.15. 使用 git secret 验证管道

Git 机密由凭据组成,可以安全地与 Git 存储库交互,通常用于自动执行身份验证。在 Red Hat OpenShift Pipelines 中,您可以使用 Git secret 验证管道运行和在执行过程中与 Git 存储库交互的任务运行。

管道运行或任务运行通过关联的服务帐户获取对 secret 的访问权限。管道支持将 Git secret 用作基于基本身份验证和基于 SSH 的身份验证的注解(密钥值对)。

4.15.1. 凭证选择

管道运行或任务运行可能需要多次身份验证才能访问不同的 Git 存储库。使用 Pipelines 可以使用其凭证的域注解每个 secret。

Git secret 的凭证注解键必须以 tekton.dev/git- 开头,其值是您要管道使用该凭证的主机的 URL。

在以下示例中,Pipelines 使用 basic-auth secret(依赖于用户名和密码)访问位于 github.comgitlab.com 的存储库。

示例:用于基本身份验证的多个凭证

apiVersion: v1
kind: Secret
metadata:
  annotations:
    tekton.dev/git-0: github.com
    tekton.dev/git-1: gitlab.com
type: kubernetes.io/basic-auth
stringData:
  username: 1
  password: 2

1
软件仓库的用户名
2
存储库的密码或个人访问令牌

您还可以使用 ssh-auth secret(私钥)来访问 Git 存储库。

示例:用于基于 SSH 的身份验证的私钥

apiVersion: v1
kind: Secret
metadata:
  annotations:
    tekton.dev/git-0: https://github.com
type: kubernetes.io/ssh-auth
stringData:
  ssh-privatekey: 1

1
包含 SSH 私钥字符串的文件名称。

4.15.2. 为 Git 配置基本身份验证

管道若要从密码保护的存储库检索资源,您必须为该管道配置基本身份验证。

要为管道配置基本身份验证,请使用指定存储库的 Git secret 中的凭证更新 secret.yamlserviceaccount.yamlrun.yaml 文件。完成此过程后,Pipelines 可使用该信息来检索指定的管道资源。

注意

对于 GitHub,已弃用使用普通密码进行身份验证。而应使用个人访问令牌

流程

  1. secret.yaml 文件中,指定用户名和密码或 GitHub 个人访问令牌来访问目标 Git 存储库。

    apiVersion: v1
    kind: Secret
    metadata:
      name: basic-user-pass 1
      annotations:
        tekton.dev/git-0: https://github.com
    type: kubernetes.io/basic-auth
    stringData:
      username: 2
      password: 3
    1
    secret 的名称。在本例中,basic-user-pass
    2
    Git 存储库的用户名。
    3
    Git 存储库的密码。
  2. serviceaccount.yaml 文件中,将 secret 与适当的服务帐户关联。

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: build-bot 1
    secrets:
      - name: basic-user-pass 2
    1
    服务帐户的名称。在本例中,build-bot
    2
    secret 的名称。在本例中,basic-user-pass
  3. run.yaml 文件中,将服务帐户与任务运行或管道运行关联。

    • 将服务帐户与任务运行关联:

      apiVersion: tekton.dev/v1beta1
      kind: TaskRun
      metadata:
        name: build-push-task-run-2 1
      spec:
        serviceAccountName: build-bot 2
        taskRef:
          name: build-push 3
      1
      任务运行的名称。在本例中,build-push-task-run-2
      2
      服务帐户的名称。在本例中,build-bot
      3
      任务的名称。在本例中,build-push
    • 将服务帐户与 PipelineRun 资源关联:

      apiVersion: tekton.dev/v1beta1
      kind: PipelineRun
      metadata:
        name: demo-pipeline 1
        namespace: default
      spec:
        serviceAccountName: build-bot 2
        pipelineRef:
          name: demo-pipeline 3
      1
      管道运行的名称。在本例中,demo-pipeline
      2
      服务帐户的名称。在本例中,build-bot
      3
      管道的名称。在本例中,demo-pipeline
  4. 应用更改。

    $ oc apply --filename secret.yaml,serviceaccount.yaml,run.yaml

4.15.3. 为 Git 配置 SSH 身份验证

若要让管道从配置了 SSH 密钥的存储库检索资源,您必须为该管道配置基于 SSH 的身份验证。

要为管道配置基于 SSH 的身份验证,请使用指定存储库的 SSH 私钥中的凭证更新 secret.yamlserviceaccount.yamlrun.yaml 文件。完成此过程后,Pipelines 可使用该信息来检索指定的管道资源。

注意

考虑使用基于 SSH 的身份验证而不是基本身份验证。

流程

  1. 生成 SSH 私钥,或复制通常在 ~/.ssh/id_rsa 文件中提供的现有私钥。
  2. secret.yaml 文件中,将 ssh-privatekey 的值设置为 SSH 私钥文件的名称,并将 known_hosts 的值设置为已知主机文件的名称。

    apiVersion: v1
    kind: Secret
    metadata:
      name: ssh-key 1
      annotations:
        tekton.dev/git-0: github.com
    type: kubernetes.io/ssh-auth
    stringData:
      ssh-privatekey: 2
      known_hosts: 3
    1
    包含 SSH 私钥的机密的名称。在本例中,ssh-key
    2
    包含 SSH 私钥字符串的文件名称。
    3
    包含已知主机列表的文件名称。
    小心

    如果省略私钥,Pipelines 接受任何服务器的公钥。

  3. 可选: 要指定一个自定义 SSH 端口,请在 annotation 值的末尾添加 :<port number>.例如: tekton.dev/git-0: github.com:2222
  4. serviceaccount.yaml 文件中,将 ssh-key secret 与 build-bot 服务帐户关联。

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: build-bot 1
    secrets:
      - name: ssh-key 2
    1
    服务帐户的名称。在本例中,build-bot
    2
    包含 SSH 私钥的机密的名称。在本例中,ssh-key
  5. run.yaml 文件中,将服务帐户与任务运行或管道运行关联。

    • 将服务帐户与任务运行关联:

      apiVersion: tekton.dev/v1beta1
      kind: TaskRun
      metadata:
        name: build-push-task-run-2 1
      spec:
        serviceAccountName: build-bot 2
        taskRef:
          name: build-push 3
      1
      任务运行的名称。在本例中,build-push-task-run-2
      2
      服务帐户的名称。在本例中,build-bot
      3
      任务的名称。在本例中,build-push
    • 将服务帐户与管道运行关联:

      apiVersion: tekton.dev/v1beta1
      kind: PipelineRun
      metadata:
        name: demo-pipeline 1
        namespace: default
      spec:
        serviceAccountName: build-bot 2
        pipelineRef:
          name: demo-pipeline 3
      1
      管道运行的名称。在本例中,demo-pipeline
      2
      服务帐户的名称。在本例中,build-bot
      3
      管道的名称。在本例中,demo-pipeline
  6. 应用更改。

    $ oc apply --filename secret.yaml,serviceaccount.yaml,run.yaml

4.15.4. 在 git 类型任务中使用 SSH 身份验证

在调用 Git 命令时,您可以在任务的步骤中直接使用 SSH 身份验证。SSH 身份验证忽略 $HOME 变量,并且仅使用 /etc/passwd 文件中指定的用户主目录。因此,任务中的每个步骤都必须将 /tekton/home/.ssh 目录符号链接到相关用户的主目录。

但是,当您使用 git 类型的管道资源或 Tekton 目录中提供的 git-clone 任务时,不需要显式符号链接。

有关在 git 类型任务中使用 SSH 身份验证的示例,请参阅 authenticating-git-commands.yaml

4.15.5. 以非 root 用户身份使用 secret

在某些情况下,您可能需要将 secret 用作非 root 用户,例如:

  • 容器用于执行运行的用户和组由平台随机化。
  • 任务中的步骤定义非 root 安全性上下文。
  • 任务指定一个全局非 root 安全上下文,它应用到任务中的所有步骤。

在这种情况下,请考虑以非 root 用户身份运行任务和管道运行的以下方面:

  • Git 的 SSH 身份验证要求用户在 /etc/passwd 目录中配置有效的主目录。指定没有有效主目录的 UID 会导致身份验证失败。
  • SSH 身份验证会忽略 $HOME 环境变量。因此,您必须将由 Pipelines(/tekton/home) 定义的 $HOME 目录中的 secret 文件符号链接到非 root 用户的有效主目录。

此外,若要在非 root 安全上下文中配置 SSH 身份验证,请参阅对 git 命令进行身份验证的示例

4.15.6. 限制对特定步骤的 secret 访问

默认情况下,Pipelines 的 secret 存储在 $HOME/tekton/home 目录中,并可用于任务中的所有步骤。

要将 secret 限制为特定的步骤,请使用 secret 定义指定卷,并在特定步骤中挂载卷。